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 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

Generated on Thu Jul 6 14:38:08 2006 by  doxygen 1.4.6