CMS 3D CMS Logo

CMSSW_4_4_3_patch1/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 "Selection.h"
00005 #include "PVector.h"
00006 // externals
00007 #include <boost/shared_ptr.hpp>
00008 
00009 namespace ora {
00010 
00011   class IVectorLoader {
00012     public:
00013 
00014     // destructor
00015     virtual ~IVectorLoader(){
00016     }
00017 
00018     public:
00019 
00020     // triggers the data loading
00021     virtual bool load(void* address) const=0;
00022 
00023     virtual bool loadSelection(const ora::Selection& selection, void* address) const=0;
00024 
00025     virtual size_t getSelectionCount( const ora::Selection& selection ) const=0;
00026 
00027     // invalidates the current loader. Called by the underlying service at his destruction time.
00028     virtual void invalidate()=0;
00029 
00030     // queries the validity of the current relation with the underlying storage system
00031     virtual bool isValid() const=0;
00032 
00033   };
00034   
00035   template <typename Tp> class RangeIterator {
00036     public:
00037     typedef typename std::vector<std::pair<size_t,Tp> >::const_iterator embedded_iterator;
00038 
00039     public:
00040     RangeIterator( embedded_iterator vectorIterator);
00041       
00042     RangeIterator( const RangeIterator& rhs );
00043 
00044     RangeIterator& operator=( const RangeIterator& rhs );
00045 
00046     virtual ~RangeIterator();
00047 
00048     bool operator==( const RangeIterator& rhs ) const;
00049 
00050     bool operator!=( const RangeIterator& rhs ) const;
00051 
00052     RangeIterator& operator++();
00053 
00054     RangeIterator operator++(int);
00055 
00056     RangeIterator operator+(int i);
00057 
00058     RangeIterator operator-(int i);
00059 
00060     size_t index() const;
00061 
00062     const Tp* operator->() const;
00063     const Tp& operator*() const;
00064 
00065     private:
00066     embedded_iterator m_vecIterator;
00067   };
00068 
00069   template <typename Tp> class RangeReverseIterator {
00070     public:
00071     typedef typename std::vector<std::pair<size_t,Tp> >::const_reverse_iterator embedded_iterator;
00072 
00073     public:
00074     RangeReverseIterator( embedded_iterator vectorIterator);
00075       
00076     RangeReverseIterator( const RangeReverseIterator& rhs );
00077 
00078     RangeReverseIterator& operator=( const RangeReverseIterator& rhs );
00079 
00080     virtual ~RangeReverseIterator();
00081 
00082     bool operator==( const RangeReverseIterator& rhs ) const;
00083 
00084     bool operator!=( const RangeReverseIterator& rhs ) const;
00085 
00086     RangeReverseIterator& operator++();
00087 
00088     RangeReverseIterator operator++(int);
00089 
00090     RangeReverseIterator operator+(int i);
00091 
00092     RangeReverseIterator operator-(int i);
00093 
00094     size_t index() const;
00095 
00096     const Tp* operator->() const;
00097     const Tp& operator*() const;
00098        
00099     private:
00100     embedded_iterator m_vecIterator;
00101   };
00102 
00103   template <typename Tp> class Range {
00104     public:
00105     typedef const Tp& reference;
00106     typedef RangeIterator<Tp> iterator;
00107     typedef RangeReverseIterator<Tp> reverse_iterator;
00108     typedef std::vector<std::pair<size_t,Tp> > store_base_type;
00109 
00110     public:
00111     Range();
00112 
00113     explicit Range(boost::shared_ptr<store_base_type>& data);
00114 
00115     Range(const Range& rhs);
00116 
00117     virtual ~Range();
00118 
00119     Range& operator=(const Range& rhs);
00120 
00121     iterator begin() const;
00122 
00123     iterator end() const;
00124 
00125     reverse_iterator rbegin() const;
00126 
00127     reverse_iterator rend() const;
00128 
00129     size_t size() const;
00130 
00131     size_t frontIndex() const;
00132 
00133     size_t backIndex() const;
00134       
00135     private:
00136 
00137     boost::shared_ptr<store_base_type> m_data;
00138   };
00139   
00140   template <typename Tp> class Query {
00141     public:
00142     explicit Query(boost::shared_ptr<IVectorLoader>& loader);
00143 
00144     Query(const Query<Tp>& rhs);
00145     
00146     Query& operator=(const Query<Tp>& rhs);
00147 
00148     virtual ~Query(){
00149     }
00150     
00151     template <typename Prim> void addSelection(const std::string& dataMemberName, SelectionItemType stype, Prim selectionData);
00152 
00153     size_t count();
00154     
00155     Range<Tp> execute();
00156 
00157     private:
00158     Selection m_selection;
00159     boost::shared_ptr<IVectorLoader> m_loader;
00160   };
00161   
00162   template <typename Tp> class QueryableVector {
00163  
00164     public:
00165 
00166     // typedefs forwarded to std::vector
00167     typedef typename PVector<Tp>::size_type size_type;
00168     typedef typename PVector<Tp>::const_reference const_reference;
00169     typedef typename PVector<Tp>::reference reference;
00170     typedef typename PVector<Tp>::const_iterator const_iterator;
00171     typedef typename PVector<Tp>::iterator iterator;
00172     typedef typename PVector<Tp>::const_reverse_iterator const_reverse_iterator;
00173     typedef typename PVector<Tp>::reverse_iterator reverse_iterator;
00174     typedef typename PVector<Tp>::value_type value_type;
00175 
00176     // ora specific typedef
00177     typedef PVector<Tp> store_base_type;
00178     //typedef typename PVector<Tp>::store_type store_type;
00179     typedef std::vector<std::pair<size_t,Tp> > range_store_base_type;
00180 
00181     public:
00182     // default constructor
00183     QueryableVector();
00184     
00185     // constructor
00186     explicit QueryableVector(size_t n, const Tp& value=Tp());
00187     
00188     // copy constructor: not sure what to do...
00189     QueryableVector(const QueryableVector<Tp>& rhs);
00190 
00191     // destructor
00192     virtual ~QueryableVector();
00193 
00194     // assignment operator: not sure what to do...
00195     QueryableVector<Tp>& operator=(const QueryableVector<Tp>& rhs);
00196 
00197     public:
00198 
00199     Range<Tp> select(int startIndex, int endIndex=Selection::endOfRange) const;
00200     
00201     Range<Tp> select(const Selection& sel) const;
00202 
00203     Query<Tp> query() const;
00204     
00205     bool lock();
00206         
00207     bool isLocked() const;
00208 
00209     public:
00210     
00211     iterator begin();
00212 
00213     iterator end();
00214 
00215     const_iterator begin() const;
00216 
00217     const_iterator end() const;
00218 
00219     reverse_iterator rbegin();
00220     
00221     reverse_iterator rend();
00222     
00223     const_reverse_iterator rbegin() const;
00224     
00225     const_reverse_iterator rend() const;
00226 
00227     size_t size() const;
00228 
00229     size_t max_size() const;
00230     
00231     void resize(size_t n, const Tp& value=Tp());
00232     
00233     size_t capacity() const;
00234     
00235     bool empty() const;
00236     
00237     void reserve(size_t n);
00238 
00239     reference operator[] ( size_t n );
00240 
00241     const_reference operator[] ( size_t n ) const;
00242 
00243     reference at( size_t n );
00244 
00245     const_reference at( size_t n ) const;
00246     
00247     reference front ( );
00248     
00249     const_reference front ( ) const;
00250     
00251     reference back ( );
00252     
00253     const_reference back ( ) const;
00254 
00255     void assign ( size_t n, const Tp& u );
00256 
00257     void push_back ( const Tp& x );
00258 
00259     void pop_back ();
00260 
00261     void clear ( );
00262 
00263     void reset ( );
00264 
00265     // equals operator
00266     bool operator==(const QueryableVector& vec) const;
00267     
00268     bool operator!=(const QueryableVector& vec) const;
00269 
00270     public:
00271     // access to persistent size
00272     size_t persistentSize() const;
00273 
00274     const void* storageAddress() const;
00275 
00276     void load() const;
00277 
00278     private:
00279     void initialize() const;
00280 
00281     private:
00282     boost::shared_ptr<store_base_type> m_data;
00283     bool m_isLocked;
00284     mutable bool m_isLoaded;
00285     mutable boost::shared_ptr<IVectorLoader> m_loader;
00286 
00287 };
00288 
00289 }
00290 
00291 #include "QueryableVectorImpl.h"
00292 
00293 #endif