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 boost::shared_ptr<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 size_t index() const;
00103
00104 virtual FieldBase::pointer clone();
00105
00106 protected:
00107 size_t m_index;
00108 };
00109
00110 typedef boost::shared_ptr<FieldVector> pointer;
00111
00124 FieldVector( std::string name="",
00125 size_t size=0,
00126 size_t element_length=0,
00127 size_t element_length_units=BITS,
00128 int offset=0,
00129 size_t offset_units=BITS,
00130 std::string descr=""
00131 );
00132
00133 static FieldVector::pointer create( std::string name="",
00134 size_t size=0,
00135 size_t element_length=0,
00136 size_t element_length_units=BITS,
00137 int offset=0,
00138 size_t offset_units=BITS,
00139 std::string descr=""
00140 );
00141
00142 virtual ~FieldVector();
00143
00144
00145
00146 size_t length() const;
00147
00148 size_t length(size_t units) const;
00149
00150 size_t element_length() const;
00151
00152 size_t size() const;
00153
00154 void set_size(size_t size);
00155
00156 virtual iterator begin();
00157
00158 virtual iterator end();
00159
00160 virtual FieldBase::pointer field(size_t i);
00161
00162 virtual FieldBase::pointer clone();
00163
00164 protected:
00165 size_t m_size;
00166
00167 typedef std::vector<Element::pointer> Elements;
00168
00169 Elements m_elements;
00170
00171 virtual FieldBase::pointer previous_field(FieldBase::pointer current_field) throw (error::invalid_container_op);
00172
00173 virtual FieldBase::pointer next_field(FieldBase::pointer current_field) throw (error::invalid_container_op);
00174
00175 };
00176
00177 }
00178
00179 #endif