chxavvector.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:5k
源码类别:

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * chxavvector.h
  3.  * -------------
  4.  *
  5.  * Synopsis:
  6.  * Vector template container class.
  7.  *
  8.  *
  9.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  10.  *
  11.  ************************************************************************/
  12. #ifndef _chxavvector_h_
  13. #define _chxavvector_h_
  14. #include <stdlib.h>
  15. // Symbian
  16. #include <e32std.h>
  17. #define NEW new (ELeave)
  18. template<class T> class CHXAvVectorRep;
  19. template<class T> class CHXAvVector;
  20. template<class T>
  21. class CHXAvVectorRep {
  22. private:
  23. //friend class CHXAvVector<T>;
  24. public:
  25.   CHXAvVectorRep(T* v, int len, int ownbase);
  26.   ~CHXAvVectorRep();
  27.   void Resize(int len, int exact);
  28.   static void Copy(T* src, T* dest, int len);
  29.   int Length();
  30.   T* Base();
  31.   
  32.   T* base_; // base address of vector
  33.   int len_; // current length of vector
  34.   int maxlen_; // maximum lenght of vector
  35.   int ownbase_; // if 1, own the base address
  36.   int refcount_; // reference count
  37. };
  38. /**    CHXAvVectorRep<T>    **/
  39. template<class T>
  40. void CHXAvVectorRep<T>::Resize(int len, int exact)
  41. {
  42.   if (len > maxlen_) {
  43.     if (exact)
  44.       maxlen_ = len;
  45.     else {
  46.       maxlen_ = 2;
  47.       while (maxlen_ < len) maxlen_ <<= 1;
  48.     }
  49.     T* new_base = NEW T[maxlen_];
  50.     Copy(base_, new_base, len_);
  51.     if (ownbase_)
  52.       delete [] base_;
  53.     base_ = new_base;
  54.     ownbase_ = 1;
  55.   }
  56.   len_ = len;
  57. }
  58. template<class T>
  59. inline
  60. void CHXAvVectorRep<T>::Copy(T* src, T* dest, int len)
  61. {
  62.   while (len-- > 0) *dest++ = *src++;
  63. }
  64. /**    CHXAvVector<T>    **/
  65. template<class T>
  66. class CHXAvVector {
  67. public:
  68.   CHXAvVector(int nelem = 0);
  69.   CHXAvVector(T* v, int nelem, int ownbase=0);
  70.   CHXAvVector(const CHXAvVector<T>& v);
  71.   ~CHXAvVector();
  72.   CHXAvVector<T>& operator=(const CHXAvVector<T>& v);
  73.   T& operator[](int index);
  74.   const T& operator[](int index) const;
  75.   operator T* ();
  76.   operator T* () const;
  77.   void Copy(const CHXAvVector<T>& v);
  78.   int Nelements() const;
  79.   int ElemSize() const;
  80.   void Bind(T* v, int nelem, int ownbase=0);
  81.   void Resize(int nelem);
  82.   void Fill(const T& t, int start, int n);
  83.   void Reverse();
  84.   void Sort(int (*cmp)(const void*, const void*));
  85. private:
  86.   CHXAvVectorRep<T>* rep_;
  87. };
  88. /**    CHXAvVector<T>    **/
  89. template<class T>
  90. /*inline*/
  91. void CHXAvVector<T>::Copy(const CHXAvVector<T>& v)
  92. {
  93.   if (&v != this) {
  94.     if (--rep_->refcount_ == 0)
  95.       delete rep_;
  96.     int nelem = v.Nelements();
  97.     T* base = nelem > 0 ? NEW T[nelem] : 0;
  98.     rep_ = NEW CHXAvVectorRep<T>(base, nelem, 1);
  99.     if (nelem > 0)
  100.       CHXAvVectorRep<T>::Copy(v.rep_->base_, rep_->base_, nelem);
  101.   }
  102. }
  103. template<class T>
  104. /*inline*/
  105. void CHXAvVector<T>::Fill(const T& t, int start, int n)
  106. {
  107.   T* vec = rep_->Base();
  108.   if (start < 0) start = 0;
  109.   if (n+start > Nelements()) n = Nelements()-start;
  110.   vec += start;
  111.   while (n-- > 0)
  112.     *vec++ = t;
  113. }
  114. template<class T>
  115. inline
  116. void CHXAvVector<T>::Reverse()
  117. {
  118.   T* l = rep_->Base();
  119.   T* u = l + Nelements()-1;
  120.   while (l < u) {
  121.     T t = *l;
  122.     *l++ = *u;
  123.     *u-- = t;
  124.   }
  125. }
  126. template<class T>
  127. inline CHXAvVector<T>::CHXAvVector(int nelem)
  128. {
  129.   T* base = nelem > 0 ? NEW T[nelem] : 0; //XXXLCM leave
  130.   rep_ = NEW CHXAvVectorRep<T>(base, nelem, 1);
  131. }
  132. template<class T>
  133. inline CHXAvVector<T>::CHXAvVector(T* v, int nelem, int ownbase)
  134. {
  135.   rep_ = NEW CHXAvVectorRep<T>(v, nelem, ownbase);
  136. }
  137. template<class T>
  138. inline CHXAvVector<T>::CHXAvVector(const CHXAvVector<T>& v)
  139. {
  140.   v.rep_->refcount_++;
  141.   rep_ = v.rep_;
  142. }
  143. template<class T>
  144. inline CHXAvVector<T>::~CHXAvVector()
  145. {
  146.   if (--rep_->refcount_ == 0)
  147.     delete rep_;
  148. }
  149. template<class T>
  150. inline CHXAvVector<T>& CHXAvVector<T>::operator=(const CHXAvVector<T>& v)
  151. {
  152.   if (this != &v) {
  153.     v.rep_->refcount_++;
  154.     if (--rep_->refcount_ == 0)
  155.       delete rep_;
  156.     rep_ = v.rep_;
  157.   }
  158.   return *this;
  159. }
  160. template<class T>
  161. inline CHXAvVectorRep<T>::CHXAvVectorRep(T* v, int len, int ownbase)
  162. : base_(v), len_(len), maxlen_(len), ownbase_(ownbase), refcount_(1)
  163. {}
  164. template<class T>
  165. inline CHXAvVectorRep<T>::~CHXAvVectorRep()
  166. {
  167.   if (ownbase_)
  168.     delete [] base_;
  169. }
  170. template<class T>
  171. inline int CHXAvVectorRep<T>::Length()
  172. {
  173.   return len_;
  174. }
  175. template<class T>
  176. inline T* CHXAvVectorRep<T>::Base()
  177. {
  178.   return base_;
  179. }
  180. template<class T>
  181. inline T& CHXAvVector<T>::operator[](int index)
  182. {
  183.   return (rep_->Base())[index];
  184. }
  185. template<class T>
  186. inline const T& CHXAvVector<T>::operator[](int index) const
  187. {
  188.   return (rep_->Base())[index];
  189. }
  190. template<class T>
  191. inline CHXAvVector<T>::operator T* ()
  192. {
  193.   return rep_->Base();
  194. }
  195. template<class T>
  196. inline CHXAvVector<T>::operator T* () const
  197. {
  198.   return rep_->Base();
  199. }
  200. template<class T>
  201. inline int CHXAvVector<T>::Nelements() const
  202. {
  203.   return rep_->Length();
  204. }
  205. template<class T>
  206. inline int CHXAvVector<T>::ElemSize() const
  207. {
  208.   return sizeof(T);
  209. }
  210. template<class T>
  211. inline void CHXAvVector<T>::Bind(T* v, int nelem, int ownbase)
  212. {
  213.   if (--rep_->refcount_ == 0)
  214.     delete rep_;
  215.   rep_ = NEW CHXAvVectorRep<T>(v, nelem, ownbase);
  216. }
  217. template<class T>
  218. inline void CHXAvVector<T>::Sort(int (*cmp)(const void*, const void*))
  219. {
  220.   qsort(rep_->Base(), Nelements(), sizeof(T), cmp);
  221. }
  222. template<class T>
  223. inline void CHXAvVector<T>::Resize(int nelem)
  224. {
  225.   rep_->Resize(nelem, 0);
  226. }
  227. #endif /* _chxavvector_h_ */