src/common/mtag-buffer.cc
changeset 3041 a624276a897b
parent 3040 e11e106c7c19
child 3042 d0a9677d5452
equal deleted inserted replaced
3040:e11e106c7c19 3041:a624276a897b
     1 #include "mtag-buffer.h"
       
     2 #include "ns3/assert.h"
       
     3 
       
     4 namespace ns3 {
       
     5 
       
     6 void 
       
     7 TagBuffer::WriteU8 (uint8_t v)
       
     8 {
       
     9   NS_ASSERT (m_current + 1 <= m_end);
       
    10   *m_current = v;
       
    11   m_current++;
       
    12 }
       
    13 void 
       
    14 TagBuffer::WriteU16 (uint16_t data)
       
    15 {
       
    16   WriteU8 ((data >> 0) & 0xff);
       
    17   WriteU8 ((data >> 8) & 0xff);
       
    18 }
       
    19 void 
       
    20 TagBuffer::WriteU32 (uint32_t data)
       
    21 {
       
    22   WriteU8 ((data >> 0) & 0xff);
       
    23   WriteU8 ((data >> 8) & 0xff);
       
    24   WriteU8 ((data >> 16) & 0xff);
       
    25   WriteU8 ((data >> 24) & 0xff);
       
    26 }
       
    27 void 
       
    28 TagBuffer::WriteU64 (uint64_t data)
       
    29 {
       
    30   WriteU8 ((data >> 0) & 0xff);
       
    31   WriteU8 ((data >> 8) & 0xff);
       
    32   WriteU8 ((data >> 16) & 0xff);
       
    33   WriteU8 ((data >> 24) & 0xff);
       
    34   WriteU8 ((data >> 32) & 0xff);
       
    35   WriteU8 ((data >> 40) & 0xff);
       
    36   WriteU8 ((data >> 48) & 0xff);
       
    37   WriteU8 ((data >> 54) & 0xff);
       
    38 }
       
    39 void
       
    40 TagBuffer::WriteDouble (double v)
       
    41 {
       
    42   uint8_t *buf = (uint8_t *)&v;
       
    43   for (uint32_t i = 0; i < sizeof (double); ++i, ++buf)
       
    44     {
       
    45       WriteU8 (*buf);
       
    46     }
       
    47 }
       
    48 void 
       
    49 TagBuffer::Write (const uint8_t *buffer, uint32_t size)
       
    50 {
       
    51   for (uint32_t i = 0; i < size; ++i, ++buffer)
       
    52     {
       
    53       WriteU8 (*buffer);
       
    54     }
       
    55 }
       
    56 uint8_t  
       
    57 TagBuffer::ReadU8 (void)
       
    58 {
       
    59   NS_ASSERT (m_current + 1 <= m_end);
       
    60   uint8_t v;
       
    61   v = *m_current;
       
    62   m_current++;
       
    63   return v;
       
    64 }
       
    65 uint16_t 
       
    66 TagBuffer::ReadU16 (void)
       
    67 {
       
    68   uint8_t byte0 = ReadU8 ();
       
    69   uint8_t byte1 = ReadU8 ();
       
    70   uint16_t data = byte1;
       
    71   data <<= 8;
       
    72   data |= byte0;
       
    73   return data;
       
    74 }
       
    75 uint32_t 
       
    76 TagBuffer::ReadU32 (void)
       
    77 {
       
    78   uint8_t byte0 = ReadU8 ();
       
    79   uint8_t byte1 = ReadU8 ();
       
    80   uint8_t byte2 = ReadU8 ();
       
    81   uint8_t byte3 = ReadU8 ();
       
    82   uint32_t data = byte3;
       
    83   data <<= 8;
       
    84   data |= byte2;
       
    85   data <<= 8;
       
    86   data |= byte1;
       
    87   data <<= 8;
       
    88   data |= byte0;
       
    89   return data;
       
    90 }
       
    91 uint64_t 
       
    92 TagBuffer::ReadU64 (void)
       
    93 {
       
    94   uint8_t byte0 = ReadU8 ();
       
    95   uint8_t byte1 = ReadU8 ();
       
    96   uint8_t byte2 = ReadU8 ();
       
    97   uint8_t byte3 = ReadU8 ();
       
    98   uint8_t byte4 = ReadU8 ();
       
    99   uint8_t byte5 = ReadU8 ();
       
   100   uint8_t byte6 = ReadU8 ();
       
   101   uint8_t byte7 = ReadU8 ();
       
   102   uint32_t data = byte7;
       
   103   data <<= 8;
       
   104   data |= byte6;
       
   105   data <<= 8;
       
   106   data |= byte5;
       
   107   data <<= 8;
       
   108   data |= byte4;
       
   109   data <<= 8;
       
   110   data |= byte3;
       
   111   data <<= 8;
       
   112   data |= byte2;
       
   113   data <<= 8;
       
   114   data |= byte1;
       
   115   data <<= 8;
       
   116   data |= byte0;
       
   117 
       
   118   return data;
       
   119 }
       
   120 double
       
   121 TagBuffer::ReadDouble (void)
       
   122 {
       
   123   double v;
       
   124   uint8_t *buf = (uint8_t *)&v;
       
   125   for (uint32_t i = 0; i < sizeof (double); ++i, ++buf)
       
   126     {
       
   127       *buf = ReadU8 ();
       
   128     }
       
   129   return v;
       
   130 }
       
   131 void 
       
   132 TagBuffer::Read (uint8_t *buffer, uint32_t size)
       
   133 {
       
   134   for (uint32_t i = 0; i < size; ++i, ++buffer)
       
   135     {
       
   136       *buffer = ReadU8 ();
       
   137     }
       
   138 }
       
   139 TagBuffer::TagBuffer (uint8_t *start, uint8_t *end)
       
   140   : m_current (start),
       
   141     m_end (end)
       
   142 {}
       
   143 
       
   144 void 
       
   145 TagBuffer::TrimAtEnd (uint32_t trim)
       
   146 {
       
   147   NS_ASSERT (m_current <= (m_end - trim));
       
   148   m_end -= trim;
       
   149 }
       
   150 
       
   151 void 
       
   152 TagBuffer::CopyFrom (TagBuffer o)
       
   153 {
       
   154   uint32_t size = o.m_end - o.m_current;
       
   155   NS_ASSERT (size <= m_end - m_current);
       
   156   memcpy (m_current, o.m_current, size);
       
   157   m_current += size;
       
   158 }
       
   159 
       
   160 } // namespace ns3