dynamic-array.hh
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __GECODE_SUPPORT_DYNAMICARRAY_HH__
00023 #define __GECODE_SUPPORT_DYNAMICARRAY_HH__
00024
00025 #include "gecode/kernel.hh"
00026
00027 #include <algorithm>
00028 #include <cassert>
00029
00030 namespace Gecode { namespace Support {
00031
00038 template <class T>
00039 class DynamicArray {
00040 private:
00042 int n;
00044 T* x;
00046 void resize(int n);
00047 public:
00049 DynamicArray(int m = 32);
00051 DynamicArray(const DynamicArray<T>& a);
00053 ~DynamicArray(void);
00054
00056 const DynamicArray<T>& operator =(const DynamicArray<T>& a);
00057
00059 T& operator[](int i);
00061 const T& operator [](int) const;
00062
00064 operator T*(void);
00065 };
00066
00067
00068 template <class T>
00069 forceinline
00070 DynamicArray<T>::DynamicArray(int m)
00071 : n(m), x(Memory::bmalloc<T>(n)) {}
00072
00073 template <class T>
00074 forceinline
00075 DynamicArray<T>::DynamicArray(const DynamicArray<T>& a)
00076 : n(a.n), x(Memory::bmalloc<T>(n)) {
00077 (void) Memory::bcopy<T>(x,a.x,n);
00078 }
00079
00080 template <class T>
00081 forceinline
00082 DynamicArray<T>::~DynamicArray(void) {
00083 Memory::free(x);
00084 }
00085
00086 template <class T>
00087 forceinline const DynamicArray<T>&
00088 DynamicArray<T>::operator =(const DynamicArray<T>& a) {
00089 if (this != &a) {
00090 if (n < a.n) {
00091 Memory::free(x); n = a.n; x = Memory::bmalloc<T>(n);
00092 }
00093 (void) Memory::bcopy(x,a.x,n);
00094 }
00095 return *this;
00096 }
00097
00098 template <class T>
00099 void
00100 DynamicArray<T>::resize(int i) {
00101 int m = std::max(i+1, (3*n)/2);
00102 x = Memory::brealloc(x,n,m);
00103 n = m;
00104 }
00105
00106 template <class T>
00107 forceinline T&
00108 DynamicArray<T>::operator [](int i) {
00109 if (i >= n) resize(i);
00110 assert(n > i);
00111 return x[i];
00112 }
00113
00114 template <class T>
00115 forceinline const T&
00116 DynamicArray<T>::operator [](int i) const {
00117 assert(n > i);
00118 return x[i];
00119 }
00120
00121 template <class T>
00122 forceinline
00123 DynamicArray<T>::operator T*(void) {
00124 return x;
00125 }
00126
00127 }}
00128
00129 #endif
00130
00131