void Asn1Header::SerializeInteger()

in simulation/src/lte/model/lte-asn1-header.cc [322:416]


void Asn1Header::SerializeInteger (int n, int nmin, int nmax) const
{
  // The following is equivalent to:
  //  NS_ASSERT_MSG (nmin <= n && n <= nmax,
  //               "Integer " << n << " is outside range [" << nmin << ", " << nmax << "]");
  // This is a workaround to gcc-7 aggressive optimization, see #346, and can be dropped
  // once gcc-7 will not be anymore supported.
  long int nComp = nmin;
  nComp -= n;
  NS_ASSERT_MSG (nComp <= 0 && n <= nmax,
                 "Integer " << n << " is outside range [" << nmin << ", " << nmax << "]");

  // Clause 11.5.3 ITU-T X.691
  int range = nmax - nmin + 1;
  // Subtract nmin to n
  n -= nmin;

  // Clause 11.5.4 ITU-T X.691
  if (range <= 1)
    {
      return;
    }

  // Clause 11.5.6 ITU-T X.691
  int requiredBits = std::ceil (std::log (range) / std::log (2.0));

  switch (requiredBits)
    {
    case 1:
      SerializeBitset<1> (std::bitset<1> (n));
      break;
    case 2:
      SerializeBitset<2> (std::bitset<2> (n));
      break;
    case 3:
      SerializeBitset<3> (std::bitset<3> (n));
      break;
    case 4:
      SerializeBitset<4> (std::bitset<4> (n));
      break;
    case 5:
      SerializeBitset<5> (std::bitset<5> (n));
      break;
    case 6:
      SerializeBitset<6> (std::bitset<6> (n));
      break;
    case 7:
      SerializeBitset<7> (std::bitset<7> (n));
      break;
    case 8:
      SerializeBitset<8> (std::bitset<8> (n));
      break;
    case 9:
      SerializeBitset<9> (std::bitset<9> (n));
      break;
    case 10:
      SerializeBitset<10> (std::bitset<10> (n));
      break;
    case 11:
      SerializeBitset<11> (std::bitset<11> (n));
      break;
    case 12:
      SerializeBitset<12> (std::bitset<12> (n));
      break;
    case 13:
      SerializeBitset<13> (std::bitset<13> (n));
      break;
    case 14:
      SerializeBitset<14> (std::bitset<14> (n));
      break;
    case 15:
      SerializeBitset<15> (std::bitset<15> (n));
      break;
    case 16:
      SerializeBitset<16> (std::bitset<16> (n));
      break;
    case 17:
      SerializeBitset<17> (std::bitset<17> (n));
      break;
    case 18:
      SerializeBitset<18> (std::bitset<18> (n));
      break;
    case 19:
      SerializeBitset<19> (std::bitset<19> (n));
      break;
    case 20:
      SerializeBitset<20> (std::bitset<20> (n));
      break;
    default:
      {
        std::cout << "SerializeInteger " << requiredBits << " Out of range!!" << std::endl;
        exit (1);
      }
    }
}