debian/libbit-dev/usr/include/bit-0.3/bit/recordvector.h

00001 /***************************************************************************
00002 *   Copyright (C) 2001 by Rick L. Vinyard, Jr.                            *
00003 *   rvinyard@cs.nmsu.edu                                                  *
00004 *                                                                         *
00005 *   This program is free software; you can redistribute it and/or modify  *
00006 *   it under the terms of the GNU Lesser General Public License as        *
00007 *   published by the Free Software Foundation version 2.1.                *
00008 *                                                                         *
00009 *   This program is distributed in the hope that it will be useful,       *
00010 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00011 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00012 *   GNU General Public License for more details.                          *
00013 *                                                                         *
00014 *   You should have received a copy of the GNU Lesser General Public      *
00015 *   License along with this library; if not, write to the                 *
00016 *   Free Software Foundation, Inc.,                                       *
00017 *   51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA              *
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       // TODO do something real with this
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

Generated on Tue Mar 13 20:00:01 2007 by  doxygen 1.5.1