CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_5_3_13_patch3/src/CondCore/ORA/interface/QueryableVectorImpl.h

Go to the documentation of this file.
00001 #ifndef INCLUDE_ORA_QUERYABLEVECTORIMPL_H
00002 #define INCLUDE_ORA_QUERYABLEVECTORIMPL_H
00003 
00004 #include "CondCore/ORA/interface/Exception.h"
00005 
00006 template <class Tp> ora::RangeIterator<Tp>::RangeIterator( RangeIterator<Tp>::embedded_iterator vectorIterator):m_vecIterator(vectorIterator){
00007 }
00008       
00009 template <class Tp> ora::RangeIterator<Tp>::RangeIterator( const ora::RangeIterator<Tp>& rhs ):m_vecIterator(rhs.m_vecIterator){
00010 }
00011 
00012 template <class Tp> ora::RangeIterator<Tp>& ora::RangeIterator<Tp>::operator=( const ora::RangeIterator<Tp>& rhs ){
00013    m_vecIterator = rhs.m_vecIterator;
00014 }
00015 
00016 template <class Tp> ora::RangeIterator<Tp>::~RangeIterator(){
00017 }
00018 
00019 template <class Tp> bool ora::RangeIterator<Tp>::operator==( const ora::RangeIterator<Tp>& rhs ) const{
00020   return m_vecIterator == rhs.m_vecIterator;
00021 }
00022 
00023 template <class Tp> bool ora::RangeIterator<Tp>::operator!=( const ora::RangeIterator<Tp>& rhs ) const {
00024   return m_vecIterator != rhs.m_vecIterator;
00025 }
00026 
00027 template <class Tp> ora::RangeIterator<Tp>& ora::RangeIterator<Tp>::operator++(){
00028   ++m_vecIterator;
00029   return *this;
00030 }
00031 
00032 template <class Tp> ora::RangeIterator<Tp> ora::RangeIterator<Tp>::operator++(int){
00033   this->operator++();
00034   return *this;
00035 }
00036 
00037 template <class Tp> ora::RangeIterator<Tp> ora::RangeIterator<Tp>::operator+(int i){
00038   return RangeIterator(this->operator+(i));
00039 }
00040 
00041 template <class Tp> ora::RangeIterator<Tp> ora::RangeIterator<Tp>::operator-(int i){
00042   return RangeIterator(this->operator-(i));
00043 }
00044 
00045 template <class Tp> size_t ora::RangeIterator<Tp>::index() const {
00046   return m_vecIterator->first;
00047 }
00048 
00049 template <class Tp> const Tp* ora::RangeIterator<Tp>::operator->() const { 
00050   return &m_vecIterator->second; 
00051 }
00052   
00053 template <class Tp> const Tp& ora::RangeIterator<Tp>::operator*() const { 
00054   return m_vecIterator->second; 
00055 }
00056 
00057 template <class Tp> ora::RangeReverseIterator<Tp>::RangeReverseIterator( ora::RangeReverseIterator<Tp>::embedded_iterator vectorIterator):m_vecIterator(vectorIterator){
00058 }
00059       
00060 template <class Tp> ora::RangeReverseIterator<Tp>::RangeReverseIterator( const ora::RangeReverseIterator<Tp>& rhs ):m_vecIterator(rhs.m_vecIterator){
00061 }
00062 
00063 template <class Tp> ora::RangeReverseIterator<Tp>& ora::RangeReverseIterator<Tp>::operator=( const ora::RangeReverseIterator<Tp>& rhs ){
00064   m_vecIterator = rhs.m_vecIterator;
00065 }
00066 
00067 template <class Tp> ora::RangeReverseIterator<Tp>::~RangeReverseIterator(){
00068 }
00069 
00070 template <class Tp> bool ora::RangeReverseIterator<Tp>::operator==( const ora::RangeReverseIterator<Tp>& rhs ) const{
00071   return m_vecIterator == rhs.m_vecIterator;
00072 }
00073 
00074 template <class Tp> bool ora::RangeReverseIterator<Tp>::operator!=( const ora::RangeReverseIterator<Tp>& rhs ) const {
00075   return m_vecIterator != rhs.m_vecIterator;
00076 }
00077 
00078 template <class Tp> ora::RangeReverseIterator<Tp>& ora::RangeReverseIterator<Tp>::operator++(){
00079   ++m_vecIterator;
00080   return *this;
00081 }
00082 
00083 template <class Tp> ora::RangeReverseIterator<Tp> ora::RangeReverseIterator<Tp>::operator++(int){
00084   this->operator++();
00085   return *this;
00086 }
00087 
00088 template <class Tp> ora::RangeReverseIterator<Tp> ora::RangeReverseIterator<Tp>::operator+(int i){
00089   return RangeReverseIterator(this->operator+(i));
00090 }
00091 
00092 template <class Tp> ora::RangeReverseIterator<Tp> ora::RangeReverseIterator<Tp>::operator-(int i){
00093   return RangeReverseIterator(this->operator-(i));
00094 }
00095 
00096 template <class Tp> size_t ora::RangeReverseIterator<Tp>::index() const {
00097   return m_vecIterator->first;
00098 }
00099 
00100 template <class Tp> const Tp* ora::RangeReverseIterator<Tp>::operator->() const { 
00101   return &m_vecIterator->second; 
00102 }
00103 
00104 template <class Tp> const Tp& ora::RangeReverseIterator<Tp>::operator*() const { 
00105   return m_vecIterator->second; 
00106 }
00107        
00108 template <class Tp> ora::Range<Tp>::Range():m_data(new store_base_type ){
00109 }
00110 
00111 template <class Tp> ora::Range<Tp>::Range(boost::shared_ptr<store_base_type>& data):m_data(data){
00112 }
00113 
00114 template <class Tp> ora::Range<Tp>::Range(const ora::Range<Tp>& rhs):m_data(rhs.m_data){
00115 }
00116 
00117 template <class Tp> ora::Range<Tp>::~Range(){
00118 }
00119       
00120 template <class Tp> ora::Range<Tp>& ora::Range<Tp>::operator=(const ora::Range<Tp>& rhs){
00121   if(&rhs != this){
00122     m_data = rhs.m_data;
00123   }
00124   return *this;
00125 }
00126 
00127 template <class Tp> typename ora::Range<Tp>::iterator ora::Range<Tp>::begin() const {
00128   return RangeIterator<Tp>(m_data->begin());
00129 }
00130 
00131 template <class Tp> typename ora::Range<Tp>::iterator ora::Range<Tp>::end() const {
00132   return RangeIterator<Tp>(m_data->end());
00133 }
00134 
00135 template <class Tp> typename ora::Range<Tp>::reverse_iterator ora::Range<Tp>::rbegin() const {
00136   return RangeReverseIterator<Tp>(m_data->rbegin());
00137 }
00138 
00139 template <class Tp> typename ora::Range<Tp>::reverse_iterator ora::Range<Tp>::rend() const {
00140   return RangeReverseIterator<Tp>(m_data->rend());
00141 }
00142 
00143 template <class Tp> size_t ora::Range<Tp>::size() const {
00144   return m_data->size();
00145 }
00146 
00147 template <class Tp> size_t ora::Range<Tp>::frontIndex() const {
00148   return m_data->front().first;
00149 }
00150 
00151 template <class Tp> size_t ora::Range<Tp>::backIndex() const {
00152   return m_data->back().first;
00153 }
00154 
00155 
00156 template <class Tp> 
00157 ora::Query<Tp>::Query(boost::shared_ptr<ora::IVectorLoader>& loader):
00158   m_selection(),
00159   m_loader(loader){
00160 }
00161 
00162 template <class Tp> 
00163 ora::Query<Tp>::Query(const Query<Tp>& rhs):
00164   m_selection( rhs.m_selection),
00165   m_loader( rhs.m_loader ){
00166 }
00167 
00168 template <class Tp>
00169 ora::Query<Tp>& ora::Query<Tp>::operator=(const ora::Query<Tp>& rhs){
00170   m_selection = rhs.m_selection;
00171   m_loader = rhs.m_loader;
00172   return *this;
00173 }
00174 
00175 template <class Tp>
00176 template <typename Prim> void ora::Query<Tp>::addSelection(const std::string& dataMemberName, ora::SelectionItemType stype, Prim selectionData){
00177   m_selection.addDataItem(dataMemberName, stype, selectionData);
00178 }
00179 
00180 template <class Tp> size_t ora::Query<Tp>::count(){
00181   return m_loader->getSelectionCount( m_selection );
00182 }
00183 
00184 template <class Tp> ora::Range<Tp> ora::Query<Tp>::execute(){
00185   typedef typename Range<Tp>::store_base_type range_store_base_type;
00186   boost::shared_ptr<range_store_base_type> newData ( new range_store_base_type );
00187   m_loader->loadSelection( m_selection, newData.get());
00188   return Range<Tp>( newData );
00189 }
00190 
00191 template <class Tp> ora::QueryableVector<Tp>::QueryableVector():
00192   m_data(new PVector<Tp>),
00193   m_isLocked(false),
00194   m_isLoaded(false),
00195   m_loader(){
00196 }
00197     
00198 template <class Tp> ora::QueryableVector<Tp>::QueryableVector(size_t n, const Tp& value):
00199   m_data(new PVector<Tp>(n,value)),
00200   m_isLocked(false),
00201   m_isLoaded(false),
00202   m_loader(){
00203 }
00204     
00205 template <class Tp> ora::QueryableVector<Tp>::QueryableVector(const QueryableVector<Tp>& rhs):
00206   m_data(rhs.m_data),
00207   m_isLocked(rhs.m_isLocked),
00208   m_isLoaded(rhs.m_isLoaded),
00209   m_loader( rhs.m_loader ){
00210 }
00211 
00212 template <class Tp> ora::QueryableVector<Tp>::~QueryableVector(){
00213 }
00214 
00215 template <class Tp> ora::QueryableVector<Tp>& ora::QueryableVector<Tp>::operator=(const ora::QueryableVector<Tp>& rhs){
00216   if(&rhs != this){
00217     m_data = rhs.m_data;
00218     m_isLocked = rhs.m_isLocked;
00219     m_isLoaded = rhs.m_isLoaded;
00220     m_loader = rhs.m_loader;
00221   }
00222   return *this;
00223 }
00224 
00225 template <class Tp> ora::Range<Tp> ora::QueryableVector<Tp>::select(int startIndex, int endIndex) const {
00226   Selection sel;
00227   sel.addIndexItem( startIndex, endIndex );
00228   return select( sel );
00229 }
00230     
00231 template <class Tp> ora::Range<Tp> ora::QueryableVector<Tp>::select(const ora::Selection& sel) const {
00232   if(m_isLocked ){
00233     throwException("The Vector is locked in writing mode, cannot make queries.","ora::QueryableVector<Tp>::select");
00234   }
00235   if(!m_loader.get()){
00236     throwException("The Loader is not installed.","ora::QueryableVector<Tp>::select");
00237   }
00238   typedef typename Range<Tp>::store_base_type range_store_base_type;
00239   boost::shared_ptr<range_store_base_type> newData ( new range_store_base_type );
00240   m_loader->loadSelection( sel, newData.get());
00241   return Range<Tp>(newData);
00242 }
00243 
00244 template <class Tp> ora::Query<Tp> ora::QueryableVector<Tp>::query() const{
00245   if(m_isLocked ){
00246     throwException("The Vector is locked in writing mode, cannot make queries.","ora::QueryableVector<Tp>::query");
00247   }
00248   if(!m_loader.get()){
00249     throwException("The Loader is not installed.","ora::QueryableVector<Tp>::query");
00250   }
00251   return Query<Tp>(m_loader);
00252 }
00253     
00254 template <class Tp> bool ora::QueryableVector<Tp>::lock() {
00255   bool wasLocked = m_isLocked;
00256   m_isLocked = true;
00257   return wasLocked;
00258 }
00259         
00260 template <class Tp> bool ora::QueryableVector<Tp>::isLocked() const {
00261   return m_isLocked;
00262 }
00263 
00264 template <class Tp> typename ora::QueryableVector<Tp>::iterator ora::QueryableVector<Tp>::begin(){
00265   initialize();
00266   return m_data->begin();
00267 }
00268 
00269 template <class Tp> typename ora::QueryableVector<Tp>::iterator ora::QueryableVector<Tp>::end(){
00270   initialize();
00271   return m_data->end();
00272 }
00273 
00274 template <class Tp> typename ora::QueryableVector<Tp>::const_iterator ora::QueryableVector<Tp>::begin() const {
00275   initialize();
00276   return m_data->begin();
00277 }
00278 
00279 template <class Tp> typename ora::QueryableVector<Tp>::const_iterator ora::QueryableVector<Tp>::end() const {
00280   initialize();
00281   return m_data->end();
00282 }
00283 
00284 template <class Tp> typename ora::QueryableVector<Tp>::reverse_iterator ora::QueryableVector<Tp>::rbegin(){
00285   initialize();
00286   return m_data->rbegin();
00287 }
00288     
00289 template <class Tp> typename ora::QueryableVector<Tp>::reverse_iterator ora::QueryableVector<Tp>::rend(){
00290   initialize();
00291   return m_data->rend();
00292 }
00293     
00294 template <class Tp> typename ora::QueryableVector<Tp>::const_reverse_iterator ora::QueryableVector<Tp>::rbegin() const {
00295   initialize();
00296   return m_data->rbegin();
00297 }
00298     
00299 template <class Tp> typename ora::QueryableVector<Tp>::const_reverse_iterator ora::QueryableVector<Tp>::rend() const {
00300   initialize();
00301   return m_data->rend();
00302 }
00303 
00304 template <class Tp> size_t ora::QueryableVector<Tp>::size() const {
00305   initialize();
00306   return m_data->size();
00307 }
00308 
00309 template <class Tp> size_t ora::QueryableVector<Tp>::max_size() const {
00310   initialize();
00311   return m_data->max_size();
00312 }
00313     
00314 template <class Tp> void ora::QueryableVector<Tp>::resize(size_t n, const Tp& value){
00315   initialize();
00316   m_data->resize(n,value);
00317 }
00318     
00319 template <class Tp> size_t ora::QueryableVector<Tp>::capacity() const {
00320   initialize();
00321   return m_data->capacity();
00322 }
00323     
00324 template <class Tp> bool ora::QueryableVector<Tp>::empty() const {
00325   initialize();
00326   return m_data->empty();
00327 }
00328     
00329 template <class Tp> void ora::QueryableVector<Tp>::reserve(size_t n) {
00330   initialize();
00331   m_data->reserve(n);
00332 }
00333 
00334 template <class Tp> typename ora::QueryableVector<Tp>::reference ora::QueryableVector<Tp>::operator[] ( size_t n ){
00335   initialize();
00336   return m_data->operator[](n);
00337 }
00338 
00339 template <class Tp> typename ora::QueryableVector<Tp>::const_reference ora::QueryableVector<Tp>::operator[] ( size_t n ) const {
00340   initialize();
00341   return m_data->operator[](n);
00342 }
00343 
00344 template <class Tp> typename ora::QueryableVector<Tp>::const_reference ora::QueryableVector<Tp>::at( size_t n ) const {
00345   initialize();
00346   return m_data->operator[](n);
00347 }
00348     
00349 template <class Tp> typename ora::QueryableVector<Tp>::reference ora::QueryableVector<Tp>::at( size_t n ) {
00350   initialize();
00351   return m_data->operator[](n);
00352 }
00353 
00354 template <class Tp> typename ora::QueryableVector<Tp>::reference ora::QueryableVector<Tp>::front ( ) {
00355   initialize();
00356   return m_data->front();
00357 }
00358     
00359 template <class Tp> typename ora::QueryableVector<Tp>::const_reference ora::QueryableVector<Tp>::front ( ) const {
00360   initialize();
00361   return m_data->front();
00362 }
00363     
00364 template <class Tp> typename ora::QueryableVector<Tp>::reference ora::QueryableVector<Tp>::back ( ) {
00365   return m_data->back();
00366 }
00367     
00368 template <class Tp> typename ora::QueryableVector<Tp>::const_reference ora::QueryableVector<Tp>::back ( ) const {
00369   initialize();
00370   return m_data->back();
00371 }
00372 
00373 template <class Tp> void ora::QueryableVector<Tp>::assign ( size_t n, const Tp& u ) {
00374   initialize();
00375   m_data->assign(n,u);
00376 }
00377 
00378 template <class Tp> void ora::QueryableVector<Tp>::push_back ( const Tp& x ){
00379   initialize();
00380   m_isLocked = true;
00381   m_data->push_back(x);
00382 }
00383 
00384 template <class Tp> void ora::QueryableVector<Tp>::pop_back (){
00385   initialize();
00386   m_isLocked = true;
00387   m_data->pop_back();
00388 }
00389 
00390 template <class Tp> void ora::QueryableVector<Tp>::clear ( ){
00391   initialize();
00392   m_data->clear();
00393   m_isLoaded = false;
00394 }
00395 
00396 template <class Tp> void ora::QueryableVector<Tp>::reset ( ){
00397   initialize();
00398   m_data->clear();
00399   m_isLoaded = false;
00400   m_isLocked = false;
00401 }
00402 
00403 template <class Tp> bool ora::QueryableVector<Tp>::operator==(const ora::QueryableVector<Tp>& vec) const {
00404   initialize();
00405   vec.initialize();
00406   return m_data->operator==(*vec.m_data);
00407 }
00408 
00409 template <class Tp> bool ora::QueryableVector<Tp>::operator!=(const ora::QueryableVector<Tp>& vec) const {
00410   initialize();
00411   vec.initialize();
00412   return m_data->operator!=(*vec.m_data);
00413 }
00414 
00415 template <class Tp> size_t ora::QueryableVector<Tp>::persistentSize() const {
00416   // not sure needs init...
00417   //initialize();
00418   return m_data->persistentSize();
00419 }
00420 
00421 template <class Tp> const void* ora::QueryableVector<Tp>::storageAddress() const {
00422   return m_data.get();
00423 }
00424 
00425 template <class Tp> void ora::QueryableVector<Tp>::load() const {
00426   initialize();
00427 }
00428 
00429 template <class Tp> void ora::QueryableVector<Tp>::initialize() const {
00430   if(m_loader.get() && !m_isLocked && !m_isLoaded){
00431     m_loader->load(m_data.get());
00432     m_isLoaded = true;
00433   }
00434 }
00435 
00436 #endif  //