예제 #1
0
파일: List.hpp 프로젝트: denghe/69net
 bool List<T>::ReadFrom( ByteBuffer& bb )
 {
     int len;
     if( !bb.VarRead( *(uint*)&len ) || len < 0 ) return false;
     if( !std::is_pointer<T>::value && std::is_pod<T>::value )
     {
         int siz = len * ( int )sizeof( T );
         if( bb.offset + siz > bb.dataLen ) return false;
         Clear();
         Resize( len, false );
         memcpy( buf, bb.buf + bb.offset, siz );
         bb.offset += siz;
         return true;
     }
     Clear();
     if( !len )return true;
     Reserve( len );
     for( int i = 0; i < len; ++i )
     {
         new ( buf + i ) T();
         size = i + 1;
         if( !bb.Read( buf[ i ] ) ) return false;
     }
     return true;
 }
예제 #2
0
파일: ByteBuffer.hpp 프로젝트: denghe/69net
 typename std::enable_if<HasFunc_ReadFrom<T>::value, bool>::type ReadSwitch( ByteBuffer& b, T& v )
 {
     if( b.idxStore )
     {
         uint _offset;
         if( !b.VarRead( _offset ) ) return false;
         b.idxStore->Insert( _offset, (void*)&v );   // todo: assert?
     }
     return v.ReadFrom( b );
 };
예제 #3
0
파일: String.cpp 프로젝트: denghe/69net
 bool String::ReadFrom( ByteBuffer& bb )
 {
     int len;
     if( !bb.VarRead( *(uint*)&len )
         || len < 0
         || bb.offset + len > bb.dataLen )
     {
         return false;
     }
     Assign( bb.buf + bb.offset, 0, len, false );
     bb.offset += len;
     return true;
 }