00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef BITRECORDBUFFER_H
00020 #define BITRECORDBUFFER_H
00021
00022 #include <string>
00023 #include <queue>
00024 #include <set>
00025
00026 #include <bit/buffer.h>
00027 #include <bit/record.h>
00028 #include <bit/fieldbuffer.h>
00029 #include <bit/data.h>
00030 #include <bit/except.h>
00031
00032 namespace bit
00033 {
00034
00041 class RecordBuffer : public Buffer
00042 {
00043 public:
00048 RecordBuffer(size_t initial_size=0, size_t sizemax=0) throw (std::bad_alloc);
00049
00054 RecordBuffer(RecordBase::pointer record, size_t initial_size=0, size_t sizemax=0) throw (std::bad_alloc);
00055
00057 RecordBuffer(void* data, size_t size, size_t sizemax=0, DataMode mode=COPY) throw (std::bad_alloc);
00058
00060 RecordBuffer(RecordBase::pointer record, void* data, size_t size, size_t sizemax=0, DataMode mode=COPY) throw (std::bad_alloc);
00061
00063 RecordBuffer( const Data& other );
00064
00066 RecordBuffer( RecordBase::pointer record, const Data& other );
00067
00069 RecordBuffer( const RecordBuffer& other );
00070
00071 ~RecordBuffer();
00072
00073 std::string xml(const std::string& padding=std::string());
00074
00075 std::string xml(FieldBase::pointer i, const std::string& padding=std::string());
00076
00077 FieldBuffer field(size_t) throw (exception::no_record);
00078 FieldBuffer field(const std::string&) throw (exception::no_record);
00079 FieldBuffer field(FieldBase::iterator);
00080 FieldBuffer field(FieldBase::pointer);
00081
00082 FieldBuffer operator[](size_t) throw (exception::no_record);
00083 FieldBuffer operator[](const std::string&) throw (exception::no_record);
00084 FieldBuffer operator[](const char*) throw (exception::no_record);
00085 FieldBuffer operator[](FieldBase::iterator);
00086 FieldBuffer operator[](FieldBase::pointer);
00087
00088 void set_record(RecordBase::pointer record) throw ();
00089 void clear_record() throw ();
00090 RecordBase::pointer record();
00091
00092 sigc::signal<void, FieldBuffer> signal_field_changed();
00093
00094 sigc::signal<void> signal_record_changed();
00095
00096 protected:
00097 friend class FieldBuffer;
00098
00103 RecordBase::pointer m_record;
00104
00113 void on_field_changed(FieldBase::pointer field);
00114
00115 struct RecordBufferStorage
00116 {
00117 typedef BitPointer<RecordBufferStorage> pointer;
00118
00119 RecordBufferStorage(): signal_field_changed_emitting(false) { }
00120
00121 sigc::signal<void> signal_record_changed;
00122
00134 sigc::signal<void, FieldBuffer> signal_field_changed;
00135
00136
00137
00138 std::queue< FieldBase::pointer > signal_field_changed_queue;
00139
00140 bool signal_field_changed_emitting;
00141 };
00142
00143 RecordBufferStorage::pointer m_recordbuffer_storage;
00144
00145 };
00146
00147 }
00148
00149 #endif