30 bool current_state = from.
get_bit(0);
37 if (from.
get_bit(i) != current_state) {
39 if (current_state != empty_bit) {
40 Subrange
range(begin, i);
44 current_state = !current_state;
49 nassertv(current_state == empty_bit);
63 Subranges::const_iterator si;
64 for (si = _subranges.
begin(); si != _subranges.
end(); ++si) {
65 result += (*si)._end - (*si)._begin;
82 Subranges::const_iterator si;
83 for (si = _subranges.
begin(); si != _subranges.
end(); ++si) {
84 result += (*si)._end - (*si)._begin;
100 if (_subranges.
empty()) {
104 return _subranges[0]._begin;
117 if (_subranges.
empty()) {
121 return _subranges[0]._begin;
134 if (_subranges.
empty()) {
138 return _subranges[_subranges.
size() - 1]._end - 1;
151 if (_subranges.
empty()) {
155 return _subranges[_subranges.
size() - 1]._end - 1;
167 Subrange
range(low_bit, low_bit + 1);
168 Subranges::const_iterator si = _subranges.lower_bound(
range);
169 if (si == _subranges.
end()) {
174 if (low_bit >= (*si)._begin) {
178 int next = (*si)._begin;
180 if (si != _subranges.
begin()) {
182 if (low_bit < (*si)._end) {
198 if (_inverse && other._inverse) {
203 if (_inverse != other._inverse) {
205 return !(*
this & other).
is_zero();
210 return !(*
this & other).
is_zero();
217 output(std::ostream &out)
const {
220 out <<
"all except: ";
222 Subranges::const_iterator si;
223 for (si = _subranges.
begin(); si != _subranges.
end(); ++si) {
224 if ((*si)._end == (*si)._begin + 1) {
226 out << (*si)._begin <<
", ";
229 out << (*si)._begin <<
"-" << ((*si)._end - 1) <<
", ";
243 if (_inverse != other._inverse) {
244 return _inverse ? 1 : -1;
247 Subranges::const_reverse_iterator ai = _subranges.
rbegin();
248 Subranges::const_reverse_iterator bi = other._subranges.
rbegin();
250 while (ai != _subranges.
rend() && bi != other._subranges.
rend()) {
251 if ((*ai)._end < (*bi)._end) {
254 }
else if ((*bi)._end < (*ai)._end) {
257 }
else if ((*ai)._begin < (*bi)._begin) {
260 }
else if ((*bi)._begin < (*ai)._begin) {
269 if (ai != _subranges.
rend()) {
273 if (bi != other._subranges.
rend()) {
290 if (_inverse && other._inverse) {
293 }
else if (!_inverse && !other._inverse) {
294 do_intersection(other);
296 }
else if (_inverse && !other._inverse) {
298 (*this) = other & (*this);
300 }
else if (!_inverse && other._inverse) {
301 do_intersection_neg(other);
318 if (_inverse && other._inverse) {
319 do_intersection(other);
321 }
else if (!_inverse && !other._inverse) {
324 }
else if (_inverse && !other._inverse) {
325 do_intersection_neg(other);
327 }
else if (!_inverse && other._inverse) {
329 (*this) = other | (*this);
345 (*this) = ((*this) | other) & ~((*
this) & other);
354 do_add_range(
int begin,
int end) {
360 Subrange
range(begin, end);
361 Subranges::iterator si = _subranges.lower_bound(
range);
362 if (si == _subranges.
end()) {
363 if (!_subranges.
empty()) {
364 si = _subranges.
begin() + _subranges.
size() - 1;
365 if ((*si)._end >= begin) {
382 nassertv((*si)._end >= end);
384 if ((*si)._begin > end) {
385 if (si != _subranges.
begin()) {
386 Subranges::iterator si2 = si;
388 if ((*si2)._end >= begin) {
407 while (si != _subranges.
begin()) {
408 Subranges::iterator si2 = si;
410 if ((*si2)._end >= begin) {
412 (*si2)._end = (*si)._end;
413 _subranges.erase(si);
421 if ((*si)._begin > begin) {
423 (*si)._begin = begin;
432 do_remove_range(
int begin,
int end) {
438 Subrange
range(begin, end);
439 Subranges::iterator si = _subranges.lower_bound(
range);
440 if (si == _subranges.
end()) {
441 if (!_subranges.
empty()) {
442 si = _subranges.
begin() + _subranges.
size() - 1;
443 if ((*si)._end >= begin) {
445 end = std::min(end, (*si)._begin);
459 nassertv((*si)._end >= end);
461 if ((*si)._begin > end) {
462 if (si != _subranges.
begin()) {
463 Subranges::iterator si2 = si;
465 if ((*si2)._end >= begin) {
468 end = std::min(end, (*si2)._begin);
483 if (end < (*si)._end) {
485 Subrange left_range((*si)._begin, begin);
491 while (begin <= (*si)._begin) {
492 if (si == _subranges.
begin()) {
493 _subranges.erase(si);
496 Subranges::iterator si2 = si;
498 _subranges.erase(si);
502 (*si)._end = std::min((*si)._end, begin);
511 do_has_any(
int begin,
int end)
const {
517 Subrange
range(begin, end);
518 Subranges::const_iterator si = _subranges.lower_bound(
range);
519 if (si != _subranges.
end() && end > (*si)._begin) {
522 if (si != _subranges.
begin()) {
524 if (begin < (*si)._end) {
538 do_has_all(
int begin,
int end)
const {
544 Subrange
range(begin, end);
545 Subranges::const_iterator si = _subranges.lower_bound(
range);
546 if (si != _subranges.
end() && begin >= (*si)._begin) {
559 if (_subranges.
empty()) {
562 if (other._subranges.
empty()) {
567 int my_begin = (*_subranges.
begin())._begin;
568 int other_begin = (*other._subranges.
begin())._begin;
569 do_remove_range(my_begin, other_begin);
571 for (
size_t i = 0; i < other._subranges.
size() - 1; ++i) {
572 do_remove_range(other._subranges[i]._end, other._subranges[i + 1]._begin);
575 int my_end = (*(_subranges.
begin() + _subranges.
size() - 1))._end;
576 int other_end = (*(other._subranges.
begin() + other._subranges.
size() - 1))._end;
577 do_remove_range(other_end, my_end);
585 Subranges::const_iterator si;
586 for (si = other._subranges.
begin(); si != other._subranges.
end(); ++si) {
587 do_add_range((*si)._begin, (*si)._end);
597 Subranges::const_iterator si;
598 for (si = other._subranges.
begin(); si != other._subranges.
end(); ++si) {
599 do_remove_range((*si)._begin, (*si)._end);
607 do_shift(
int offset) {
609 Subranges::iterator si;
610 for (si = _subranges.
begin(); si != _subranges.
end(); ++si) {
611 (*si)._begin += offset;
612 (*si)._end += offset;
624 Subranges::const_iterator si;
625 for (si = _subranges.
begin(); si != _subranges.
end(); ++si) {
638 _subranges.
reserve(num_subranges);
639 for (
size_t i = 0; i < num_subranges; ++i) {
642 _subranges.
push_back(Subrange(begin, end));
This class records a set of integers, where each integer is either present or not present in the set.
int get_lowest_on_bit() const
Returns the index of the lowest 1 bit in the array.
bool get_bool()
Extracts a boolean value.
bool get_highest_bits() const
Returns true if the infinite set of bits beyond get_num_bits() are all on, or false of they are all o...
int get_lowest_off_bit() const
Returns the index of the lowest 0 bit in the array.
bool get_bit(int index) const
Returns true if the nth bit is set, false if it is cleared.
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
size_type_0 size() const
Returns the number of elements in the ordered vector.
void clear()
Removes all elements from the ordered vector.
void write_datagram(BamWriter *manager, Datagram &dg) const
Writes the contents of this object to the datagram for shipping out to a Bam file.
int get_next_higher_different_bit(int low_bit) const
Returns the index of the next bit in the array, above low_bit, whose value is different that the valu...
int get_num_off_bits() const
Returns the number of bits that are set to 0 in the array.
iterator_0 begin()
Returns the iterator that marks the first element in the ordered vector.
bool is_zero() const
Returns true if the entire bitmask is zero, false otherwise.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
iterator_0 end()
Returns the iterator that marks the end of the ordered vector.
int32_t get_int32()
Extracts a signed 32-bit integer.
void reserve(size_type_0 n)
Informs the vector of a planned change in size; ensures that the capacity of the vector is greater th...
bool empty() const
Returns true if the ordered vector is empty, false otherwise.
int get_highest_on_bit() const
Returns the index of the highest 1 bit in the array.
void add_uint32(uint32_t value)
Adds an unsigned 32-bit integer to the datagram.
A dynamic array with an unlimited number of bits.
iterator_0 insert_unverified(iterator_0 position, const value_type_0 &key)
Inserts the indicated key into the ordered vector at the indicated place.
void add_bool(bool value)
Adds a boolean value to the datagram.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
reverse_iterator_0 rbegin()
Returns the iterator that marks the first element in the ordered vector, when viewed in reverse order...
uint32_t get_uint32()
Extracts an unsigned 32-bit integer.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
int get_highest_off_bit() const
Returns the index of the highest 0 bit in the array.
bool has_bits_in_common(const SparseArray &other) const
Returns true if this SparseArray has any "one" bits in common with the other one, false otherwise.
static SparseArray range(int low_bit, int size)
Returns a SparseArray whose size bits, beginning at low_bit, are on.
int compare_to(const SparseArray &other) const
Returns a number less than zero if this SparseArray sorts before the indicated other SparseArray,...
void push_back(const value_type_0 &key)
Adds the new element to the end of the vector without regard for proper sorting.
reverse_iterator_0 rend()
Returns the iterator that marks the end of the ordered vector, when viewed in reverse order.
void add_int32(int32_t value)
Adds a signed 32-bit integer to the datagram.
size_t get_num_bits() const
Returns the current number of possibly different bits in this array.
A class to retrieve the individual data elements previously stored in a Datagram.
TypeHandle is the identifier used to differentiate C++ class types.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
void read_datagram(DatagramIterator &scan, BamReader *manager)
Reads the object that was previously written to a Bam file.
int get_num_on_bits() const
Returns the number of bits that are set to 1 in the array.