00001 #ifndef INCLUDE_ORA_STLCONTAINERHANDLER_H 00002 #define INCLUDE_ORA_STLCONTAINERHANDLER_H 00003 00004 #include "IArrayHandler.h" 00005 // 00006 #include <memory> 00007 // externals 00008 #include "Reflex/Reflex.h" 00009 #include "Reflex/Builder/CollectionProxy.h" 00010 00011 namespace ora { 00012 00013 class STLContainerIteratorHandler : virtual public IArrayIteratorHandler { 00014 public: 00016 STLContainerIteratorHandler( const Reflex::Environ<long>& collEnv, 00017 Reflex::CollFuncTable& collProxy, 00018 const Reflex::Type& iteratorReturnType ); 00019 00021 ~STLContainerIteratorHandler(); 00022 00024 void increment(); 00025 00027 void* object(); 00028 00030 Reflex::Type& returnType(); 00031 00032 private: 00033 00035 Reflex::Type m_returnType; 00036 00038 Reflex::Environ<long> m_collEnv; 00039 00041 Reflex::CollFuncTable& m_collProxy; 00042 00044 void* m_currentElement; 00045 }; 00046 00047 00048 class STLContainerHandler : virtual public IArrayHandler { 00049 00050 public: 00052 explicit STLContainerHandler( const Reflex::Type& dictionary ); 00053 00055 ~STLContainerHandler(); 00056 00058 size_t size( const void* address ); 00059 00061 IArrayIteratorHandler* iterate( const void* address ); 00062 00064 void appendNewElement( void* address, void* data ); 00065 00067 void clear( const void* address ); 00068 00070 Reflex::Type& iteratorReturnType(); 00071 00073 bool isAssociative() const { return m_isAssociative; } 00074 00075 private: 00077 Reflex::Type m_type; 00078 00080 Reflex::Type m_iteratorReturnType; 00081 00083 bool m_isAssociative; 00084 00086 Reflex::Environ<long> m_collEnv; 00087 00089 std::auto_ptr<Reflex::CollFuncTable> m_collProxy; 00090 00091 }; 00092 00093 00094 class SpecialSTLContainerHandler : virtual public IArrayHandler { 00095 00096 public: 00098 explicit SpecialSTLContainerHandler( const Reflex::Type& dictionary ); 00099 00101 ~SpecialSTLContainerHandler(); 00102 00104 size_t size( const void* address ); 00105 00107 IArrayIteratorHandler* iterate( const void* address ); 00108 00110 void appendNewElement( void* address, void* data ); 00111 00113 void clear( const void* address ); 00114 00116 Reflex::Type& iteratorReturnType(); 00117 00118 private: 00120 std::auto_ptr<IArrayHandler> m_containerHandler; 00121 00123 int m_containerOffset; 00124 }; 00125 00126 00127 } 00128 00129 #endif