00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef VRS_CONTAINER_DATAITERATOR_H
00021 #define VRS_CONTAINER_DATAITERATOR_H
00022
00023 #include <vrs/container/iterator.h>
00024 #include <vrs/container/stl_serialization.h>
00025
00026 namespace VRS {
00027
00028 template<typename T>
00029 inline const T* DataIterator_pointer_impl(
00030 const std::vector<T>& data
00031 ) {
00032 return (data.empty() ? NULL : &data[0]);
00033 }
00034
00035
00036 inline const bool* DataIterator_pointer_impl(
00037 const std::vector<bool>& data
00038 ) {
00039 return NULL;
00040 }
00041
00043 template<typename T>
00044 class DataIterator :
00045 public Iterator<T>
00046 {
00047 public:
00048 VRS_TYPEINFO(DataIterator, Iterator<T>);
00049 VRS_SERIALIZABLE(DataIterator);
00050
00051 public:
00052 DataIterator() :
00053 data()
00054 { }
00055
00056 DataIterator(unsigned int size) :
00057 data(size)
00058 { }
00059
00060 DataIterator(unsigned int size, const T& init) :
00061 data(size, init)
00062 { }
00063
00064 DataIterator(SO<Iterator<T> > iter) :
00065 data()
00066 {
00067 if(iter) { data.assign(iter->beginSTL(), iter->endSTL()); }
00068 }
00069
00070 template<typename S>
00071 DataIterator(const std::vector<S>& other) :
00072 data(other)
00073 { }
00074
00075 template<class FORWARD_ITERATOR>
00076 DataIterator(FORWARD_ITERATOR begin, FORWARD_ITERATOR end) :
00077 data(begin, end)
00078 { }
00079
00080 public:
00081 virtual unsigned int size() const { return static_cast<unsigned int>(data.size()); }
00082
00083 virtual T get(unsigned int index) const {
00084 VRS_CheckArg(index < size(), "index out of range");
00085 return data[index];
00086 }
00087
00088 virtual const T* pointer() const {
00089 return DataIterator_pointer_impl(data);
00090 }
00091
00092 public:
00093 void set(unsigned int index, const T& obj) {
00094 VRS_CheckArg(index < size(), "index out of range");
00095 data[index] = obj;
00096 }
00097
00098 void append(const T& obj) {
00099 data.push_back(obj);
00100 }
00101
00102 void append(SO<Iterator<T> > iter) {
00103 if (iter) {
00104 data.insert(data.end(), iter->beginSTL(), iter->endSTL());
00105 }
00106 }
00107
00108 void clear() {
00109 data.clear();
00110 }
00111
00112 public:
00113 typename std::vector<T>::const_reference operator[](unsigned int index) const {
00114 VRS_CheckArg(index < size(), "index out of range");
00115 return data[index];
00116 }
00117
00118 typename std::vector<T>::reference operator[](unsigned int index) {
00119 VRS_CheckArg(index < size(), "index out of range");
00120 return data[index];
00121 }
00122
00123 public:
00124 std::vector<T> data;
00125 };
00126
00127 template<typename T>
00128 inline void DataIterator<T>::serialize(
00129 SerializationManager& manager
00130 ) {
00131 VRS_SERIALIZATION_PARENT_CLASS(manager, Iterator<T>);
00132 serialization(manager, "data", data);
00133 }
00134
00135 VRS_SERIALIZATION_REGISTRATION_TEMPLATE(DataIterator);
00136
00137
00138
00141 template<typename T>
00142 class NonPersistentDataIterator :
00143 public Iterator<T>
00144 {
00145 public:
00146 VRS_TYPEINFO(NonPersistentDataIterator, Iterator<T>);
00147
00148 public:
00149 NonPersistentDataIterator() :
00150 data()
00151 { }
00152
00153 NonPersistentDataIterator(unsigned int size) :
00154 data(size)
00155 { }
00156
00157 NonPersistentDataIterator(unsigned int size, const T& init) :
00158 data(size, init)
00159 { }
00160
00161 NonPersistentDataIterator(SO<Iterator<T> > iter) :
00162 data()
00163 {
00164 if(iter) { data.assign(iter->begin(), iter->end()); }
00165 }
00166
00167 template<typename S>
00168 NonPersistentDataIterator(const std::vector<S>& other) :
00169 data(other)
00170 { }
00171
00172 template<class FORWARD_ITERATOR>
00173 NonPersistentDataIterator(FORWARD_ITERATOR begin, FORWARD_ITERATOR end) :
00174 data(begin, end)
00175 { }
00176
00177 public:
00178 virtual unsigned int size() const { return static_cast<unsigned int>(data.size()); }
00179
00180 virtual T get(unsigned int index) const {
00181 VRS_CheckArg(index < size(), "index out of range");
00182 return data[index];
00183 }
00184
00185 public:
00186 void set(unsigned int index, const T& obj) {
00187 VRS_CheckArg(index < size(), "index out of range");
00188 data[index] = obj;
00189 }
00190
00191 void append(const T& obj) {
00192 data.push_back(obj);
00193 }
00194
00195 void append(SO<Iterator<T> > iter) {
00196 if (iter) {
00197 data.insert(data.end(), iter->beginSTL(), iter->endSTL());
00198 }
00199 }
00200
00201 void clear() {
00202 data.clear();
00203 }
00204
00205 public:
00206 typename std::vector<T>::const_reference operator[](unsigned int index) const {
00207 VRS_CheckArg(index < size(), "index out of range");
00208 return data[index];
00209 }
00210
00211 typename std::vector<T>::reference operator[](unsigned int index) {
00212 VRS_CheckArg(index < size(), "index out of range");
00213 return data[index];
00214 }
00215
00216 public:
00217 std::vector<T> data;
00218 };
00219
00220 }
00221
00222 #endif // VRS_CONTAINER_DATAITERATOR_H