CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/CondCore/ORA/interface/QueryableVector.h

Go to the documentation of this file.
00001 #ifndef INCLUDE_ORA_QUERYABLEVECTOR_H
00002 #define INCLUDE_ORA_QUERYABLEVECTOR_H
00003 
00004 #include "QueryableVectorData.h"
00005 #include "Selection.h"
00006 
00007 namespace ora {
00008   
00009   template <typename Tp> class Range {
00010     public:
00011 
00012     typedef const Tp& const_reference;
00013     typedef CIterator<Tp> const_iterator;
00014     typedef CRIterator<Tp> const_reverse_iterator;
00015 
00016     public:
00017     Range();
00018 
00019     explicit Range(boost::shared_ptr<QueryableVectorData<Tp> >& data);
00020 
00021     Range(const Range& rhs);
00022 
00023     virtual ~Range();
00024 
00025     Range& operator=(const Range& rhs);
00026 
00027     const_iterator begin() const;
00028 
00029     const_iterator end() const;
00030 
00031     const_reverse_iterator rbegin() const;
00032 
00033     const_reverse_iterator rend() const;
00034 
00035     size_t size() const;
00036 
00037     size_t frontIndex() const;
00038 
00039     size_t backIndex() const;
00040       
00041     private:
00042 
00043     boost::shared_ptr<QueryableVectorData<Tp> > m_data;
00044   };
00045   
00046   template <typename Tp> class Query: public LoaderClient {
00047     public:
00048     explicit Query(boost::shared_ptr<IVectorLoader>& loader);
00049     
00050     virtual ~Query(){
00051     }
00052     
00053     template <typename Prim> void addSelection(const std::string& dataMemberName, SelectionItemType stype, Prim selectionData);
00054 
00055     size_t count();
00056     
00057     Range<Tp> execute();
00058 
00059     private:
00060     Selection m_selection;
00061   };
00062   
00063   template <typename Tp> class QueryableVector: public LoaderClient {
00064  
00065     public:
00066 
00067     // std::vector like typedefs
00068     typedef Tp& reference;
00069     typedef const Tp& const_reference;
00070     typedef Iterator<Tp> iterator;
00071     typedef CIterator<Tp> const_iterator;
00072     typedef RIterator<Tp> reverse_iterator;
00073     typedef CRIterator<Tp> const_reverse_iterator;
00074     typedef typename std::vector<Tp>::value_type value_type;
00075     // pool specific typedefs    
00076     typedef Query<Tp> pquery;
00077     typedef Range<Tp> prange;
00078     typedef typename QueryableVectorData<Tp>::store_item_type store_item_type;
00079     typedef typename QueryableVectorData<Tp>::store_base_type store_base_type;
00080     typedef typename QueryableVectorData<Tp>::store_type store_type;
00081 
00082     public:
00083     // default constructor
00084     QueryableVector();
00085     
00086     // constructor
00087     explicit QueryableVector(size_t n, const Tp& value=Tp());
00088     
00089     // copy constructor: not sure what to do...
00090     QueryableVector(const QueryableVector<Tp>& rhs);
00091 
00092     // destructor
00093     virtual ~QueryableVector();
00094 
00095     // assignment operator: not sure what to do...
00096     QueryableVector<Tp>& operator=(const QueryableVector<Tp>& rhs);
00097 
00098     public:
00099 
00100     Range<Tp> select(int startIndex, int endIndex=Selection::endOfRange) const;
00101     
00102     Range<Tp> select(const Selection& sel) const;
00103 
00104     Query<Tp> query() const;
00105     
00106     bool lock();
00107         
00108     bool isLocked() const;
00109 
00110     public:
00111     
00112     iterator begin();
00113 
00114     iterator end();
00115 
00116     const_iterator begin() const;
00117 
00118     const_iterator end() const;
00119 
00120     reverse_iterator rbegin();
00121     
00122     reverse_iterator rend();
00123     
00124     const_reverse_iterator rbegin() const;
00125     
00126     const_reverse_iterator rend() const;
00127 
00128     size_t size() const;
00129 
00130     size_t max_size() const;
00131     
00132     void resize(size_t n, const Tp& value=Tp());
00133     
00134     size_t capacity() const;
00135     
00136     bool empty() const;
00137     
00138     void reserve(size_t n);
00139 
00140     reference operator[] ( size_t n );
00141 
00142     const_reference operator[] ( size_t n ) const;
00143 
00144     reference at( size_t n );
00145 
00146     const_reference at( size_t n ) const;
00147     
00148     reference front ( );
00149     
00150     const_reference front ( ) const;
00151     
00152     reference back ( );
00153     
00154     const_reference back ( ) const;
00155 
00156     void assign ( size_t n, const Tp& u );
00157 
00158     void push_back ( const Tp& x );
00159 
00160     void pop_back ();
00161 
00162     void clear ( );
00163 
00164     void reset ( );
00165 
00166     // equals operator
00167     bool operator==(const QueryableVector& vec) const;
00168     
00169     bool operator!=(const QueryableVector& vec) const;
00170 
00171     public:
00172 
00173     // access to persistent size
00174     size_t persistentSize() const;
00175 
00176     const void* storageAddress() const;
00177 
00178     void load() const;
00179 
00180     private:
00181 
00182     void initialize() const;
00183 
00184     private:
00185 
00186     boost::shared_ptr<QueryableVectorData<Tp> > m_data;
00187     bool m_isLocked;
00188     mutable bool m_isLoaded;
00189 
00190 };
00191 
00192 }
00193 
00194 #include "QueryableVectorImpl.h"
00195 
00196 #endif