00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef BL_ARRAY_H
00024 #define BL_ARRAY_H
00025
00026
00027
00028
00029 #if defined(BL_OLD_STL)
00030 #include <stddef.h>
00031 #else
00032 #include <cstddef>
00033 #endif
00034
00035 #include <vector>
00036
00037 #include <BLassert.H>
00038 #include <BoxLib.H>
00039
00040 template <class T> class Array;
00041
00042
00043
00045
00080 template <class T>
00081 class Array
00082 :
00083 public std::vector<T>
00084 {
00085 public:
00086
00088
00089 Array ();
00090
00094 explicit Array (size_t len);
00095
00099 Array (size_t len,
00100 const T& initialvalue);
00101
00105 Array (const T* vec,
00106 size_t len);
00107
00108 int size () const;
00109
00114 T& operator[] (size_t i);
00115
00117
00118 const T& operator[] (size_t i) const;
00119
00120
00122
00123 T& get (size_t i);
00124
00126
00127 const T& get (size_t i) const;
00128
00133 T* dataPtr ();
00134
00136
00137 const T* dataPtr () const;
00138
00140
00141 void set (size_t i,
00142 const T& elem);
00143
00145
00146 void swap (size_t i,
00147 size_t j);
00148 private:
00149
00150
00151
00152 Array<T>& operator= (int);
00153 };
00154
00155 template <class T>
00156 inline
00157 int
00158 Array<T>::size () const
00159 {
00160 const std::vector<T>& a = *this;
00161 return a.size();
00162 }
00163
00164 template <class T>
00165 inline
00166 T&
00167 Array<T>::operator[] (size_t i)
00168 {
00169 BL_ASSERT(i < size());
00170 std::vector<T>& a = *this;
00171 return a[i];
00172 }
00173
00174 template <class T>
00175 inline
00176 const T&
00177 Array<T>::operator[] (size_t i) const
00178 {
00179 BL_ASSERT(i < size());
00180 const std::vector<T>& a = *this;
00181 return a[i];
00182 }
00183
00184 template <class T>
00185 inline
00186 T&
00187 Array<T>::get (size_t i)
00188 {
00189 BL_ASSERT(i < size());
00190 return this->operator[](i);
00191 }
00192
00193 template <class T>
00194 inline
00195 const T&
00196 Array<T>::get (size_t i) const
00197 {
00198 BL_ASSERT(i < size());
00199 return std::vector<T>::operator[](i);
00200 }
00201
00202 template <class T>
00203 inline
00204 void
00205 Array<T>::set (size_t i,
00206 const T& elem)
00207 {
00208 get(i) = elem;
00209 }
00210
00211 template <class T>
00212 inline
00213 T*
00214 Array<T>::dataPtr ()
00215 {
00216 return &this->operator[](0);
00217 }
00218
00219 template <class T>
00220 inline
00221 const T*
00222 Array<T>::dataPtr () const
00223 {
00224 return &this->operator[](0);
00225 }
00226
00227 template <class T>
00228 Array<T>::Array ()
00229 :
00230 std::vector<T>()
00231 {}
00232
00233 template <class T>
00234 Array<T>::Array (size_t len)
00235 :
00236 std::vector<T>(len)
00237 {}
00238
00239 template <class T>
00240 Array<T>::Array (size_t len,
00241 const T& initialValue)
00242 :
00243 std::vector<T>(len, initialValue)
00244 {}
00245
00246 template <class T>
00247 Array<T>::Array (const T* vec,
00248 size_t len)
00249 :
00250 std::vector<T>(len)
00251 {
00252 BL_ASSERT(len == 0 || vec != 0);
00253
00254 for (size_t i = 0; i < len; ++i)
00255 {
00256 this->operator[](i) = vec[i];
00257 }
00258 }
00259
00260 #endif