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
00016 virtual ~IVectorLoader(){
00017 }
00018
00019 public:
00020
00021
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
00029
00030
00031
00032
00033 virtual void invalidate()=0;
00034
00035
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
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 //