00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef BITRECORDSTORAGE_H
00020 #define BITRECORDSTORAGE_H
00021
00022 #include <set>
00023 #include <map>
00024
00025 #include <bit/fieldbase.h>
00026 #include <bit/recordbase.h>
00027 #include <bit/except.h>
00028
00029 namespace bit {
00030
00038 class RecordStorage{
00039 public:
00040 RecordStorage(FieldBase& record);
00041
00042 virtual ~RecordStorage();
00043
00044 struct fieldbase_pointer_compare {
00045 bool operator() (FieldBase::pointer p1, FieldBase::pointer p2) const {
00046 int p1_offset, p2_offset;
00047 p1_offset = p1->offset(BITS);
00048 p2_offset = p2->offset(BITS);
00049 if (p1_offset < p2_offset)
00050 return true;
00051 else if (p1_offset == p2_offset)
00052 return ( p1->length(BITS) < p2->length(BITS) );
00053 else
00054 return false;
00055 }
00056 };
00057
00058 virtual FieldBase::iterator begin();
00059
00060 virtual FieldBase::iterator end();
00061
00063 RecordStorage& operator=(const RecordStorage& other);
00064
00065 virtual FieldBase::pointer field(std::string s);
00066
00067 virtual FieldBase::pointer field(size_t i);
00068
00069 virtual void add_field(FieldBase::pointer field);
00070
00071 virtual void remove_field(FieldBase::pointer field);
00072
00073 virtual void remove_field(const std::string& name);
00074
00075 virtual size_t fields();
00076
00078 typedef std::set<FieldBase::pointer, fieldbase_pointer_compare> Fields;
00079
00081 typedef std::map<std::string, Fields::iterator> FieldNameMap;
00082
00083 Fields field_set;
00084 FieldNameMap field_name_map;
00085
00086 virtual FieldBase::pointer previous_field(FieldBase::pointer current_field) throw (exception::invalid_container_op);
00087
00088 virtual FieldBase::pointer next_field(FieldBase::pointer current_field) throw (exception::invalid_container_op);
00089
00090 protected:
00091
00092 FieldBase* m_record;
00093 };
00094
00095 }
00096
00097 #endif