00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef BITBUFFER_H
00020 #define BITBUFFER_H
00021
00022 #include <bit/enums.h>
00023 #include <bit/data.h>
00024 #include <bit/pointer.h>
00025
00026 #include <bit/bit-config.h>
00027
00028 #ifdef BIT_HAVE_PTHREAD_H
00029 #include <pthread.h>
00030 #endif
00031
00032 namespace bit
00033 {
00034
00047 class Buffer: public Data
00048 {
00049
00050 public:
00051
00056 Buffer(size_t initial_size=0, size_t sizemax=0) throw (std::bad_alloc);
00057
00059 Buffer(void* data, size_t size, size_t sizemax=0, DataMode mode=COPY) throw (std::bad_alloc);
00060
00062 Buffer( const Data& other );
00063
00065 Buffer( const Buffer& other );
00066
00067 ~Buffer();
00068
00096 bool unpack(void* mem, size_t mem_octets, Location mem_loc, size_t buf_offset_bits, size_t extract_bits);
00097
00098 Data unpack( size_t buf_offset_bits, size_t extract_bits, Location mem_loc=END );
00099
00100 template <typename T>
00101 bool unpack(T& val, Location mem_loc, size_t buf_offset_bits, size_t extract_bits)
00102 {
00103 return unpack(&val, sizeof(T), mem_loc, buf_offset_bits, extract_bits);
00104 }
00105
00139 bool pack(const void* mem, size_t mem_octets, Location mem_loc, size_t buf_offset, size_t buf_tgtsize, size_t n);
00140
00141 bool pack( Data d, size_t buf_offset, size_t buf_tgtsize, size_t n, Location mem_loc=END );
00142
00143 template <typename T>
00144 bool pack(const T& val, Location mem_loc, size_t offset, size_t destsize, size_t n)
00145 {
00146 bool b;
00147 b = pack(&val, sizeof(T), mem_loc, offset, destsize, n);
00148 return b;
00149 }
00150
00151 bool clear_bits(size_t offset, size_t bits);
00152
00153 #ifdef BIT_HAVE_PTHREAD_H
00154 bool read_lock();
00155 bool try_read_lock();
00156 bool write_lock();
00157 bool try_write_lock();
00158 bool unlock();
00159 #endif
00160
00161 protected:
00162
00163 #ifdef BIT_HAVE_PTHREAD_H
00164 struct RWLock {
00165 typedef BitPointer<RWLock> pointer;
00166 RWLock() {
00167 pthread_rwlock_init( &rwlock, NULL );
00168 }
00169
00170 static pointer create() { return pointer( new RWLock() ); }
00171
00172 ~RWLock() {
00173 pthread_rwlock_destroy( &rwlock );
00174 }
00175
00176 pthread_rwlock_t rwlock;
00177 };
00178
00179 RWLock::pointer m_rwlock;
00180 #endif
00181
00182 };
00183
00184 }
00185
00186 #endif