Guest User

Untitled

a guest
Jul 7th, 2016
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. class BufferReader
  2. {
  3. public:
  4.     BufferReader( void *buf, int size ) :
  5.         m_pBuf( (uint8_t*)buf ), m_iSize( size ), m_iRead( 0 ), m_bBad( false ) {}
  6.  
  7.     template<typename T>
  8.     T Read( void )
  9.     {
  10.         if( m_bBad )
  11.             return -1;
  12.  
  13.         // don't go out of bounds
  14.         if( m_iRead + sizeof( T ) > m_iSize )
  15.         {
  16.             m_bBad = true;
  17.             return -1;
  18.         }
  19.  
  20.         if( sizeof( T ) == 1 )
  21.             return m_pBuf[m_iRead++];
  22.  
  23.         T t = *(T*)(m_pBuf + m_iRead);
  24.         m_iRead += sizeof( T );
  25.  
  26.         return t;
  27.     }
  28.  
  29.  
  30.     int8_t ReadChar( void )
  31.     {
  32.         return Read<int8_t>();
  33.     }
  34.  
  35.     uint8_t ReadByte( void )
  36.     {
  37.         return Read<uint8_t>();
  38.     }
  39.  
  40.     int16_t ReadShort( void )
  41.     {
  42.         return Read<int16_t>();
  43.     }
  44.  
  45.     int16_t ReadWord( void )
  46.     {
  47.         return ReadShort();
  48.     }
  49.  
  50.     int32_t ReadLong( void )
  51.     {
  52.         return Read<int32_t>();
  53.     }
  54.  
  55.     char *ReadString( void );
  56.     float ReadFloat( void );
  57.     float ReadCoord( void )
  58.     {
  59.         return Read<short>() * 0.125f;
  60.     }
  61.  
  62.     float ReadAngle( void )
  63.     {
  64.         return Read<char>() * 360.0f / 256.0f;
  65.     }
  66.  
  67.     float ReadHiResAngle( void )
  68.     {
  69.         return Read<short>() * 360.0f / 65536.0f;
  70.     }
  71.  
  72. private:
  73.     uint8_t *m_pBuf;
  74.     size_t m_iSize;
  75.     size_t m_iRead;
  76.     bool m_bBad;
  77. };
  78.  
  79. template<> inline char* BufferReader::Read( void )
  80. {
  81.     static char string[2048];
  82.  
  83.     if( m_bBad )
  84.         return nullptr;
  85.  
  86.     size_t l;
  87.     for( l = 0; l < sizeof(string) - 1; l++)
  88.     {
  89.         if( m_iRead > m_iSize )
  90.             break;
  91.  
  92.         int8_t c = ReadChar();
  93.         if( c == -1 || c == 0 )
  94.             break;
  95.  
  96.         string[l] = c;
  97.     }
  98.  
  99.     string[l] = 0;
  100.  
  101.     return string;
  102.  
  103. }
  104.  
  105. template<> inline float BufferReader::Read( void )
  106. {
  107.     union
  108.     {
  109.         unsigned char b[4];
  110.         float f;
  111.     } tr;
  112.  
  113.     if( m_bBad )
  114.         return -1.0f;
  115.  
  116.     if( m_iRead + 4 > m_iSize )
  117.     {
  118.         m_bBad = true;
  119.         return -1.0f;
  120.     }
  121.  
  122.     for( int i = 0; i < 4; i++ )
  123.         tr.b[i] = m_pBuf[m_iRead + i];
  124.  
  125.     m_iRead += 4;
  126.  
  127.     return tr.f;
  128. }
  129.  
  130. inline char * BufferReader::ReadString( void )
  131. {
  132.     return Read<char*>();
  133. }
  134.  
  135. inline float BufferReader::ReadFloat( void )
  136. {
  137.     return Read<float>();
  138. }
  139.  
  140. #define BEGIN_READ(x, y) BufferReader reader( x, y )
  141. #define READ_CHAR() reader.ReadChar()
  142. #define READ_BYTE() reader.ReadByte()
  143. #define READ_SHORT() reader.ReadShort()
  144. #define READ_WORD() reader.ReadWord()
  145. #define READ_LONG() reader.ReadLong()
  146. #define READ_FLOAT() reader.ReadFloat()
  147. #define READ_COORD() reader.ReadCoord()
  148. #define READ_ANGLE() reader.ReadAngle()
  149. #define READ_HIRESANGLE() reader.ReadHiResAngle()
  150. #define READ_STRING() reader.ReadString()
Add Comment
Please, Sign In to add comment