Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

DbVArray.h

Go to the documentation of this file.
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

Generated at Wed Nov 21 12:22:20 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000