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; }
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 ); };
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; }