lestes::std::readable_dumper Class Reference

#include <dumper.hh>

Inheritance diagram for lestes::std::readable_dumper:

lestes::std::dumper_visitor lestes::std::object lestes::std::mem::keystone List of all members.

Public Types

typedef set< srp< object > > set_type

Public Member Functions

virtual void visit_object (ptr< object > o)
virtual void visit_nodump ()
virtual void visit_lint (lint i)
virtual void visit_ulint (ulint i)
virtual void visit_bool (bool i)
virtual void visit_lstring (const lstring &i)
virtual void visit_ucn_string (const ucn_string &i)

Static Public Member Functions

::std::ostream & dump (::std::ostream &output_to, ptr< object > start_at, bool respect_barriers=true)
 Dumps every instance reachable from start_at to given ostream. Returns given ostream.

Protected Member Functions

void gc_mark ()
 Marks the keystone.
void follow (ptr< object > o)
 readable_dumper (::std::ostream &a_stream, bool a_respect_barriers)

Private Attributes

srp< set_typevisited
::std::ostream & stream
ulint uid
 uid, set to zero on creation, only set on demand in uid_get
const bool respect_barriers
 should the dumper respect barriers (see object::dump_barrier)
bool after_barrier

Detailed Description

Definition at line 74 of file dumper.hh.


Member Typedef Documentation

typedef set< srp<object> > lestes::std::readable_dumper::set_type

Definition at line 92 of file dumper.hh.


Constructor & Destructor Documentation

lestes::std::readable_dumper::readable_dumper ( ::std::ostream &  a_stream,
bool  a_respect_barriers 
) [protected]

Definition at line 315 of file dumper.cc.

Referenced by dump().

00316         : dumper_visitor(), stream(a_stream), respect_barriers(a_respect_barriers)
00317 {}


Member Function Documentation

std::ostream & lestes::std::readable_dumper::dump ( ::std::ostream &  output_to,
ptr< object start_at,
bool  respect_barriers = true 
) [static]

Dumps every instance reachable from start_at to given ostream. Returns given ostream.

Definition at line 231 of file dumper.cc.

References lestes::std::set< Key, Compare >::create(), and readable_dumper().

00233 {
00234         ptr<readable_dumper> instance =
00235                 new readable_dumper( output_to, respect_barriers );
00236         instance->visited = set_type::create();
00237         instance->after_barrier = false;
00238         if (start_at) {
00239                 output_to << "<dump>" << endl;
00240                 start_at->accept_dumper_visitor(instance);
00241                 output_to << "</dump>" << endl;
00242         } else
00243                 output_to << "<null />" << endl;
00244         return output_to;
00245 }

void lestes::std::readable_dumper::visit_object ( ptr< object o  )  [virtual]

Implements lestes::std::dumper_visitor.

Definition at line 319 of file dumper.cc.

References after_barrier, follow(), and stream.

00320 {
00321         if (after_barrier)
00322                 stream << "<after-barrier />" << endl;
00323         else
00324                 follow(o);
00325 }

void lestes::std::readable_dumper::visit_nodump (  )  [virtual]

Implements lestes::std::dumper_visitor.

Definition at line 327 of file dumper.cc.

References stream.

00328 {
00329         stream << "<nondumpable />" << endl;
00330 }

void lestes::std::readable_dumper::visit_lint ( lint  i  )  [virtual]

Implements lestes::std::dumper_visitor.

Definition at line 332 of file dumper.cc.

References stream.

00333 {
00334         stream << "<lint>" << i << "</lint>" << endl;
00335 }

void lestes::std::readable_dumper::visit_ulint ( ulint  i  )  [virtual]

Implements lestes::std::dumper_visitor.

Definition at line 337 of file dumper.cc.

References stream.

00338 {
00339         stream << "<ulint>" << i << "</ulint>" << endl;
00340 }

void lestes::std::readable_dumper::visit_bool ( bool  i  )  [virtual]

Implements lestes::std::dumper_visitor.

Definition at line 342 of file dumper.cc.

References stream.

00343 {
00344         // ostream does not seem to support bool, it would cast to int or something
00345         stream << "<bool>" << (i ? "true" : "false") << "</bool>" << endl;
00346 }

void lestes::std::readable_dumper::visit_lstring ( const lstring i  )  [virtual]

Implements lestes::std::dumper_visitor.

Definition at line 348 of file dumper.cc.

References stream.

00349 {
00350         lstring tmp(i);
00351         lstring sought("<>&");
00352         lstring lt("&lt;");
00353         lstring gt("&gt;");
00354         lstring amp("&amp;");
00355         lstring::size_type mark = tmp.find_first_of(sought);
00356         if (mark != lstring::npos)
00357                 do {
00358                         switch (tmp[mark]) {
00359                         case '<':
00360                                 tmp.replace(mark, 1, lt);
00361                                 break;
00362                         case '>':
00363                                 tmp.replace(mark, 1, gt);
00364                                 break;
00365                         case '&':
00366                                 tmp.replace(mark, 1, amp);
00367                                 break;
00368                         }
00369                 } while ((mark = tmp.find_first_of(sought, mark+1)) != lstring::npos);
00370         stream << "<lstring>" << tmp << "</lstring>" << endl;
00371 }

void lestes::std::readable_dumper::visit_ucn_string ( const ucn_string i  )  [virtual]

Implements lestes::std::dumper_visitor.

Definition at line 373 of file dumper.cc.

References stream.

