22 #include "ns3/fatal-error.h"
24 #include "nix-vector.h"
30 typedef std::vector<uint32_t> NixBits_t;
32 NixVector::NixVector ()
35 m_currentVectorBitSize (0),
40 m_nixVector.push_back (0);
43 NixVector::~NixVector ()
49 : m_nixVector (o.m_nixVector),
51 m_currentVectorBitSize (o.m_currentVectorBitSize),
52 m_totalBitSize (o.m_totalBitSize)
63 m_nixVector = o.m_nixVector;
65 m_currentVectorBitSize = o.m_currentVectorBitSize;
66 m_totalBitSize = o.m_totalBitSize;
82 nix.DumpNixVector (os);
91 if (numberOfBits > 32)
93 NS_FATAL_ERROR (
"Can't add more than 32 bits to a nix-vector at one time");
100 if (m_currentVectorBitSize + numberOfBits > 32)
102 if (m_currentVectorBitSize == 32)
106 m_nixVector.push_back (newBits);
112 m_currentVectorBitSize = numberOfBits;
113 m_totalBitSize += numberOfBits;
119 uint32_t tempBits = newBits;
120 tempBits = newBits << m_currentVectorBitSize;
121 tempBits |= m_nixVector.back ();
122 m_nixVector.back () = tempBits;
127 newBits = newBits >> (32 - m_currentVectorBitSize);
128 m_nixVector.push_back (newBits);
134 m_currentVectorBitSize = (numberOfBits - (32 - m_currentVectorBitSize));
135 m_totalBitSize += numberOfBits;
145 newBits = newBits << m_currentVectorBitSize;
146 newBits |= m_nixVector.back ();
152 m_nixVector.back () = newBits;
153 m_currentVectorBitSize += numberOfBits;
154 m_totalBitSize += numberOfBits;
163 if (numberOfBits > 32)
165 NS_FATAL_ERROR (
"Can't extract more than 32 bits to a nix-vector at one time");
168 uint32_t vectorIndex = 0;
169 uint32_t extractedBits = 0;
172 if (numberOfBits > totalRemainingBits)
174 NS_FATAL_ERROR (
"You've tried to extract too many bits of the Nix-vector, " <<
this <<
". NumberBits: "
175 << numberOfBits <<
" Remaining: " << totalRemainingBits);
178 if (numberOfBits <= 0)
180 NS_FATAL_ERROR (
"You've specified a number of bits for Nix-vector <= 0!");
187 vectorIndex = ((totalRemainingBits-1) / 32);
193 if ((numberOfBits-1) > ((totalRemainingBits-1) % 32))
195 extractedBits = m_nixVector.at (vectorIndex) << (32 - (totalRemainingBits % 32));
196 extractedBits = extractedBits >> ((32 - (totalRemainingBits % 32))
197 - (numberOfBits - (totalRemainingBits % 32)));
198 extractedBits |= (m_nixVector.at (vectorIndex-1)
199 >> (32 - (numberOfBits - (totalRemainingBits % 32))));
200 m_used += numberOfBits;
201 return extractedBits;
206 extractedBits = m_nixVector.at (vectorIndex) << (32 - (totalRemainingBits % 32));
207 extractedBits = extractedBits >> (32 - (numberOfBits));
208 m_used += numberOfBits;
209 return extractedBits;
216 uint32_t totalSizeInBytes = 0;
217 totalSizeInBytes =
sizeof (m_used) +
sizeof (m_currentVectorBitSize) +
218 sizeof (m_totalBitSize) + (4 * m_nixVector.size ());
220 return totalSizeInBytes;
227 uint32_t* p = buffer;
230 if (size + 4 <= maxSize)
241 if (size + 4 <= maxSize)
246 *p++ = m_currentVectorBitSize;
253 if (size + 4 <= maxSize)
257 *p++ = m_totalBitSize;
263 for (uint32_t j = 0; j < m_nixVector.size (); j++)
265 if (size + 4 <= maxSize)
268 *p++ = m_nixVector.at (j);
284 const uint32_t* p = buffer;
285 uint32_t sizeCheck = size - 4;
292 m_currentVectorBitSize = *p++;
296 m_totalBitSize = *p++;
301 m_nixVector.clear ();
302 while (sizeCheck > 0)
306 m_nixVector.push_back (nix);
314 return (sizeCheck != 0) ? 0 : 1;
318 NixVector::DumpNixVector (std::ostream &os)
const
321 uint32_t i = m_nixVector.size ();
322 std::vector<uint32_t>::const_reverse_iterator rIter;
323 for (rIter = m_nixVector.rbegin (); rIter != m_nixVector.rend (); rIter++)
325 uint32_t numBits =
BitCount (*rIter);
333 if (m_totalBitSize > ((
sizeof (uint32_t)*8) * i))
335 PrintDec2BinNixFill (*rIter,numBits,os);
337 else if (m_totalBitSize%32 == 0)
339 PrintDec2BinNix (*rIter,32,os);
343 PrintDec2BinNix (*rIter,m_totalBitSize%32,os);
360 return (m_totalBitSize - m_used);
370 uint32_t bitCount = 0;
372 if (numberOfNeighbors < 2)
378 for (numberOfNeighbors -= 1; numberOfNeighbors != 0; numberOfNeighbors >>= 1)
387 NixVector::PrintDec2BinNix (uint32_t decimalNum, uint32_t bitCount, std::ostream &os)
const
392 for (; bitCount > 0; bitCount--)
400 for (; bitCount > 1; bitCount--)
408 PrintDec2BinNix (decimalNum / 2,bitCount-1, os);
409 os << decimalNum % 2;
414 NixVector::PrintDec2BinNixFill (uint32_t decimalNum, uint32_t bitCount, std::ostream &os)
const
427 if ((uint32_t)(
sizeof (uint32_t)*8) > bitCount)
429 for (uint32_t i = ((
sizeof (uint32_t)*8)-bitCount); i > 0; i--)
438 PrintDec2BinNixFill (decimalNum / 2, bitCount, os);
439 os << decimalNum % 2;
#define NS_LOG_FUNCTION(parameters)
Neighbor-index data structure for nix-vector routing.
Ptr< NixVector > Copy(void) const
NixVector & operator=(const NixVector &o)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
#define NS_FATAL_ERROR(msg)
fatal error handling
uint32_t GetRemainingBits(void)
uint32_t ExtractNeighborIndex(uint32_t numberOfBits)
uint32_t Serialize(uint32_t *buffer, uint32_t maxSize) const
uint32_t GetSerializedSize(void) const
std::ostream & operator<<(std::ostream &os, const Angles &a)
uint32_t Deserialize(const uint32_t *buffer, uint32_t size)
void AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits)
uint32_t BitCount(uint32_t numberOfNeighbors) const