Go to the documentation of this file.00001 #ifndef INCLUDE_ORA_QUERYABLEVECTORIMPL_H
00002 #define INCLUDE_ORA_QUERYABLEVECTORIMPL_H
00003
00004 template <class Tp> ora::Range<Tp>::Range():m_data(new QueryableVectorData<Tp>){
00005 }
00006
00007 template <class Tp> ora::Range<Tp>::Range(boost::shared_ptr<ora::QueryableVectorData<Tp> >& data):m_data(data){
00008 }
00009
00010 template <class Tp> ora::Range<Tp>::Range(const ora::Range<Tp>& rhs):m_data(rhs.m_data){
00011 }
00012
00013 template <class Tp> ora::Range<Tp>::~Range(){
00014 }
00015
00016 template <class Tp> ora::Range<Tp>& ora::Range<Tp>::operator=(const ora::Range<Tp>& rhs){
00017 if(&rhs != this){
00018 m_data = rhs.m_data;
00019 }
00020 return *this;
00021 }
00022
00023 template <class Tp> typename ora::Range<Tp>::const_iterator ora::Range<Tp>::begin() const {
00024 return m_data->cbegin();
00025 }
00026
00027 template <class Tp> typename ora::Range<Tp>::const_iterator ora::Range<Tp>::end() const {
00028 return m_data->cend();
00029 }
00030
00031 template <class Tp> typename ora::Range<Tp>::const_reverse_iterator ora::Range<Tp>::rbegin() const {
00032 return m_data->crbegin();
00033 }
00034
00035 template <class Tp> typename ora::Range<Tp>::const_reverse_iterator ora::Range<Tp>::rend() const {
00036 return m_data->crend();
00037 }
00038
00039 template <class Tp> size_t ora::Range<Tp>::size() const {
00040 return m_data->size();
00041 }
00042
00043 template <class Tp> size_t ora::Range<Tp>::frontIndex() const {
00044 return m_data->front().first;
00045 }
00046
00047 template <class Tp> size_t ora::Range<Tp>::backIndex() const {
00048 return m_data->back().first;
00049 }
00050
00051
00052
00053 template <class Tp> ora::Query<Tp>::Query(boost::shared_ptr<ora::IVectorLoader>& loader):LoaderClient(loader){
00054 }
00055
00056 template <class Tp>
00057 template <typename Prim> void ora::Query<Tp>::addSelection(const std::string& dataMemberName, ora::SelectionItemType stype, Prim selectionData){
00058 m_selection.addDataItem(dataMemberName, stype, selectionData);
00059 }
00060
00061 template <class Tp> size_t ora::Query<Tp>::count(){
00062 return loader()->getSelectionCount( m_selection );
00063 }
00064
00065 template <class Tp> ora::Range<Tp> ora::Query<Tp>::execute(){
00066 boost::shared_ptr<QueryableVectorData<Tp> > newData ( new QueryableVectorData<Tp> );
00067 loader()->loadSelection( m_selection, const_cast<void*>(newData->storageAddress()) );
00068 return Range<Tp>( newData );
00069 }
00070
00071 template <class Tp> ora::QueryableVector<Tp>::QueryableVector():LoaderClient(),m_data(new QueryableVectorData<Tp>),m_isLocked(false),m_isLoaded(false){
00072 }
00073
00074 template <class Tp> ora::QueryableVector<Tp>::QueryableVector(size_t n, const Tp& value):LoaderClient(),m_data(new QueryableVectorData<Tp>(n,value)),m_isLocked(false),m_isLoaded(false){
00075 }
00076
00077 template <class Tp> ora::QueryableVector<Tp>::QueryableVector(const QueryableVector<Tp>& rhs):LoaderClient(rhs),m_data(rhs.m_data),m_isLocked(rhs.m_isLocked),m_isLoaded(rhs.m_isLoaded){
00078 }
00079
00080 template <class Tp> ora::QueryableVector<Tp>::~QueryableVector(){
00081 }
00082
00083 template <class Tp> ora::QueryableVector<Tp>& ora::QueryableVector<Tp>::operator=(const ora::QueryableVector<Tp>& rhs){
00084 if(&rhs != this){
00085 m_data = rhs.m_data;
00086 m_isLocked = rhs.m_isLocked;
00087 m_isLoaded = rhs.m_isLoaded;
00088 }
00089 return *this;
00090 }
00091
00092 template <class Tp> ora::Range<Tp> ora::QueryableVector<Tp>::select(int startIndex, int endIndex) const {
00093 Selection sel;
00094 sel.addIndexItem( startIndex, endIndex );
00095 return select( sel );
00096 }
00097
00098 template <class Tp> ora::Range<Tp> ora::QueryableVector<Tp>::select(const ora::Selection& sel) const {
00099 if(m_isLocked ){
00100 throwException("The Vector is locked in writing mode, cannot make queries.","ora::QueryableVector<Tp>::select");
00101 }
00102 if(!hasLoader()){
00103 throwException("The Loader is not installed.","ora::QueryableVector<Tp>::select");
00104 }
00105 boost::shared_ptr<QueryableVectorData<Tp> > newData ( new QueryableVectorData<Tp> );
00106 loader()->loadSelection( sel, const_cast<void*>(newData->storageAddress()) );
00107 return Range<Tp>(newData);
00108 }
00109
00110 template <class Tp> ora::Query<Tp> ora::QueryableVector<Tp>::query() const{
00111 if(m_isLocked ){
00112 throwException("The Vector is locked in writing mode, cannot make queries.","ora::QueryableVector<Tp>::query");
00113 }
00114 if(!hasLoader()){
00115 throwException("The Loader is not installed.","ora::QueryableVector<Tp>::query");
00116 }
00117 boost::shared_ptr<IVectorLoader> loaderH = loader();
00118 return Query<Tp>(loaderH);
00119 }
00120
00121 template <class Tp> bool ora::QueryableVector<Tp>::lock() {
00122 bool wasLocked = m_isLocked;
00123 m_isLocked = true;
00124 return wasLocked;
00125 }
00126
00127 template <class Tp> bool ora::QueryableVector<Tp>::isLocked() const {
00128 return m_isLocked;
00129 }
00130
00131 template <class Tp> typename ora::QueryableVector<Tp>::iterator ora::QueryableVector<Tp>::begin(){
00132 initialize();
00133 return m_data->begin();
00134 }
00135
00136 template <class Tp> typename ora::QueryableVector<Tp>::iterator ora::QueryableVector<Tp>::end(){
00137 initialize();
00138 return m_data->end();
00139 }
00140
00141 template <class Tp> typename ora::QueryableVector<Tp>::const_iterator ora::QueryableVector<Tp>::begin() const {
00142 initialize();
00143 return m_data->cbegin();
00144 }
00145
00146 template <class Tp> typename ora::QueryableVector<Tp>::const_iterator ora::QueryableVector<Tp>::end() const {
00147 initialize();
00148 return m_data->cend();
00149 }
00150
00151 template <class Tp> typename ora::QueryableVector<Tp>::reverse_iterator ora::QueryableVector<Tp>::rbegin(){
00152 initialize();
00153 return m_data->rbegin();
00154 }
00155
00156 template <class Tp> typename ora::QueryableVector<Tp>::reverse_iterator ora::QueryableVector<Tp>::rend(){
00157 initialize();
00158 return m_data->rend();
00159 }
00160
00161 template <class Tp> typename ora::QueryableVector<Tp>::const_reverse_iterator ora::QueryableVector<Tp>::rbegin() const {
00162 initialize();
00163 return m_data->crbegin();
00164 }
00165
00166 template <class Tp> typename ora::QueryableVector<Tp>::const_reverse_iterator ora::QueryableVector<Tp>::rend() const {
00167 return m_data->crend();
00168 }
00169
00170 template <class Tp> size_t ora::QueryableVector<Tp>::size() const {
00171 initialize();
00172 return m_data->size();
00173 }
00174
00175 template <class Tp> size_t ora::QueryableVector<Tp>::max_size() const {
00176 return m_data->max_size();
00177 }
00178
00179 template <class Tp> void ora::QueryableVector<Tp>::resize(size_t n, const Tp& value){
00180 initialize();
00181 m_data->resize(n,value);
00182 }
00183
00184 template <class Tp> size_t ora::QueryableVector<Tp>::capacity() const {
00185 return m_data->capacity();
00186 }
00187
00188 template <class Tp> bool ora::QueryableVector<Tp>::empty() const {
00189 initialize();
00190 return m_data->empty();
00191 }
00192
00193 template <class Tp> void ora::QueryableVector<Tp>::reserve(size_t n) {
00194 m_data->reserve(n);
00195 }
00196
00197 template <class Tp> typename ora::QueryableVector<Tp>::reference ora::QueryableVector<Tp>::operator[] ( size_t n ){
00198 initialize();
00199 return m_data->operator[](n);
00200 }
00201
00202 template <class Tp> typename ora::QueryableVector<Tp>::const_reference ora::QueryableVector<Tp>::operator[] ( size_t n ) const {
00203 initialize();
00204 return m_data->operator[](n);
00205 }
00206
00207 template <class Tp> typename ora::QueryableVector<Tp>::const_reference ora::QueryableVector<Tp>::at( size_t n ) const {
00208 initialize();
00209 return m_data->operator[](n);
00210 }
00211
00212 template <class Tp> typename ora::QueryableVector<Tp>::reference ora::QueryableVector<Tp>::at( size_t n ) {
00213 initialize();
00214 return m_data->operator[](n);
00215 }
00216
00217 template <class Tp> typename ora::QueryableVector<Tp>::reference ora::QueryableVector<Tp>::front ( ) {
00218 return m_data->front();
00219 }
00220
00221 template <class Tp> typename ora::QueryableVector<Tp>::const_reference ora::QueryableVector<Tp>::front ( ) const {
00222 return m_data->front();
00223 }
00224
00225 template <class Tp> typename ora::QueryableVector<Tp>::reference ora::QueryableVector<Tp>::back ( ) {
00226 return m_data->back();
00227 }
00228
00229 template <class Tp> typename ora::QueryableVector<Tp>::const_reference ora::QueryableVector<Tp>::back ( ) const {
00230 return m_data->back();
00231 }
00232
00233 template <class Tp> void ora::QueryableVector<Tp>::assign ( size_t n, const Tp& u ) {
00234 m_data->assign(n,u);
00235 }
00236
00237 template <class Tp> void ora::QueryableVector<Tp>::push_back ( const Tp& x ){
00238 initialize();
00239 m_isLocked = true;
00240 m_data->push_back(x);
00241 }
00242
00243 template <class Tp> void ora::QueryableVector<Tp>::pop_back (){
00244 initialize();
00245 m_isLocked = true;
00246 m_data->pop_back();
00247 }
00248
00249 template <class Tp> void ora::QueryableVector<Tp>::clear ( ){
00250 m_data->clear();
00251 m_isLoaded = false;
00252 }
00253
00254 template <class Tp> void ora::QueryableVector<Tp>::reset ( ){
00255 m_data->clear();
00256 m_isLoaded = false;
00257 m_isLocked = false;
00258 }
00259
00260 template <class Tp> bool ora::QueryableVector<Tp>::operator==(const ora::QueryableVector<Tp>& vec) const {
00261 initialize();
00262 vec.initialize();
00263 return m_data->operator==(*vec.m_data);
00264 }
00265
00266 template <class Tp> bool ora::QueryableVector<Tp>::operator!=(const ora::QueryableVector<Tp>& vec) const {
00267 initialize();
00268 vec.initialize();
00269 return m_data->operator!=(*vec.m_data);
00270 }
00271
00272 template <class Tp> size_t ora::QueryableVector<Tp>::persistentSize() const {
00273
00274
00275 return m_data->persistentSize();
00276 }
00277
00278 template <class Tp> const void* ora::QueryableVector<Tp>::storageAddress() const {
00279 return m_data->storageAddress();
00280 }
00281
00282 template <class Tp> void ora::QueryableVector<Tp>::load() const {
00283 initialize();
00284 }
00285
00286 template <class Tp> void ora::QueryableVector<Tp>::initialize() const {
00287 if(hasLoader() && !m_isLocked && !m_isLoaded){
00288 loader()->load(const_cast<void*>(m_data->storageAddress()));
00289 m_isLoaded = true;
00290 }
00291 }
00292
00293 #endif //