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 boost::shared_ptr<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 iterator begin();
00078
00079 virtual iterator end();
00080
00081 virtual FieldBase::pointer field(std::string s);
00082
00083 virtual FieldBase::pointer field(size_t i);
00084
00085 virtual size_t fields();
00086
00087 virtual FieldBase::pointer clone();
00088
00089 size_t index();
00090
00091 protected:
00092 size_t m_index;
00093
00094 RecordStorage m_fields;
00095
00096 virtual FieldBase::pointer previous_field(FieldBase::pointer current_field) throw (error::invalid_container_op);
00097
00098 virtual FieldBase::pointer next_field(FieldBase::pointer current_field) throw (error::invalid_container_op);
00099 };
00100
00102 typedef boost::shared_ptr<RecordVector> pointer;
00103
00105 RecordVector( std::string name="",
00106 size_t size=0,
00107 size_t length_units=BITS,
00108 int offset=0,
00109 size_t offset_units=BITS,
00110 std::string descr=""
00111 );
00112
00114 RecordVector( const RecordStorage& layout,
00115 std::string name="",
00116 size_t size=0,
00117 size_t length_units=BITS,
00118 int offset=0,
00119 size_t offset_units=BITS,
00120 std::string descr=""
00121 );
00122
00124 static RecordVector::pointer create( std::string name="",
00125 size_t size=0,
00126 size_t length_units=BITS,
00127 int offset=0,
00128 size_t offset_units=BITS,
00129 std::string descr=""
00130 );
00131
00133 static RecordVector::pointer create( const RecordStorage& layout,
00134 std::string name="",
00135 size_t size=0,
00136 size_t length_units=BITS,
00137 int offset=0,
00138 size_t offset_units=BITS,
00139 std::string descr=""
00140 );
00141
00143 ~RecordVector();
00144
00146 virtual size_t length() const;
00147
00148 virtual size_t length(size_t units) const;
00149
00150 size_t size() const;
00151
00152 void set_size(size_t size);
00153
00154 virtual iterator begin();
00155
00156 virtual iterator end();
00157
00158 virtual FieldBase::pointer field(size_t i);
00159
00160 virtual void add_field(FieldBase::pointer child);
00161
00162 virtual void remove_field(const std::string& name);
00163
00164 virtual size_t fields();
00165
00166 virtual FieldBase::pointer clone();
00167
00168 protected:
00169 RecordStorage m_record_layout;
00170 size_t m_size;
00171
00172 typedef std::vector<Element::pointer> Elements;
00173
00174 Elements m_elements;
00175
00176 virtual FieldBase::pointer previous_child(FieldBase::pointer current_child) throw (error::invalid_container_op);
00177
00178 virtual FieldBase::pointer next_child(FieldBase::pointer current_child) throw (error::invalid_container_op);
00179
00180 };
00181
00182 }
00183
00184 #endif