00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 #ifndef VRS_CONTAINER_STATICARRAY_H
00117 #define VRS_CONTAINER_STATICARRAY_H
00118
00119 #include <vrs/container/iterator.h>
00120 #include <algorithm>
00121
00122 namespace VRS {
00123
00124 template<typename T> class StaticArrayIterator;
00125
00127 template<typename T>
00128 class NonPersistentStaticArray : public SharedObj {
00129 public:
00130 NonPersistentStaticArray(unsigned int size) : iterator_(NULL), size_(size), data_(new T[size]) { }
00131 NonPersistentStaticArray(unsigned int size, const T& initValue);
00132 NonPersistentStaticArray(const Iterator<T>* iter);
00133 virtual ~NonPersistentStaticArray() { delete [] data_; }
00139 unsigned int size() const { return size_; }
00141
00142 bool isEmpty() const { return (size_ == 0); }
00144 void setElement(unsigned int index, const T& obj);
00145 T getElement(unsigned int index) const { return operator[](index); }
00146
00147 T& operator[](unsigned int index);
00148 const T& operator[](unsigned int index) const;
00150
00151 T* pointer() { return data_; }
00152 const T* pointer() const { return data_; }
00154
00155 virtual Iterator<T>* newIterator() const;
00157
00158 VRS_TYPEINFO(NonPersistentStaticArray, SharedObj);
00159 VRS_SERIALIZABLE_ABSTRACT_CLASS(NonPersistentStaticArray);
00160
00161 public:
00162
00163
00164 T* beginSTL() { return data_; }
00165 const T* beginSTL() const { return data_; }
00166 T* endSTL() { return (data_ + size_); }
00167 const T* endSTL() const { return (data_ + size_); }
00168
00169 protected:
00170 NonPersistentStaticArray() : iterator_(NULL), size_(0), data_(NULL) { }
00171
00172 friend class StaticArrayIterator<T>;
00173 mutable Iterator<T>* iterator_;
00174
00175 private:
00176 NonPersistentStaticArray(const NonPersistentStaticArray&);
00177 NonPersistentStaticArray& operator=(const NonPersistentStaticArray&);
00178
00179 protected:
00180 unsigned int size_;
00181 T* data_;
00182 };
00183
00184 template<typename T>
00185 NonPersistentStaticArray<T>::NonPersistentStaticArray(unsigned int size, const T& initValue)
00186 : iterator_(NULL), size_(size), data_(new T[size]) {
00187 std::fill(data_, data_ + size, initValue);
00188 }
00189
00190 template<typename T>
00191 NonPersistentStaticArray<T>::NonPersistentStaticArray(const Iterator<T>* iter)
00192 : iterator_(NULL), size_(0), data_(NULL) {
00193 VRS_CheckArg(iter, "no iterator");
00194 SO<const Iterator<T> > it = iter;
00195 size_ = iter->size();
00196 data_ = new T[size_];
00197 std::copy(iter->beginSTL(), iter->endSTL(), data_);
00198 }
00199
00200 template<typename T>
00201 inline T& NonPersistentStaticArray<T>::operator[](unsigned int index) {
00202 VRS_CheckArg(index < size_, "index out of range: " << index << " < " << size_);
00203 return data_[index];
00204 }
00205
00206 template<typename T>
00207 inline const T& NonPersistentStaticArray<T>::operator[](unsigned int index) const {
00208 VRS_CheckArg(index < size_, "index out of range: " << index << " < " << size_);
00209 return data_[index];
00210 }
00211
00212 template<typename T>
00213 inline void NonPersistentStaticArray<T>::setElement(unsigned int index, const T& element){
00214 VRS_CheckArg(index < size_, "index out of range: " << index << " < " << size_);
00215 data_[index] = element;
00216 }
00217
00218 template<typename T>
00219 Iterator<T>* NonPersistentStaticArray<T>::newIterator() const {
00220 return (iterator_ ? iterator_ : new StaticArrayIterator<T>(this));
00221 }
00222
00223 template<typename T>
00224 void NonPersistentStaticArray<T>::serialize(SerializationManager&) {
00225 VRS_NoImpl(NonPersistentStaticArray<T>::ClassNameVRS() << "::serialize() not supported: use StaticArray<T> for serialization!");
00226 }
00227
00228
00229 template<typename T>
00230 class StaticArray : public NonPersistentStaticArray<T> {
00231 public:
00232 StaticArray(unsigned int size) : NonPersistentStaticArray<T>(size) { }
00233 StaticArray(unsigned int size, const T& initValue) : NonPersistentStaticArray<T>(size, initValue) { }
00234 StaticArray(const Iterator<T>* iter) : NonPersistentStaticArray<T>(iter) { }
00235
00236 VRS_TYPEINFO(StaticArray, NonPersistentStaticArray<T>);
00237 VRS_SERIALIZABLE(StaticArray);
00238
00239 protected:
00240 StaticArray() : NonPersistentStaticArray<T>() { }
00241
00242 private:
00243 StaticArray(const StaticArray&);
00244 StaticArray& operator=(const StaticArray&);
00245 };
00246
00247 template<typename T>
00248 void StaticArray<T>::serialize(SerializationManager& doc) {
00249 UINT8 version = 0;
00250 doc.classVersion(version);
00251
00252 VRS_SERIALIZATION_PARENT_CLASS(doc, SharedObj);
00253 serialization(doc, "Size", this->size_);
00254
00255 if(doc.isReading()) {
00256 delete [] this->data_;
00257 this->data_ = new T[this->size_];
00258 }
00259
00260 for(unsigned int i = 0; i < this->size_; ++i) {
00261 serialization(doc, "Value", this->data_[i]);
00262 }
00263
00264 if (!doc.isReading() && !doc.isWriting()) {
00265 T obj;
00266 serialization(doc, "Value", obj);
00267 }
00268 }
00269
00270 VRS_SERIALIZATION_REGISTRATION_TEMPLATE(StaticArray)
00271
00272 template<typename T>
00273 class StaticArrayIterator : public Iterator<T> {
00274 public:
00275 StaticArrayIterator(const NonPersistentStaticArray<T>* array)
00276 : array_(const_cast<NonPersistentStaticArray<T>*>(array)) {
00277 VRS_CheckArg(array, "no array");
00278 array_->iterator_ = this;
00279 }
00280 virtual ~StaticArrayIterator() { array_->iterator_ = NULL; }
00281
00282 virtual unsigned int size() const { return array_->size(); }
00283 virtual T get(unsigned int index) const { return (*array_)[index]; }
00284
00285 virtual const T* pointer() const { return array_->pointer(); }
00286 virtual SharedObj* container() const { return array_; }
00287
00288 VRS_TYPEINFO(StaticArrayIterator, Iterator<T>);
00289 VRS_SERIALIZABLE(StaticArrayIterator);
00290
00291 protected:
00292 StaticArrayIterator() { }
00293
00294 private:
00295 SO<NonPersistentStaticArray<T> > array_;
00296 };
00297
00298 template<typename T>
00299 void StaticArrayIterator<T>::serialize(SerializationManager& doc) {
00300 VRS_SERIALIZATION_PARENT_CLASS(doc, Iterator<T>);
00301 serialization(doc, "Array", array_);
00302 }
00303
00304 VRS_SERIALIZATION_REGISTRATION_TEMPLATE(StaticArrayIterator)
00305
00306 }
00307
00308 #endif // VRS_CONTAINER_STATICARRAY_H