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 #ifndef VRS_CONTAINER_ARRAY_H
00026 #define VRS_CONTAINER_ARRAY_H
00027
00028 #include <vrs/container/sequencecontainerstl.h>
00029 #include <vector>
00030
00031 namespace VRS {
00032
00033 inline bool* NonPersistentArray_Pointer_Impl(const std::vector<bool>& v) {
00034 return NULL;
00035 }
00036
00037 template<typename T>
00038 inline T* NonPersistentArray_Pointer_Impl(const std::vector<T>& v) {
00039 return const_cast<T*>(&(v[0]));
00040 }
00041
00042 template<typename T>
00043 class NonPersistentArray : public SequenceContainerSTL<T, std::vector<T> > {
00044 public:
00045 NonPersistentArray() : SequenceContainerSTL<T, std::vector<T> >() { }
00046 NonPersistentArray(unsigned int size) : SequenceContainerSTL<T, std::vector<T> >(size) { }
00047 NonPersistentArray(unsigned int size, const T& initValue) : SequenceContainerSTL<T, std::vector<T> >(size, initValue) { }
00048 NonPersistentArray(const Iterator<T>* sourceItr) : SequenceContainerSTL<T, std::vector<T> >(sourceItr) { }
00049
00050 T* pointer() { return NonPersistentArray_Pointer_Impl(this->containerSTL()); }
00051 const T* pointer() const { return NonPersistentArray_Pointer_Impl(this->containerSTL()); }
00052
00053 virtual Iterator<T>* newIterator() const;
00054
00055 void reserve(unsigned int value) { this->containerSTL().reserve(value); }
00056
00057 VRS_TYPEINFO(NonPersistentArray, VRS_TEMPLATE_ARGS_2(T, std::vector<T>, SequenceContainerSTL));
00058 VRS_SERIALIZABLE_ABSTRACT_CLASS(NonPersistentArray);
00059 };
00060
00061 template<typename T>
00062 void NonPersistentArray<T>::serialize(SerializationManager&) {
00063 VRS_NoImpl(NonPersistentArray<T>::ClassNameVRS() << "::serialize() not supported: use "
00064 "Array<T> for serialization instead!");
00065 }
00066
00067
00068 template<typename T>
00069 class ArrayIterator : public SequenceContainerIteratorSTL<T, std::vector<T> > {
00070 public:
00071 ArrayIterator(const NonPersistentArray<T>* container)
00072 : SequenceContainerIteratorSTL<T, std::vector<T> >(container) { }
00073
00074 virtual const T* pointer() const { return static_cast<NonPersistentArray<T>*>(this->container())->pointer(); }
00075
00076 VRS_TYPEINFO(ArrayIterator, VRS_TEMPLATE_ARGS_2(T, std::vector<T>, SequenceContainerIteratorSTL));
00077 VRS_SERIALIZABLE(ArrayIterator);
00078
00079 protected:
00080 ArrayIterator() { }
00081 };
00082
00083 template<typename T>
00084 void ArrayIterator<T>::serialize(SerializationManager& doc) {
00085
00086 typedef SequenceContainerIteratorSTL<T, std::vector<T> > Parent;
00087 VRS_SERIALIZATION_PARENT_CLASS(doc, Parent);
00088 }
00089
00090 template<typename T>
00091 Iterator<T>* NonPersistentArray<T>::newIterator() const {
00092 return (this->iterator_ ? this->iterator_ : new ArrayIterator<T>(this));
00093 }
00094
00095
00096 template<typename T>
00097 class Array : public NonPersistentArray<T> {
00098 public:
00099 Array() : NonPersistentArray<T>() { }
00100 Array(unsigned int size) : NonPersistentArray<T>(size) { }
00101 Array(unsigned int size, const T& initValue) : NonPersistentArray<T>(size, initValue) { }
00102 Array(const Iterator<T>* sourceItr) : NonPersistentArray<T>(sourceItr) { }
00103
00104 VRS_TYPEINFO(Array, NonPersistentArray<T>);
00105 VRS_SERIALIZABLE(Array);
00106 };
00107
00108 template<typename T>
00109 void Array<T>::serialize(SerializationManager& doc) {
00110 VRS_SERIALIZATION_PARENT_CLASS(doc, SharedObj);
00111 serialization(doc, "Container", this->containerSTL());
00112 }
00113
00114 VRS_SERIALIZATION_REGISTRATION_TEMPLATE(Array);
00115 VRS_SERIALIZATION_REGISTRATION_TEMPLATE(ArrayIterator);
00116
00117 }
00118
00119 #include <vrs/container/stl_serialization.h>
00120
00121 #endif // VRS_CONTAINER_ARRAY_H