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
00417
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 //