00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_BIT_MEM_STREAM_H
00027 #define NL_BIT_MEM_STREAM_H
00028
00029 #include "nel/misc/types_nl.h"
00030 #include "nel/misc/mem_stream.h"
00031
00032
00033 namespace NLMISC {
00034
00035
00042 class CBitMemStream : public CMemStream
00043 {
00044 public:
00045
00047 CBitMemStream( bool inputStream=false, uint32 defaultcapacity=32 );
00048
00050 CBitMemStream( const CBitMemStream& other );
00051
00053 CBitMemStream& operator=( const CBitMemStream& other ) { CMemStream::operator=( other ); _FreeBits = other._FreeBits; return *this; }
00054
00059 virtual uint32 length() const
00060 {
00061 if ( isReading() )
00062 {
00063 return lengthR();
00064 }
00065 else
00066 {
00067 if ( _Buffer.getPtr() - 1 == _BufPos )
00068 {
00069 return 0;
00070 }
00071 else
00072 {
00073 return lengthS() + 1;
00074 }
00075 }
00076 }
00077
00079 virtual void invert()
00080 {
00081 if (isReading())
00082 {
00083 CMemStream::invert();
00084 _BufPos--;
00085 _FreeBits = 8;
00086 }
00087 else
00088 {
00089 _BufPos++;
00090 CMemStream::invert();
00091 _FreeBits = 8;
00092 }
00093 }
00094
00096 virtual void clear()
00097 {
00098 CMemStream::clear();
00099 _FreeBits = 8;
00100 _BufPos--;
00101 }
00102
00104 sint32 getPosInBit()
00105 {
00106 if (isReading())
00107 {
00108 return getPos() * 8 + (8 - _FreeBits);
00109 }
00110 else
00111 {
00112 if (_Buffer.getPtr() - 1 == _BufPos)
00113 return 0;
00114 else if (_FreeBits == 8)
00115 return (getPos() + 1) * 8;
00116 else
00117 return getPos() * 8 + (8 - _FreeBits);
00118
00119
00120
00121
00122
00123
00124 }
00125 }
00126
00127
00129 virtual void serialBuffer(uint8 *buf, uint len);
00130
00132 virtual void serialBit( bool& bit );
00133
00137 void serial( uint32& value, uint nbits, bool resetvalue=true );
00138
00140 void serial( uint64& value, uint nbits )
00141 {
00142 if ( nbits > 32 )
00143 {
00144 if ( isReading() )
00145 {
00146
00147 uint32 msd = 0;
00148 serial( msd, nbits-32 );
00149 value = (uint64)msd << 32;
00150
00151 serial( (uint32&)value, 32 );
00152 }
00153 else
00154 {
00155
00156 uint32 msd = (uint32)(value >> 32);
00157 serial( msd, nbits-32 );
00158
00159 serial( (uint32&)value, 32 );
00160 }
00161 }
00162 else
00163 {
00164 if ( isReading() )
00165 {
00166
00167 value = 0;
00168 }
00169
00170 serial( (uint32&)value, nbits );
00171 }
00172 }
00173
00175 template<class T>
00176 void serial(T &obj) { obj.serial(*this); }
00177
00178
00179 template<class T>
00180 void serialCont(std::vector<T> &cont) {CMemStream::serialCont(cont);}
00181 template<class T>
00182 void serialCont(std::list<T> &cont) {CMemStream::serialCont(cont);}
00183 template<class T>
00184 void serialCont(std::deque<T> &cont) {CMemStream::serialCont(cont);}
00185 template<class T>
00186 void serialCont(std::set<T> &cont) {CMemStream::serialCont(cont);}
00187 template<class T>
00188 void serialCont(std::multiset<T> &cont) {CMemStream::serialCont(cont);}
00189 template<class K, class T>
00190 void serialCont(std::map<K, T> &cont) {CMemStream::serialCont(cont);}
00191 template<class K, class T>
00192 void serialCont(std::multimap<K, T> &cont) {CMemStream::serialCont(cont);}
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00214
00215
00216 #define serialAdapt( b, type ) \
00217 uint32 ub=0; \
00218 if ( isReading() ) \
00219 { \
00220 serial( ub, sizeof(type)*8 ); \
00221 b = (type)ub; \
00222 } \
00223 else \
00224 { \
00225 ub = (uint32)b; \
00226 serial( ub, sizeof(type)*8 ); \
00227 }
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 #ifdef NL_LITTLE_ENDIAN
00248
00249 #define serialAdapt64( b ) \
00250 serial( *((uint32*)(&b)), 32); \
00251 serial( *((uint32*)(&b)+1), 32);
00252
00253 #else
00254
00255 #define serialAdapt64( b ) \
00256 serial( *((uint32*)(&b)+1), 32); \
00257 serial( *((uint32*)(&b)), 32);
00258
00259 #endif
00260
00261 virtual void serial(uint8 &b) { serialAdapt( b, uint8 ); }
00262 virtual void serial(sint8 &b) { serialAdapt( b, sint8 ); }
00263 virtual void serial(uint16 &b) { serialAdapt( b, uint16 ); }
00264 virtual void serial(sint16 &b) { serialAdapt( b, sint16 ); }
00265 virtual void serial(uint32 &b) { serialAdapt( b, uint32 ); }
00266 virtual void serial(sint32 &b) { serialAdapt( b, sint32 ); }
00267 virtual void serial(uint64 &b) { serialAdapt64( b ); }
00268 virtual void serial(sint64 &b) { serialAdapt64( b ); }
00269 virtual void serial(float &b);
00270 virtual void serial(double &b) { serialAdapt64( b ); }
00271 virtual void serial(bool &b) { serialBit( b ); }
00272 #ifndef NL_OS_CYGWIN
00273 virtual void serial(char &b) { serialAdapt( b, char ); }
00274 #endif
00275 virtual void serial(std::string &b);
00276
00277
00278 virtual void serial(CBitMemStream &b);
00279
00281
00283 virtual void serialCont(std::vector<uint8> &cont) { serialVector(cont); }
00285 virtual void serialCont(std::vector<sint8> &cont) { serialVector(cont); }
00287 virtual void serialCont(std::vector<bool> &cont);
00288
00289 protected:
00290
00291 uint _FreeBits;
00292
00293 };
00294
00295 }
00296
00297
00298 #endif // NL_BIT_MEM_STREAM_H
00299
00300