00374 {
00375         ucn_string tmp(i);
00376         ucn_string sought("\x3c\x3e\x26");
00377         ucn_string lt("\x26\x6c\x74\x3b");
00378         ucn_string gt("\x26\x67\x74\x3b");
00379         ucn_string amp("\x26\x61\x6d\x70\x3b");
00380         ucn_string::size_type mark = tmp.find_first_of(sought);
00381         if (mark != ucn_string::npos)
00382                 do {
00383                         switch (tmp[mark]) {
00384                         case 0x3c:
00385                                 tmp.replace(mark, 1, lt);
00386                                 break;
00387                         case 0x3e:
00388                                 tmp.replace(mark, 1, gt);
00389                                 break;
00390                         case 0x26:
00391                                 tmp.replace(mark, 1, amp);
00392                                 break;
00393                         }
00394                 } while ((mark = tmp.find_first_of(sought, mark+1)) != ucn_string::npos);
00395         stream << "<ucn_string>" << tmp << "</ucn_string>" << endl;
00396 }

void lestes::std::readable_dumper::gc_mark ( void   )  [protected, virtual]

Marks the keystone.

Marks all directly reachable parts of the class. The method must be overriden for each inherited class. It should contain abc.gc_mark() for each field abc of the inherited class and call to gc_mark() of the direct ancestor of the class. Does nothing for keystone, only stops processing of ancestors.

Reimplemented from lestes::std::mem::keystone.

Definition at line 247 of file dumper.cc.

References lestes::std::mem::keystone::gc_mark(), lestes::std::mem::simple_pointer::gc_mark(), and visited.

00248 {
00249         visited.gc_mark();
00250         dumper_visitor::gc_mark();
00251 }

void lestes::std::readable_dumper::follow ( ptr< object o  )  [protected]

Definition at line 253 of file dumper.cc.

References after_barrier, lassert, respect_barriers, stream, and visited.

Referenced by visit_object().

00254 {
00255         ptr<reflection_list> refls = o->reflection_get();
00256         lassert( refls );
00257 
00258         bool already_visited = !(visited->insert(o).second);
00259         if (already_visited) {
00260                 stream << '<' << refls->back()->name_get() << 
00261                         " idref=\"i_" << o->uid_get() << "\" />" << endl;
00262                 return;
00263         }
00264         stream << '<' << refls->back()->name_get() << " id=\"i_" << o->uid_get() << "\">" << endl;
00265 
00266         bool at_barrier = o->dump_barrier_get();
00267 
00268         ptr<field_list_list> fields = o->field_values_get();
00269         field_list_list::iterator field_it = fields->begin();
00270         for ( reflection_list::iterator refl_it = refls->begin();
00271                         refl_it != refls->end(); ++refl_it ) {
00272 
00273                 ptr<class_reflection::field_metadata_list> metadata =
00274                         (*refl_it)->field_metadata_get();
00275 
00276                 for (class_reflection::field_metadata_list::iterator
00277                                 meta_it = metadata->begin();
00278                                 meta_it != metadata->end();
00279                                 ++meta_it, ++field_it ) {
00280 
00281                         // we must not run out of fields
00282                         lassert( field_it != fields->end() );
00283 
00284                         ulint item_no = 0;
00285                         bool do_append_no = (*field_it)->size() > 1;
00286                         for (value_list::iterator val_it = (*field_it)->begin();
00287                                         val_it != (*field_it)->end(); ++val_it, ++item_no ) {
00288                                 stream << '<' << (*meta_it)->first;
00289                                 if (do_append_no)
00290                                         stream << item_no;
00291                                 stream << " type=\"" << (*meta_it)->second << "\""
00292                                         " origin=\"" << (*refl_it)->name_get() << "\">" <<
00293                                         endl;
00294                                 if (*val_it) {
00295                                         if (respect_barriers && at_barrier)
00296                                                 after_barrier = true;
00297                                         (*val_it)->accept_dumper_visitor(this);
00298                                         after_barrier = false;
00299                                 } else
00300                                         stream << "<null />" << endl;
00301                                 stream << "</" << (*meta_it)->first;
00302                                 if (do_append_no)
00303                                         stream << item_no;
00304                                 stream << '>' << endl;
00305                         }
00306                 }
00307         }
00308 
00309         // just an assert: there should not be any value lists left
00310         lassert( field_it == fields->end() );
00311 
00312         stream << "</" << refls->back()->name_get() << '>' << endl;
00313 }


Member Data Documentation

srp<set_type> lestes::std::readable_dumper::visited [private]

Definition at line 94 of file dumper.hh.

Referenced by follow(), and gc_mark().

::std::ostream& lestes::std::readable_dumper::stream [private]

Definition at line 95 of file dumper.hh.

Referenced by follow(), visit_bool(), visit_lint(), visit_lstring(), visit_nodump(), visit_object(), visit_ucn_string(), and visit_ulint().

ulint lestes::std::readable_dumper::uid [private]

uid, set to zero on creation, only set on demand in uid_get

Reimplemented from lestes::std::object.

Definition at line 96 of file dumper.hh.

const bool lestes::std::readable_dumper::respect_barriers [private]

should the dumper respect barriers (see object::dump_barrier)

Definition at line 98 of file dumper.hh.

Referenced by follow().

bool lestes::std::readable_dumper::after_barrier [private]

Definition at line 99 of file dumper.hh.

Referenced by follow(), and visit_object().


The documentation for this class was generated from the following files:
Generated on Mon Feb 12 18:25:55 2007 for lestes by doxygen 1.5.1-20070107