00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 #ifndef incREFLECT_OBJECT_VISITOR
00009 #define incREFLECT_OBJECT_VISITOR
00010 
00011 
00012 #include <vector>
00013 #include <string>
00014 #include "../common/object.hpp"
00015 #include "../common/visitable_object.hpp"
00016 #include "config.hpp"
00017 
00018 namespace ph {
00019 namespace reflect {
00020 
00021 class REFLECT_DECL get_composite_object_visitor : public ph::common::object_name_visitor
00022 
00023 
00024 
00025 {
00026 public:
00027         get_composite_object_visitor(const std::string &name) :
00028                 _name(name), _obj(0)
00029                         {};
00030                         
00031         ph::common::object_base *obj() { return _obj; }
00032         
00033         
00034         virtual bool visit(const ph::common::object_base *obj, const ph::common::nameable_object_base *name)
00035                 { return true; }
00036         virtual bool visit_composite(const ph::common::object_base *obj, const ph::common::nameable_object_base *name);
00037         
00038 private:
00039         std::string _name;
00040         ph::common::object_base *_obj;
00041 };
00042 
00043 class REFLECT_DECL get_object_visitor : public ph::common::object_name_visitor
00044 
00045 
00046 
00047 {
00048 public:
00049         get_object_visitor(const std::string &name, bool recurse=false) :
00050                 _name(name), _recurse(recurse), _obj(0)
00051                         {};
00052                         
00053         ph::common::object_base *obj() { return _obj; }
00054         
00055         
00056         virtual bool recurse() { return _recurse; }
00057         virtual bool visit(const ph::common::object_base *obj, const ph::common::nameable_object_base *name);
00058         virtual bool visit_composite(const ph::common::object_base *obj, const ph::common::nameable_object_base *name)
00059                 { return true; }
00060         
00061 private:
00062         std::string _name;
00063         bool        _recurse;
00064         ph::common::object_base *_obj;
00065 };
00066 
00067 class REFLECT_DECL get_object_with_type_visitor : public ph::common::object_name_visitor
00068 
00069 
00070 
00071 
00072 {
00073 public:
00074         get_object_with_type_visitor(const std::string &type, 
00075                 const std::string &name, bool recurse=false) :
00076                 _type(type), _name(name), _recurse(recurse), _obj(0)
00077                         {};
00078                         
00079         ph::common::object_base *obj() { return _obj; }
00080         
00081         
00082         virtual bool recurse() { return _recurse; }
00083         virtual bool visit(const ph::common::object_base *obj, const ph::common::nameable_object_base *name);
00084         virtual bool visit_composite(const ph::common::object_base *obj, const ph::common::nameable_object_base *name)
00085                 { return true; }
00086         
00087 private:
00088         std::string _type;
00089         std::string _name;
00090         bool        _recurse;
00091         ph::common::object_base *_obj;
00092 };
00093 
00094 class REFLECT_DECL get_nth_object_visitor : public ph::common::object_name_visitor
00095 
00096 
00097 
00098 
00099 
00100 {
00101 public:
00102         get_nth_object_visitor(long index) :
00103                 _index(index), _obj(0)
00104                         {};
00105                         
00106         ph::common::object_base *obj() { return _obj; }
00107         
00108         
00109         virtual bool visit(const ph::common::object_base *obj, const ph::common::nameable_object_base *name);
00110         virtual bool visit_composite(const ph::common::object_base *obj, const ph::common::nameable_object_base *name)
00111                 { return true; }
00112         
00113 private:
00114         int _index;
00115         ph::common::object_base *_obj;
00116 };
00117 
00118 class REFLECT_DECL dump_object_visitor : public ph::common::const_object_visitor
00119 
00120 
00121 
00122 {
00123 public:
00124         dump_object_visitor(std::ostream *stream, bool debug=false) :
00125                 _stream(stream), _debug(debug), _indent(0)
00126                         {};
00127         ~dump_object_visitor();
00128                 
00129         
00130         virtual bool recurse() { return true; }
00131         virtual bool visit(const ph::common::object_base *obj);
00132         virtual bool visit_composite(const ph::common::object_base *obj);
00133         
00134 private:
00135         std::ostream              *_stream;
00136         bool                       _debug;
00137         int                        _indent;
00138         std::vector<const ph::common::object_base *> _stack;
00139 
00140         void calc_indent(const ph::common::object_base *obj);
00141         void indent();
00142         void close_stack();
00143         void obj_out(const std::string &msg, const ph::common::object_base *obj);
00144 };
00145 
00146 }; 
00147 }; 
00148 
00149 #endif // incREFLECT_OBJECT_VISITOR