00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef BITRECORDVECTOR_H
00020 #define BITRECORDVECTOR_H
00021
00022 #include <vector>
00023
00024 #include <bit/recordbase.h>
00025 #include <bit/recordstorage.h>
00026
00027 namespace bit {
00028
00037 class RecordVector : public RecordBase
00038 {
00039 public:
00040
00041 class Element: public FieldBase
00042 {
00043 public:
00044
00045 typedef BitPointer<Element> pointer;
00046
00047 protected:
00048 friend class RecordVector;
00049
00050 Element( size_t index, RecordStorage& reference_layout );
00051
00052 static Element::pointer create( size_t index, RecordStorage& reference_layout );
00053
00054 public:
00055
00057 ~Element();
00058
00059 virtual size_t length() const;
00060
00061 virtual size_t length(size_t units) const;
00062
00063 virtual size_t length_units() const;
00064
00065 virtual int offset() const;
00066
00067 virtual int offset(size_t units) const;
00068
00069 virtual size_t offset_units() const;
00070
00071 virtual std::string name() const;
00072
00073 virtual std::string name(int depth) const;
00074
00075 virtual std::string description() const;
00076
00077
00078 virtual const std::string& xml() { return m_xml; }
00079
00080 virtual iterator begin();
00081
00082 virtual iterator end();
00083
00084 virtual FieldBase::pointer field(std::string s);
00085
00086 virtual FieldBase::pointer field(size_t i);
00087
00088 virtual size_t fields();
00089
00090 virtual FieldBase::pointer clone();
00091
00092 size_t index();
00093
00094 virtual Container container_type() { return RECORD_ELEMENT; }
00095
00096 protected:
00097 size_t m_index;
00098
00099 RecordStorage m_fields;
00100
00101 virtual FieldBase::pointer previous_field(FieldBase::pointer current_field) throw (exception::invalid_container_op);
00102
00103 virtual FieldBase::pointer next_field(FieldBase::pointer current_field) throw (exception::invalid_container_op);
00104 };
00105
00107 typedef BitPointer<RecordVector> pointer;
00108
00110 RecordVector( std::string name="",
00111 size_t size=0,
00112 size_t length_units=BITS,
00113 int offset=0,
00114 size_t offset_units=BITS,
00115 std::string descr=""
00116 );
00117
00119 RecordVector( const RecordStorage& layout,
00120 std::string name="",
00121 size_t size=0,
00122 size_t length_units=BITS,
00123 int offset=0,
00124 size_t offset_units=BITS,
00125 std::string descr=""
00126 );
00127
00129 static RecordVector::pointer create( std::string name="",
00130 size_t size=0,
00131 size_t length_units=BITS,
00132 int offset=0,
00133 size_t offset_units=BITS,
00134 std::string descr=""
00135 );
00136
00138 static RecordVector::pointer create( const RecordStorage& layout,
00139 std::string name="",
00140 size_t size=0,
00141 size_t length_units=BITS,
00142 int offset=0,
00143 size_t offset_units=BITS,
00144 std::string descr=""
00145 );
00146
00148 ~RecordVector();
00149
00151 virtual size_t length() const;
00152
00153 virtual size_t length(size_t units) const;
00154
00155 size_t size() const;
00156
00157 void set_size(size_t size);
00158
00159 virtual const std::string& xml();
00160
00161 virtual iterator begin();
00162
00163 virtual iterator end();
00164
00165 virtual FieldBase::pointer field(size_t i);
00166
00167 virtual void add_field(FieldBase::pointer child);
00168
00169 virtual void remove_field(const std::string& name);
00170
00171 virtual size_t fields();
00172
00173 virtual FieldBase::pointer clone();
00174
00175 virtual Container container_type() { return RECORD_VECTOR; }
00176
00177 protected:
00178 RecordStorage m_record_layout;
00179 size_t m_size;
00180
00181 typedef std::vector<Element::pointer> Elements;
00182
00183 Elements m_elements;
00184
00185 virtual FieldBase::pointer previous_child(FieldBase::pointer current_child) throw (exception::invalid_container_op);
00186
00187 virtual FieldBase::pointer next_child(FieldBase::pointer current_child) throw (exception::invalid_container_op);
00188
00189 };
00190
00191 }
00192
00193 #endif