CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CondCore/ORA/interface/QueryableVectorData.h

Go to the documentation of this file.
00001 #ifndef INCLUDE_ORA_QUERYABLEVECTORDATA_H
00002 #define INCLUDE_ORA_QUERYABLEVECTORDATA_H
00003 
00004 #include "PVector.h"
00005 //
00006 #include <boost/shared_ptr.hpp>
00007 
00008 namespace ora    {
00009 
00010   class Selection;
00011   
00012   class IVectorLoader {
00013     public:
00014 
00015     // destructor
00016     virtual ~IVectorLoader(){
00017     }
00018 
00019     public:
00020 
00021     // triggers the data loading
00022     virtual bool load(void* address) const=0;
00023 
00024     virtual bool loadSelection(const ora::Selection& selection, void* address) const=0;
00025 
00026     virtual size_t getSelectionCount( const ora::Selection& selection ) const=0;
00027 
00028     // notify the underlying storage system that the embedded object has been destructed.
00029     // maybe not required...
00030     //virtual void notify() const=0;
00031 
00032     // invalidates the current loader. Called by the underlying service at his destruction time.
00033     virtual void invalidate()=0;
00034 
00035     // queries the validity of the current relation with the underlying storage system
00036     virtual bool isValid() const=0;
00037 
00038   };
00039 
00040   
00041   
00042   template <typename Tp> class Iterator {
00043     
00044     public:
00045     Iterator( typename ora::PVector<std::pair<size_t,Tp> >::iterator vectorIterator):m_vecIterator(vectorIterator){
00046     }
00047       
00048     Iterator( const Iterator& rhs ):m_vecIterator(rhs.m_vecIterator){
00049     }
00050 
00051     Iterator& operator=( const Iterator& rhs ){
00052       m_vecIterator = rhs.m_vecIterator;
00053     }
00054     virtual ~Iterator(){
00055     }
00056 
00057     bool operator==( const Iterator& rhs ) const{
00058       return m_vecIterator == rhs.m_vecIterator;
00059     }
00060 
00061     bool operator!=( const Iterator& rhs ) const {
00062       return m_vecIterator != rhs.m_vecIterator;
00063     }
00064 
00065     Iterator& operator++(){
00066       ++m_vecIterator;
00067       return *this;
00068     }
00069 
00070     Iterator operator++(int){
00071       this->operator++();
00072       return *this;
00073     }
00074 
00075     size_t index(){
00076       return m_vecIterator->first;
00077     }
00078 
00079     Tp* operator->() { return &m_vecIterator->second; }
00080     Tp& operator*() { return m_vecIterator->second; }
00081 
00082     private:
00083     typename ora::PVector<std::pair<size_t, Tp> >::iterator m_vecIterator;
00084 
00085   };
00086 
00087   template <typename Tp> class CIterator {
00088 
00089     public:
00090     CIterator( typename ora::PVector<std::pair<size_t,Tp> >::const_iterator vectorIterator):m_vecIterator(vectorIterator){
00091     }
00092       
00093     CIterator( const CIterator& rhs ):m_vecIterator(rhs.m_vecIterator){
00094     }
00095 
00096     CIterator& operator=( const CIterator& rhs ){
00097       m_vecIterator = rhs.m_vecIterator;
00098     }
00099 
00100     virtual ~CIterator(){
00101     }
00102 
00103     bool operator==( const CIterator& rhs ) const{
00104       return m_vecIterator == rhs.m_vecIterator;
00105     }
00106 
00107     bool operator!=( const CIterator& rhs ) const {
00108       return m_vecIterator != rhs.m_vecIterator;
00109     }
00110 
00111     CIterator& operator++(){
00112       ++m_vecIterator;
00113       return *this;
00114     }
00115 
00116     CIterator operator++(int){
00117       this->operator++();
00118       return *this;
00119     }
00120 
00121     size_t index(){
00122       return m_vecIterator->first;
00123     }
00124 
00125     const Tp* operator->() const { return &m_vecIterator->second; }
00126     const Tp& operator*() const { return m_vecIterator->second; }
00127 
00128     private:
00129     typename ora::PVector<std::pair<size_t, Tp> >::const_iterator m_vecIterator;
00130   };
00131 
00132   template <typename Tp> class RIterator {
00133 
00134     public:
00135     RIterator( typename ora::PVector<std::pair<size_t,Tp> >::reverse_iterator vectorIterator):m_vecIterator(vectorIterator){
00136     }
00137       
00138     RIterator( const RIterator& rhs ):m_vecIterator(rhs.m_vecIterator){
00139     }
00140 
00141     RIterator& operator=( const RIterator& rhs ){
00142       m_vecIterator = rhs.m_vecIterator;
00143     }
00144 
00145     virtual ~RIterator(){
00146     }
00147 
00148     bool operator==( const RIterator& rhs ) const{
00149       return m_vecIterator == rhs.m_vecIterator;
00150     }
00151 
00152     bool operator!=( const RIterator& rhs ) const {
00153       return m_vecIterator != rhs.m_vecIterator;
00154     }
00155 
00156     RIterator& operator++(){
00157       ++m_vecIterator;
00158       return *this;
00159     }
00160 
00161     RIterator operator++(int){
00162       this->operator++();
00163       return *this;
00164     }
00165 
00166     size_t index(){
00167       return m_vecIterator->first;
00168     }
00169 
00170     Tp* operator->() { return &m_vecIterator->second; }
00171     Tp& operator*() { return m_vecIterator->second; }
00172 
00173     private:
00174     typename ora::PVector<std::pair<size_t, Tp> >::reverse_iterator m_vecIterator;
00175   };
00176 
00177   template <typename Tp> class CRIterator {
00178 
00179     public:
00180     CRIterator( typename ora::PVector<std::pair<size_t,Tp> >::const_reverse_iterator vectorIterator):m_vecIterator(vectorIterator){
00181     }
00182       
00183     CRIterator( const CRIterator& rhs ):m_vecIterator(rhs.m_vecIterator){
00184     }
00185 
00186     CRIterator& operator=( const CRIterator& rhs ){
00187       m_vecIterator = rhs.m_vecIterator;
00188     }
00189 
00190     virtual ~CRIterator(){
00191     }
00192 
00193     bool operator==( const CRIterator& rhs ) const{
00194       return m_vecIterator == rhs.m_vecIterator;
00195     }
00196 
00197     bool operator!=( const CRIterator& rhs ) const {
00198       return m_vecIterator != rhs.m_vecIterator;
00199     }
00200 
00201     CRIterator& operator++(){
00202       ++m_vecIterator;
00203       return *this;
00204     }
00205 
00206     CRIterator operator++(int){
00207       this->operator++();
00208       return *this;
00209     }
00210 
00211     size_t index(){
00212       return m_vecIterator->first;
00213     }
00214 
00215     const Tp* operator->() const { return &m_vecIterator->second; }
00216     const Tp& operator*() const { return m_vecIterator->second; }
00217        
00218     private:
00219     typename ora::PVector<std::pair<size_t, Tp> >::const_reverse_iterator m_vecIterator;
00220   };
00221 
00222   class IVectorData {
00223     public:
00224     virtual ~IVectorData(){
00225     }
00226 
00227     virtual const void* storageAddress() const=0;
00228   };
00229 
00230   template <typename Tp> class QueryableVectorData: public IVectorData {
00231     
00232     public:
00233 
00234     typedef Iterator<Tp> iterator;
00235     typedef CIterator<Tp> const_iterator;
00236     typedef RIterator<Tp> reverse_iterator;
00237     typedef CRIterator<Tp> const_reverse_iterator;
00238     typedef typename std::pair<size_t,Tp> store_item_type;
00239     typedef ora::PVector<std::pair<size_t,Tp> > store_base_type;
00240     typedef typename ora::PVector<std::pair<size_t,Tp> >::store_type store_type;
00241 
00242     public:
00243 
00244     QueryableVectorData():IVectorData(),m_vec(){}
00245     QueryableVectorData(size_t n, const Tp& value=Tp()):IVectorData(),m_vec(n,std::make_pair(0,value)){}
00246     
00247     iterator begin(){
00248       return iterator(m_vec.begin());
00249     }
00250         
00251     iterator end(){
00252       return iterator(m_vec.end());
00253     }
00254     
00255     const_iterator cbegin() const {
00256       return const_iterator(m_vec.begin());
00257     }
00258         
00259     const_iterator cend() const {
00260       return const_iterator(m_vec.end());
00261     }
00262 
00263     reverse_iterator rbegin(){
00264       return reverse_iterator(m_vec.rbegin());
00265     }
00266         
00267     reverse_iterator rend(){
00268       return reverse_iterator(m_vec.rend());
00269     }
00270     
00271     const_reverse_iterator crbegin() const {
00272       return const_reverse_iterator(m_vec.rbegin());
00273     }
00274         
00275     const_reverse_iterator crend() const {
00276       return const_reverse_iterator(m_vec.rend());
00277     }
00278 
00279     const Tp& operator[](size_t n) const { return m_vec[n].second; }
00280     Tp& operator[](size_t n) { return m_vec[n].second; }
00281 
00282     const Tp& back() const { return m_vec.back().second; }
00283     Tp& back() { return m_vec.back().second; }
00284     
00285     const Tp& front() const { return m_vec.front().second; }
00286     Tp& front() { return m_vec.front().second; }
00287 
00288     void assign ( size_t n, const Tp& u ) {
00289       for(size_t i=0;i<n;i++) push_back(u);
00290     }
00291 
00292     void push_back ( const Tp& x ){
00293       m_vec.push_back(std::make_pair(m_vec.size(),x));
00294     }
00295 
00296     void pop_back (){
00297       m_vec.pop_back();
00298     }
00299     
00300     size_t size() const {
00301       return m_vec.size();
00302     }
00303 
00304     size_t max_size() const {
00305       return m_vec.max_size();
00306     }
00307     
00308     void resize(size_t n, const Tp& value=Tp()){
00309       size_t sz = size();
00310       for(size_t i=sz;i>n;i--) pop_back();
00311       for(size_t i=n;i>sz;i--) push_back(value);
00312     }
00313     
00314     size_t capacity() const {
00315       return m_vec.capacity();
00316     }
00317     
00318     bool empty() const {
00319       return m_vec.empty();
00320     }
00321     
00322     void reserve(size_t n) {
00323       m_vec.reserve(n);
00324     }
00325 
00326     void clear(){
00327       m_vec.clear();
00328     }
00329     
00330     bool operator==(const QueryableVectorData& rhs) const { return m_vec==rhs.m_vec; }
00331     bool operator!=(const QueryableVectorData& rhs) const { return m_vec!=rhs.m_vec; }
00332 
00333     const void* storageAddress() const {
00334       return &m_vec;
00335     }
00336 
00337     size_t persistentSize() const {
00338       return m_vec.persistentSize();
00339     }
00340 
00341     //...
00342     private:
00343 
00344     // private vector
00345     store_base_type m_vec;
00346   };
00347 
00348   class LoaderClient {
00349 
00350     public:
00351     LoaderClient();
00352 
00353     virtual ~LoaderClient();
00354 
00355     explicit LoaderClient(boost::shared_ptr<IVectorLoader>& loader);
00356     
00357     LoaderClient( const LoaderClient& rhs );
00358 
00359     LoaderClient& operator=(const LoaderClient& rhs );
00360 
00361     bool hasLoader() const;
00362     
00363     boost::shared_ptr<IVectorLoader> loader() const;
00364 
00365     void reset();
00366 
00367     void install(boost::shared_ptr<IVectorLoader>& loader);    
00368 
00369     private:
00370     mutable boost::shared_ptr<IVectorLoader> m_loader;
00371     
00372   };
00373   
00374 }
00375 
00376 #endif  //