void Asn1Header::SerializeBitset()

in simulation/src/lte/model/lte-asn1-header.cc [89:170]


void Asn1Header::SerializeBitset (std::bitset<N> data) const
{

  size_t dataSize = data.size ();
  uint8_t pendingBits = dataSize;
  uint8_t mask = 1;
  int j;

  // No extension marker (Clause 16.7 ITU-T X.691),
  // as 3GPP TS 36.331 does not use it in its IE's.

  // Clause 16.8 ITU-T X.691
  if (dataSize == 0)
    {
      return;
    }

  // Clause 16.9 ITU-T X.691
  // Clause 16.10 ITU-T X.691
  if (dataSize <= 65536)
    {
      // If there are bits pending to be processed,
      // append first bits in data to complete an octet.
      if (m_numSerializationPendingBits > 0)
        {
          mask = 0x80 >> m_numSerializationPendingBits;
          while (pendingBits > 0 && m_numSerializationPendingBits < 8)
            {
              m_serializationPendingBits |= (data[pendingBits - 1]) ? mask : 0;
              pendingBits--;
              m_numSerializationPendingBits++;
              mask = (mask >> 1) & (~mask);
            }

          if (m_numSerializationPendingBits >= 8)
            {
              WriteOctet (m_serializationPendingBits);
              m_numSerializationPendingBits = 0;
              m_serializationPendingBits = 0;
            }
        }

      while (pendingBits > 0)
        {
          mask = 1;
          j = 8;

          // If there are less than 8 remaining bits,
          // store it to m_serializationPendingBits.
          if (pendingBits < 8)
            {
              mask = 0x80;
              m_numSerializationPendingBits = pendingBits;
              while (pendingBits > 0)
                {
                  m_serializationPendingBits |= (data[pendingBits - 1]) ? mask : 0;
                  mask = (mask >> 1) & (~mask);
                  pendingBits--;
                }
            }

          // Write the data to buffer
          else
            {
              uint8_t octetToWrite = 0;
              for (; j > 0; j--)
                {
                  octetToWrite |= (data[pendingBits - j]) ? mask : 0;
                  mask = (mask << 1) & (~mask);
                }
              WriteOctet (octetToWrite);
              pendingBits -= 8;
            }
        }
    }

  // Clause 16.11 ITU-T X.691
  else
    {
      printf ("FRAGMENTATION NEEDED!\n");
    }
}