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 virtual const FieldType& type() const;
00078
00079 virtual void set_type( const FieldType& );
00080
00082 virtual Encoding encoding() const;
00083
00085 virtual void set_encoding( Encoding en );
00086
00087
00088 virtual const std::string& xml() { return m_xml; }
00089
00090 virtual iterator begin();
00091
00092 virtual iterator end();
00093
00094 virtual size_t subfields();
00095
00096 virtual FieldBase::pointer subfield(const std::string& s);
00097
00098 virtual FieldBase::pointer subfield(size_t i);
00099
00100 virtual FieldBase::pointer clone();
00101
00102 size_t index();
00103
00104 virtual Container container_type() { return RECORD_ELEMENT; }
00105
00106 protected:
00107 size_t m_index;
00108
00109 RecordStorage m_fields;
00110
00111 virtual FieldBase::pointer previous_field(FieldBase::pointer current_field) throw (exception::invalid_container_op);
00112
00113 virtual FieldBase::pointer next_field(FieldBase::pointer current_field) throw (exception::invalid_container_op);
00114 };
00115
00117 typedef BitPointer<RecordVector> pointer;
00118
00120 RecordVector( 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 RecordVector( const RecordStorage& layout,
00130 std::string name="",
00131 size_t size=0,
00132 size_t length_units=BITS,
00133 int offset=0,
00134 size_t offset_units=BITS,
00135 std::string descr=""
00136 );
00137
00139 static RecordVector::pointer create( 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 static RecordVector::pointer create( const RecordStorage& layout,
00149 std::string name="",
00150 size_t size=0,
00151 size_t length_units=BITS,
00152 int offset=0,
00153 size_t offset_units=BITS,
00154 std::string descr=""
00155 );
00156
00158 ~RecordVector();
00159
00161 virtual size_t length() const;
00162
00163 virtual size_t length(size_t units) const;
00164
00165 size_t size() const;
00166
00167 void set_size(size_t size);
00168
00169 virtual const std::string& xml();
00170
00171 virtual iterator begin();
00172
00173 virtual iterator end();
00174
00175 virtual size_t subfields();
00176
00177 virtual FieldBase::pointer subfield(const std::string& s);
00178
00179 virtual FieldBase::pointer subfield(size_t i);
00180
00181 virtual void add_field(FieldBase::pointer child);
00182
00183 virtual void remove_field(const std::string& name);
00184
00185 virtual FieldBase::pointer clone();
00186
00187 virtual Container container_type() { return RECORD_VECTOR; }
00188
00189 protected:
00190 RecordStorage m_record_layout;
00191 size_t m_size;
00192
00193 typedef std::vector<Element::pointer> Elements;
00194
00195 Elements m_elements;
00196
00197 virtual FieldBase::pointer previous_child(FieldBase::pointer current_child) throw (exception::invalid_container_op);
00198
00199 virtual FieldBase::pointer next_child(FieldBase::pointer current_child) throw (exception::invalid_container_op);
00200
00201 };
00202
00203 }
00204
00205 #endif