CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/CondCore/ORA/src/STLContainerHandler.h

Go to the documentation of this file.
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