00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef BIT_FIELDVECTOR_H
00020 #define BIT_FIELDVECTOR_H
00021
00022 #include <string>
00023 #include <vector>
00024
00025 #include <libxml++/libxml++.h>
00026
00027 #include <bit/field.h>
00028
00029 namespace bit
00030 {
00031
00040 class FieldVector: public Field
00041 {
00042 public:
00043
00049 class Element: public FieldBase
00050 {
00051 public:
00052
00053 typedef BitPointer<Element> pointer;
00054
00055 protected:
00056
00057 friend class FieldVector;
00058
00059 Element(size_t index);
00060
00061 static Element::pointer create(size_t index);
00062
00063 public:
00064
00065 virtual ~Element() { }
00066
00068 virtual size_t length() const;
00069
00070 virtual size_t length(size_t units) const;
00071
00073 virtual size_t length_units() const;
00074
00076 virtual int offset() const;
00077
00078 virtual int offset(size_t units) const;
00079
00084 virtual size_t offset_units() const;
00085
00093 virtual std::string name() const;
00094
00095 virtual std::string name(int depth) const;
00096
00100 virtual std::string description() const;
00101
00102 virtual const FieldType& type() const;
00103
00104 virtual void set_type( const FieldType& );
00105
00107 virtual Encoding encoding() const;
00108
00110 virtual void set_encoding( Encoding en );
00111
00112 virtual const std::string& xml();
00113
00114 size_t index() const;
00115
00116 virtual FieldBase::pointer clone();
00117
00118 virtual Container container_type() { return FIELD_ELEMENT; }
00119
00120 protected:
00121 size_t m_index;
00122 };
00123
00124 typedef BitPointer<FieldVector> pointer;
00125
00137 FieldVector(
00138 std::string name="",
00139 size_t vector_size=0,
00140 size_t element_length=0,
00141 size_t element_length_units=BITS,
00142 int offset=0,
00143 size_t offset_units=BITS,
00144 std::string descr=""
00145 );
00146
00147 static FieldVector::pointer create( std::string name="",
00148 size_t vector_size=0,
00149 size_t element_length=0,
00150 size_t element_length_units=BITS,
00151 int offset=0,
00152 size_t offset_units=BITS,
00153 std::string descr=""
00154 );
00155
00156 virtual ~FieldVector();
00157
00158 virtual const std::string& xml();
00159
00160 size_t length() const;
00161
00162 size_t length(size_t units) const;
00163
00164 size_t element_length() const;
00165
00166 size_t vector_size() const;
00167
00168 void set_vector_size(size_t vector_size);
00169
00170 virtual iterator begin();
00171
00172 virtual iterator end();
00173
00175 virtual size_t subfields();
00176
00182 virtual FieldBase::pointer subfield( const std::string& subfield_name );
00183
00185 virtual FieldBase::pointer subfield(size_t i);
00186
00187 virtual FieldBase::pointer clone();
00188
00189 virtual Container container_type() { return FIELD_VECTOR; }
00190
00191 protected:
00192 size_t m_size;
00193
00194 typedef std::vector<Element::pointer> Elements;
00195
00196 Elements m_elements;
00197
00198 virtual FieldBase::pointer previous_field(FieldBase::pointer current_field) throw (exception::invalid_container_op);
00199
00200 virtual FieldBase::pointer next_field(FieldBase::pointer current_field) throw (exception::invalid_container_op);
00201
00202 };
00203
00204 }
00205
00206 #endif