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
00007 #include <boost/shared_ptr.hpp>
00008
00009 namespace ora {
00010
00011 class IVectorLoader {
00012 public:
00013
00014
00015 virtual ~IVectorLoader(){
00016 }
00017
00018 public:
00019
00020
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
00028 virtual void invalidate()=0;
00029
00030
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
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
00177 typedef PVector<Tp> store_base_type;
00178
00179 typedef std::vector<std::pair<size_t,Tp> > range_store_base_type;
00180
00181 public:
00182
00183 QueryableVector();
00184
00185
00186 explicit QueryableVector(size_t n, const Tp& value=Tp());
00187
00188
00189 QueryableVector(const QueryableVector<Tp>& rhs);
00190
00191
00192 virtual ~QueryableVector();
00193
00194
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
00266 bool operator==(const QueryableVector& vec) const;
00267
00268 bool operator!=(const QueryableVector& vec) const;
00269
00270 public:
00271
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