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 #ifndef VRS_CONTAINER_FIXEDSIZEITERATOR_H
00038 #define VRS_CONTAINER_FIXEDSIZEITERATOR_H
00039
00040 #include <vrs/container/iterator.h>
00041 #include <vrs/container/stl_serialization.h>
00042
00043 namespace VRS {
00044
00046 template<typename T>
00047 class FixedSizeIterator :
00048 public Iterator<T>
00049 {
00050 public:
00051 VRS_TYPEINFO(FixedSizeIterator, Iterator<T>);
00052 VRS_SERIALIZABLE(FixedSizeIterator);
00053
00054 public:
00055 FixedSizeIterator(unsigned int size) :
00056 m_size(size),
00057 m_data((size > 0) ? new T[size] : NULL)
00058 { }
00059
00060 FixedSizeIterator(unsigned int size, const T& init) :
00061 m_size(size),
00062 m_data((size > 0) ? new T[size] : NULL)
00063 {
00064 if(size > 0) { std::fill(m_data, m_data + size, init); }
00065 }
00066
00067 FixedSizeIterator(SO<Iterator<T> > iter) :
00068 m_size(0),
00069 m_data(NULL)
00070 {
00071 if(iter) {
00072 m_size = iter->size();
00073 m_data = new T[m_size];
00074 std::copy(iter->beginSTL(), iter->endSTL(), m_data);
00075 }
00076 }
00077
00078 template<typename S>
00079 FixedSizeIterator(const std::vector<S>& other) :
00080 m_size(static_cast<unsigned int>(other.size())),
00081 m_data((m_size > 0) ? new T[other.size()] : NULL)
00082 {
00083 std::copy(other.begin(), other.end(), m_data);
00084 }
00085
00086 template<class FORWARD_ITERATOR>
00087 FixedSizeIterator(FORWARD_ITERATOR begin, FORWARD_ITERATOR end) :
00088 m_size(static_cast<unsigned int>(std::distance(begin, end))),
00089 m_data((m_size > 0) ? new T[m_size] : NULL)
00090 {
00091 std::copy(begin, end, m_data);
00092 }
00093
00094 virtual ~FixedSizeIterator() {
00095 delete [] m_data;
00096 }
00097
00098 public:
00099 virtual unsigned int size() const { return m_size; }
00100
00101 virtual T get(unsigned int index) const {
00102 VRS_CheckArg(index < m_size, "index out of range");
00103 return m_data[index];
00104 }
00105
00106 public:
00107 void set(unsigned int index, const T& obj) {
00108 VRS_CheckArg(index < m_size, "index out of range");
00109 m_data[index] = obj;
00110 }
00111
00112 public:
00113 const T& operator[](unsigned int index) const {
00114 VRS_CheckArg(index < m_size, "index out of range");
00115 return m_data[index];
00116 }
00117
00118 T& operator[](unsigned int index) {
00119 VRS_CheckArg(index < m_size, "index out of range");
00120 return m_data[index];
00121 }
00122
00123 public:
00124 const T* pointer() const { return m_data; }
00125 T* pointer() { return m_data; }
00126
00127 protected:
00128 FixedSizeIterator() : m_size(0), m_data(NULL) { }
00129
00130 private:
00131 unsigned int m_size;
00132 T* m_data;
00133 };
00134
00135 template<typename T>
00136 inline void FixedSizeIterator<T>::serialize(
00137 SerializationManager& manager
00138 ) {
00139 VRS_SERIALIZATION_PARENT_CLASS(manager, Iterator<T>);
00140
00141 serialization(manager, "size", m_size, 0u);
00142
00143 bool asRaw = manager.canHandleRawData() && CanWriteAsRawData<T>::value;
00144 serialization(manager, "asRaw", asRaw, false);
00145
00146 if(manager.isReading()) {
00147 delete [] m_data;
00148 m_data = (m_size > 0) ? new T[m_size] : NULL;
00149 }
00150
00151 if(asRaw) {
00152 serializationRawData(manager, "raw", m_data, m_size * sizeof(T));
00153 } else {
00154 for(unsigned int i = 0; i < m_size; ++i) {
00155 serialization(manager, "value", m_data[i]);
00156 }
00157 }
00158 }
00159
00160 VRS_SERIALIZATION_REGISTRATION_TEMPLATE(FixedSizeIterator);
00161
00162
00163
00166 template<typename T>
00167 class NonPersistentFixedSizeIterator :
00168 public Iterator<T>
00169 {
00170 public:
00171 VRS_TYPEINFO(NonPersistentFixedSizeIterator, Iterator<T>);
00172
00173 public:
00174 NonPersistentFixedSizeIterator(unsigned int size) :
00175 m_size(size),
00176 m_data((size > 0) ? new T[size] : NULL)
00177 { }
00178
00179 NonPersistentFixedSizeIterator(unsigned int size, const T& init) :
00180 m_size(size),
00181 m_data((size > 0) ? new T[size] : NULL)
00182 {
00183 if(size > 0) { std::fill(m_data, m_data + size, init); }
00184 }
00185
00186 template<typename S>
00187 NonPersistentFixedSizeIterator(const std::vector<S>& other) :
00188 m_size(other.size()),
00189 m_data((m_size > 0) ? new T[other.size()] : NULL)
00190 {
00191 std::copy(other.begin(), other.end(), m_data);
00192 }
00193
00194 template<class FORWARD_ITERATOR>
00195 NonPersistentFixedSizeIterator(FORWARD_ITERATOR begin, FORWARD_ITERATOR end) :
00196 m_size(std::distance(begin, end)),
00197 m_data((m_size > 0) ? new T[m_size] : NULL)
00198 {
00199 std::copy(begin, end, m_data);
00200 }
00201
00202 NonPersistentFixedSizeIterator(SO<Iterator<T> > iter) :
00203 m_size(0),
00204 m_data(NULL)
00205 {
00206 if(iter) {
00207 m_size = iter->size();
00208 m_data = new T[m_size];
00209 std::copy(iter->begin(), iter->end(), m_data);
00210 }
00211 }
00212
00213 virtual ~NonPersistentFixedSizeIterator() {
00214 delete [] m_data;
00215 }
00216
00217 public:
00218 virtual unsigned int size() const { return m_size; }
00219
00220 virtual T get(unsigned int index) const {
00221 VRS_CheckArg(index < m_size, "index out of range");
00222 return m_data[index];
00223 }
00224
00225 public:
00226 void set(unsigned int index, const T& obj) {
00227 VRS_CheckArg(index < m_size, "index out of range");
00228 m_data[index] = obj;
00229 }
00230
00231 public:
00232 const T& operator[](unsigned int index) const {
00233 VRS_CheckArg(index < m_size, "index out of range");
00234 return m_data[index];
00235 }
00236
00237 T& operator[](unsigned int index) {
00238 VRS_CheckArg(index < m_size, "index out of range");
00239 return m_data[index];
00240 }
00241
00242 private:
00243 unsigned int m_size;
00244 T* m_data;
00245 };
00246
00247 }
00248
00249 #endif // VRS_CONTAINER_FIXEDSIZEITERATOR_H