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