00001 //==================================================================== 00002 // dbVarray implementation 00003 //-------------------------------------------------------------------- 00004 // 00005 // Package : System ( The LHCb Offline System) 00006 // 00007 // Description: Management of the open Db files 00008 // 00009 // Author : M.Frank 00010 // History : 00011 // +---------+----------------------------------------------+--------- 00012 // | Date | Comment | Who 00013 // +---------+----------------------------------------------+--------- 00014 // | 11/07/99| Initial version | MF 00015 // +---------+----------------------------------------------+--------- 00016 //==================================================================== 00017 #ifndef DBCNV_DBVARRAY_H 00018 #define DBCNV_DBVARRAY_H 1 00019 00020 // Framework include files 00021 #include "GaudiDb/DbOOMs.h" 00022 // STL include files 00023 #include <vector> 00024 00025 // Forward declarations 00026 template <class T> class dbIterator; 00027 template <class T> class dbVarray; 00028 00049 template <class T> class dbIterator { 00051 dbVarray<T>& m_buffer; 00053 long m_ptr; 00054 public: 00056 dbIterator( const dbVarray<T>& arr ) : m_buffer(arr), m_ptr(0) { 00057 } 00059 dbIterator( const dbIterator<T>& it ) : m_buffer(it.m_buffer), m_ptr(it.m_ptr) { 00060 } 00062 dbIterator& operator=(const dbIterator<T>& it); 00064 const T& get_element() const; 00066 int next(T& ref); 00068 int not_done() const; 00070 dbIterator& operator++() { 00071 advance(); 00072 return *this; 00073 } 00075 dbIterator& operator++(int) { 00076 advance(); 00077 return *this; 00078 } 00080 void advance() { 00081 m_ptr++; 00082 } 00084 void reset() { 00085 m_ptr = 0; 00086 } 00087 }; 00088 00089 00110 template <class T> class dbVarray : private std::vector<T> { 00112 typedef std::vector<T> _Base; 00113 // The following is NOT in the standard ?? 00114 const T& elem(long i) const { 00115 return _Base::operator[](i); 00116 } 00117 public: 00119 typedef _Base::iterator iterator; 00120 typedef _Base::const_iterator const_iterator; 00122 iterator begin() { 00123 return _Base::begin(); 00124 } 00126 const_iterator begin() const { 00127 return _Base::begin(); 00128 } 00130 iterator end() { 00131 return _Base::end(); 00132 } 00134 const_iterator end() const { 00135 return _Base::end(); 00136 } 00138 dbVarray() { 00139 } 00141 dbVarray(long siz) { 00142 resize(siz); 00143 } 00145 dbVarray(const dbVarray<T>& copy) { 00146 *this = copy; 00147 } 00149 virtual ~dbVarray() { 00150 } 00152 dbVarray& operator =(const dbVarray<T>& copy) { 00153 _Base::operator=(copy); 00154 return *this; 00155 } 00157 T& elem(long i) { 00158 return _Base::operator[](i); 00159 } 00161 void resize(long length) { 00162 // if ( length < (long)_Base::size() ) { 00163 // iterator i = begin(); 00164 // for ( long count = 0; count < length; count++ ) i++; 00165 // erase(i, end()); 00166 // } 00167 // else { 00168 // for ( long count = _Base::size(); count < length; count++ ) { 00169 // _Base::push_back(T()); 00170 // } 00171 _Base::resize(length); 00172 // } 00173 } 00174 char* increase(long length) { 00175 _Base::resize(length+size()); 00176 return (char*)&elem(0); 00177 } 00179 long cardinality() const { 00180 return size(); 00181 } 00183 const T& retrieve_element_at(long which) { 00184 return elem(i); 00185 } 00187 int is_empty() const { 00188 return size() == 0; 00189 } 00191 void remove_all() { 00192 resize(0); 00193 } 00195 DbResult extend(const T& val) { 00196 set(size(), val); 00197 return DbOOMs::DbSuccess; 00198 } 00200 void insert_element(const T& val) { 00201 set(size(), val); 00202 } 00204 void replace_element_at(const T& val, long i) { 00205 set(i, val); 00206 } 00208 void replace_element_at(const T& val, const dbIterator<T>& it) { 00209 (*it) = val; 00210 } 00212 void set(long i, const T& arg) { 00213 if ( size() < i+1 ) { 00214 resize(i+1); 00215 } 00216 elem(i) = arg; 00217 } 00219 T& operator[] (long i) { 00220 return elem(i); 00221 } 00223 const T& operator[] (long i) const { 00224 return elem(i); 00225 } 00227 long size() const { 00228 return _Base::size(); 00229 } 00231 long upper_bound() const { 00232 return size(); 00233 } 00235 dbIterator<T> create_iterator() const { 00236 return dbIterator<T>(*this); 00237 } 00238 }; 00239 00240 //############################################################################## 00241 // Inline code 00242 //############################################################################## 00243 00244 template <class T> inline 00245 dbIterator<T>& dbIterator<T>::operator=(const dbIterator<T>& it) { 00246 m_buffer = it.m_buffer; 00247 m_ptr = it.m_ptr; 00248 return *this; 00249 } 00250 template <class T> inline 00251 const T& dbIterator<T>::get_element() const { 00252 return m_buffer[m_ptr]; 00253 } 00254 template <class T> inline 00255 int dbIterator<T>::next(T& ref) { 00256 if ( not_done() ) { 00257 ref = (0==m_ptr) ? m_buffer.elem(0) : m_buffer.elem(++m_ptr); 00258 return 1; 00259 } 00260 return 0; 00261 } 00262 template <class T> inline 00263 int dbIterator<T>::not_done() const { 00264 return m_ptr < m_buffer.size()-1; 00265 } 00266 #endif // DBCNV_DBVARRAY_H
1.2.3 written by Dimitri van Heesch,
© 1997-2000