18 #ifndef __ACE_INLINE__ 33 typedef RangeSet::Container::iterator iter_t;
37 && range_above->first <= range.first) {
45 newRange.second = range_above->second;
53 const iter_t range_below =
55 (previous > 0) ? previous
60 if (newRange.first > range_below->first) {
61 newRange.first = range_below->first;
65 iter_t gap_iter = range_below;
66 if (range.first < gap_iter->second) {
68 gap_iter->second.previous()));
71 for (; gap_iter != range_above; ++gap_iter) {
73 std::min(gap_iter->first.previous().getValue(),
74 range.second.getValue());
76 last_gap = gap_iter->second;
78 if (last_gap < range.second) {
94 bool inserted =
false;
96 bool range_start_is_valid =
false;
101 for (
ACE_CDR::ULong i = 0, x = 0, bit = 0; i < num_bits; ++i, ++bit) {
103 if (bit == 32) bit = 0;
118 if (x & (1 << (31 - bit))) {
119 if (!range_start_is_valid) {
120 range_start = val + i;
121 range_start_is_valid =
true;
123 }
else if (range_start_is_valid) {
130 range_start_is_valid =
false;
136 if (next_i / 32 != i / 32 && next_i < num_bits) {
144 if (range_start_is_valid) {
163 next = range.second.getValue() + 1;
180 if (iter->first <= range.first && iter->second >= range.second) {
186 RangeSet::Container::iterator right = iter;
191 && right->first <= next && right->first > range.first) {
192 high = right->second;
242 bool clamped =
false;
243 if ((low / 32) >= length) {
246 if ((high / 32) >= length) {
247 high = length * 32 - 1;
251 const ACE_CDR::ULong idx_nb = num_bits / 32, bit_nb = num_bits % 32,
252 idx_low = low / 32, bit_low = low % 32,
253 idx_high = high / 32, bit_high = high % 32;
257 bitmap[idx_nb] &= ~((0x1u << (32 - bit_nb)) - 1);
269 if (idx_low > idx_nb) {
270 bitmap[idx_low] = (0x1u << (32 - bit_low)) - 1;
272 bitmap[idx_low] |= (0x1u << (32 - bit_low)) - 1;
275 bitmap[idx_low] = 0xFFFFFFFF;
280 bitmap[i] = 0xFFFFFFFF;
284 if (idx_high > idx_low) {
285 bitmap[idx_high] = ~((0x1u << (31 - bit_high)) - 1);
286 }
else if (bit_high < 31) {
287 bitmap[idx_high] &= ~((0x1u << (31 - bit_high)) - 1);
291 cumulative_bits_added += high - low + 1;
296 DisjointSequence::missing_sequence_ranges()
const 308 missingHigh = secondIter->first.
previous();
310 if (missingLow <= missingHigh) {
322 "SequenceNumbers:\n",
this));
326 this, iter->first.getValue(), iter->second.getValue()));
333 return high < low ? 0u : std::min(8u,
unsigned((high.
getValue() - low.
getValue() + 32) / 32));
339 RangeSet::Container::iterator iter =
342 if (iter->first == value &&
343 iter->second == value) {
345 }
else if (iter->first == value) {
349 }
else if (iter->second == value) {
const LogLevel::Value value
void erase(SequenceNumber value)
SequenceNumber previous() const
SequenceNumber cumulative_ack() const
bool insert_i(const SequenceRange &range, OPENDDS_VECTOR(SequenceRange) *gaps=0)
OPENDDS_VECTOR(SequenceRange) missing_sequence_ranges() const
Returns missing ranges of SequenceNumbers (internal gaps in the sequence)
#define OPENDDS_ASSERT(C)
const_iterator begin() const
SequenceNumber low() const
static SequenceNumber ZERO()
bool insert(const SequenceRange &range, OPENDDS_VECTOR(SequenceRange)&added)
static ACE_CDR::ULong bitmap_num_longs(const SequenceNumber &low, const SequenceNumber &high)
std::pair< SequenceNumber, SequenceNumber > SequenceRange
Sequence number abstraction. Only allows positive 64 bit values.
bool to_bitmap(ACE_CDR::Long bitmap[], ACE_CDR::ULong length, ACE_CDR::ULong &num_bits, ACE_CDR::ULong &cumulative_bits_added, bool invert=false) const
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
Container::const_iterator const_iterator
static bool fill_bitmap_range(ACE_CDR::ULong low, ACE_CDR::ULong high, ACE_CDR::Long bitmap[], ACE_CDR::ULong length, ACE_CDR::ULong &num_bits, ACE_CDR::ULong &cumulative_bits_added)
Set the bits in range [low, high] in the bitmap, updating num_bits.
typedef OPENDDS_VECTOR(ActionConnectionRecord) ConnectionRecords
bool insert_bitmap_range(RangeSet::Container::iterator &iter, const SequenceRange &sr)
The Internal API and Implementation of OpenDDS.
SequenceNumber high() const
const_iterator end() const