00001 #ifndef INCLUDE_ORA_QUERYABLEVECTOR_H 00002 #define INCLUDE_ORA_QUERYABLEVECTOR_H 00003 00004 #include "QueryableVectorData.h" 00005 #include "Selection.h" 00006 00007 namespace ora { 00008 00009 template <typename Tp> class Range { 00010 public: 00011 00012 typedef const Tp& const_reference; 00013 typedef CIterator<Tp> const_iterator; 00014 typedef CRIterator<Tp> const_reverse_iterator; 00015 00016 public: 00017 Range(); 00018 00019 explicit Range(boost::shared_ptr<QueryableVectorData<Tp> >& data); 00020 00021 Range(const Range& rhs); 00022 00023 virtual ~Range(); 00024 00025 Range& operator=(const Range& rhs); 00026 00027 const_iterator begin() const; 00028 00029 const_iterator end() const; 00030 00031 const_reverse_iterator rbegin() const; 00032 00033 const_reverse_iterator rend() const; 00034 00035 size_t size() const; 00036 00037 size_t frontIndex() const; 00038 00039 size_t backIndex() const; 00040 00041 private: 00042 00043 boost::shared_ptr<QueryableVectorData<Tp> > m_data; 00044 }; 00045 00046 template <typename Tp> class Query: public LoaderClient { 00047 public: 00048 explicit Query(boost::shared_ptr<IVectorLoader>& loader); 00049 00050 virtual ~Query(){ 00051 } 00052 00053 template <typename Prim> void addSelection(const std::string& dataMemberName, SelectionItemType stype, Prim selectionData); 00054 00055 size_t count(); 00056 00057 Range<Tp> execute(); 00058 00059 private: 00060 Selection m_selection; 00061 }; 00062 00063 template <typename Tp> class QueryableVector: public LoaderClient { 00064 00065 public: 00066 00067 // std::vector like typedefs 00068 typedef Tp& reference; 00069 typedef const Tp& const_reference; 00070 typedef Iterator<Tp> iterator; 00071 typedef CIterator<Tp> const_iterator; 00072 typedef RIterator<Tp> reverse_iterator; 00073 typedef CRIterator<Tp> const_reverse_iterator; 00074 typedef typename std::vector<Tp>::value_type value_type; 00075 // pool specific typedefs 00076 typedef Query<Tp> pquery; 00077 typedef Range<Tp> prange; 00078 typedef typename QueryableVectorData<Tp>::store_item_type store_item_type; 00079 typedef typename QueryableVectorData<Tp>::store_base_type store_base_type; 00080 typedef typename QueryableVectorData<Tp>::store_type store_type; 00081 00082 public: 00083 // default constructor 00084 QueryableVector(); 00085 00086 // constructor 00087 explicit QueryableVector(size_t n, const Tp& value=Tp()); 00088 00089 // copy constructor: not sure what to do... 00090 QueryableVector(const QueryableVector<Tp>& rhs); 00091 00092 // destructor 00093 virtual ~QueryableVector(); 00094 00095 // assignment operator: not sure what to do... 00096 QueryableVector<Tp>& operator=(const QueryableVector<Tp>& rhs); 00097 00098 public: 00099 00100 Range<Tp> select(int startIndex, int endIndex=Selection::endOfRange) const; 00101 00102 Range<Tp> select(const Selection& sel) const; 00103 00104 Query<Tp> query() const; 00105 00106 bool lock(); 00107 00108 bool isLocked() const; 00109 00110 public: 00111 00112 iterator begin(); 00113 00114 iterator end(); 00115 00116 const_iterator begin() const; 00117 00118 const_iterator end() const; 00119 00120 reverse_iterator rbegin(); 00121 00122 reverse_iterator rend(); 00123 00124 const_reverse_iterator rbegin() const; 00125 00126 const_reverse_iterator rend() const; 00127 00128 size_t size() const; 00129 00130 size_t max_size() const; 00131 00132 void resize(size_t n, const Tp& value=Tp()); 00133 00134 size_t capacity() const; 00135 00136 bool empty() const; 00137 00138 void reserve(size_t n); 00139 00140 reference operator[] ( size_t n ); 00141 00142 const_reference operator[] ( size_t n ) const; 00143 00144 reference at( size_t n ); 00145 00146 const_reference at( size_t n ) const; 00147 00148 reference front ( ); 00149 00150 const_reference front ( ) const; 00151 00152 reference back ( ); 00153 00154 const_reference back ( ) const; 00155 00156 void assign ( size_t n, const Tp& u ); 00157 00158 void push_back ( const Tp& x ); 00159 00160 void pop_back (); 00161 00162 void clear ( ); 00163 00164 void reset ( ); 00165 00166 // equals operator 00167 bool operator==(const QueryableVector& vec) const; 00168 00169 bool operator!=(const QueryableVector& vec) const; 00170 00171 public: 00172 00173 // access to persistent size 00174 size_t persistentSize() const; 00175 00176 const void* storageAddress() const; 00177 00178 void load() const; 00179 00180 private: 00181 00182 void initialize() const; 00183 00184 private: 00185 00186 boost::shared_ptr<QueryableVectorData<Tp> > m_data; 00187 bool m_isLocked; 00188 mutable bool m_isLoaded; 00189 00190 }; 00191 00192 } 00193 00194 #include "QueryableVectorImpl.h" 00195 00196 #endif