OpenDDS  Snapshot(2023/04/07-19:43)
Public Types | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | Friends | List of all members
OpenDDS::DCPS::DisjointSequence::OrderedRanges< T > Class Template Reference

#include <DisjointSequence.h>

Public Types

typedef std::pair< T, T > TPair
 
typedef bool(* Compare) (const TPair &, const TPair &)
 
typedef Container::size_type size_type
 
typedef Container::const_iterator const_iterator
 
typedef const_iterator iterator
 
typedef Container::const_reverse_iterator const_reverse_iterator
 
typedef const_reverse_iterator reverse_iterator
 

Public Member Functions

typedef OPENDDS_SET_CMP (TPair, Compare) Container
 
 OrderedRanges ()
 
const_iterator begin () const
 
const_iterator cbegin () const
 
const_iterator end () const
 
const_iterator cend () const
 
const_reverse_iterator rbegin () const
 
const_reverse_iterator crbegin () const
 
const_reverse_iterator rend () const
 
const_reverse_iterator crend () const
 
bool empty () const
 
size_type size () const
 
void clear ()
 
void add (T lower, T upper)
 
void add (T value)
 
void remove (T value)
 
pop_front ()
 
bool has (T lower, T upper) const
 
bool has (const TPair &range) const
 
bool has (T value) const
 
bool has_any (T lower, T upper) const
 
bool has_any (const TPair &range) const
 

Static Public Member Functions

static bool range_less (const TPair &lhs, const TPair &rhs)
 

Private Member Functions

const_iterator lower_bound (const TPair &p) const
 
const_iterator lower_bound (T t) const
 
Container::iterator lower_bound_i (T t)
 
const_iterator upper_bound (const TPair &p) const
 
const_iterator upper_bound (T t) const
 
void remove_i (typename Container::iterator iter, T value)
 

Private Attributes

Container ranges_
 

Friends

class DisjointSequence
 
template<typename Type >
bool operator== (const OrderedRanges< Type > &a, const OrderedRanges< Type > &b)
 

Detailed Description

template<typename T>
class OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >

Core data structure of DisjointSequence: Use a balanced binary tree (std::set) to store a list of ranges (std::pair of T). Maintain invariants (in addition to those from std::set):

Definition at line 125 of file DisjointSequence.h.

Member Typedef Documentation

◆ Compare

template<typename T>
typedef bool(* OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::Compare) (const TPair &, const TPair &)

Definition at line 128 of file DisjointSequence.h.

◆ const_iterator

template<typename T>
typedef Container::const_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::const_iterator

Definition at line 131 of file DisjointSequence.h.

◆ const_reverse_iterator

template<typename T>
typedef Container::const_reverse_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::const_reverse_iterator

Definition at line 133 of file DisjointSequence.h.

◆ iterator

Definition at line 132 of file DisjointSequence.h.

◆ reverse_iterator

Definition at line 134 of file DisjointSequence.h.

◆ size_type

template<typename T>
typedef Container::size_type OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::size_type

Definition at line 130 of file DisjointSequence.h.

◆ TPair

template<typename T>
typedef std::pair<T, T> OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::TPair

Definition at line 127 of file DisjointSequence.h.

Constructor & Destructor Documentation

◆ OrderedRanges()

template<typename T>
OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::OrderedRanges ( )
inline

Definition at line 141 of file DisjointSequence.h.

143  {}
static bool range_less(const TPair &lhs, const TPair &rhs)

Member Function Documentation

◆ add() [1/2]

template<typename T>
void OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::add ( lower,
upper 
)
inline

Definition at line 161 of file DisjointSequence.h.

Referenced by OpenDDS::XTypes::DynamicDataImpl::insert_valid_discriminator(), OpenDDS::Security::XmlUtils::parse_domain_id_set(), and OpenDDS::DCPS::DomainParticipantImpl::return_handle().

162  {
163  OPENDDS_ASSERT(upper >= lower);
164  if (has(lower, upper)) {
165  return;
166  }
167 
168  const T above = upper + 1;
169  for (typename Container::iterator i = lower_bound_i(lower - 1);
170  i != ranges_.end() && (i->first <= above || i->second <= above);
171  /* iterate in loop because of removal */) {
172  lower = (std::min)(lower, i->first);
173  upper = (std::max)(upper, i->second);
174  ranges_.erase(i++);
175  }
176 
177  ranges_.insert(TPair(lower, upper));
178  }
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:66

◆ add() [2/2]

template<typename T>
void OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::add ( value)
inline

Definition at line 180 of file DisjointSequence.h.

181  {
182  add(value, value);
183  }
const LogLevel::Value value
Definition: debug.cpp:61

◆ begin()

template<typename T>
const_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::begin ( void  ) const
inline

◆ cbegin()

template<typename T>
const_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::cbegin ( ) const
inline

Definition at line 146 of file DisjointSequence.h.

146 { return ranges_.begin(); }

◆ cend()

template<typename T>
const_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::cend ( ) const
inline

Definition at line 149 of file DisjointSequence.h.

◆ clear()

template<typename T>
void OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::clear ( void  )
inline

◆ crbegin()

template<typename T>
const_reverse_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::crbegin ( ) const
inline

Definition at line 152 of file DisjointSequence.h.

152 { return ranges_.rbegin(); }

◆ crend()

template<typename T>
const_reverse_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::crend ( ) const
inline

Definition at line 155 of file DisjointSequence.h.

◆ empty()

template<typename T>
bool OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::empty ( void  ) const
inline

◆ end()

template<typename T>
const_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::end ( void  ) const
inline

◆ has() [1/3]

template<typename T>
bool OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::has ( lower,
upper 
) const
inline

Definition at line 201 of file DisjointSequence.h.

Referenced by OpenDDS::DCPS::DisjointSequence::insert_filtered().

202  {
203  const const_iterator iter = lower_bound(upper);
204  return iter != end() && !(lower < iter->first);
205  }
const_iterator lower_bound(const TPair &p) const

◆ has() [2/3]

template<typename T>
bool OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::has ( const TPair range) const
inline

Definition at line 207 of file DisjointSequence.h.

208  {
209  return has(range.first, range.second);
210  }

◆ has() [3/3]

template<typename T>
bool OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::has ( value) const
inline

Definition at line 212 of file DisjointSequence.h.

213  {
214  return has(value, value);
215  }
const LogLevel::Value value
Definition: debug.cpp:61

◆ has_any() [1/2]

template<typename T>
bool OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::has_any ( lower,
upper 
) const
inline

Definition at line 217 of file DisjointSequence.h.

Referenced by OpenDDS::DCPS::DisjointSequence::insert_filtered().

218  {
219  const const_iterator iter = lower_bound(lower);
220  return iter != end() && !(upper < iter->first);
221  }
const_iterator lower_bound(const TPair &p) const

◆ has_any() [2/2]

template<typename T>
bool OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::has_any ( const TPair range) const
inline

Definition at line 223 of file DisjointSequence.h.

224  {
225  return has_any(range.first, range.second);
226  }

◆ lower_bound() [1/2]

template<typename T>
const_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::lower_bound ( const TPair p) const
inlineprivate

Definition at line 232 of file DisjointSequence.h.

232 { return ranges_.lower_bound(p); }

◆ lower_bound() [2/2]

template<typename T>
const_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::lower_bound ( t) const
inlineprivate

Definition at line 234 of file DisjointSequence.h.

235  {
236  return ranges_.lower_bound(TPair(T() /*ignored*/, t));
237  }

◆ lower_bound_i()

template<typename T>
Container::iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::lower_bound_i ( t)
inlineprivate

Definition at line 240 of file DisjointSequence.h.

241  {
242  return ranges_.lower_bound(TPair(T() /*ignored*/, t));
243  }

◆ OPENDDS_SET_CMP()

template<typename T>
typedef OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::OPENDDS_SET_CMP ( TPair  ,
Compare   
)

◆ pop_front()

template<typename T>
T OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::pop_front ( )
inline

Definition at line 194 of file DisjointSequence.h.

Referenced by OpenDDS::DCPS::DomainParticipantImpl::assign_handle().

195  {
196  const T value = begin()->first;
197  remove_i(ranges_.begin(), value);
198  return value;
199  }
const LogLevel::Value value
Definition: debug.cpp:61
void remove_i(typename Container::iterator iter, T value)

◆ range_less()

template<typename T>
static bool OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::range_less ( const TPair lhs,
const TPair rhs 
)
inlinestatic

Definition at line 136 of file DisjointSequence.h.

137  {
138  return lhs.second < rhs.second;
139  }

◆ rbegin()

template<typename T>
const_reverse_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::rbegin ( void  ) const
inline

◆ remove()

template<typename T>
void OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::remove ( value)
inline

Definition at line 185 of file DisjointSequence.h.

186  {
187  const typename Container::iterator iter = lower_bound_i(value);
188  if (iter == end() || value < iter->first) {
189  return;
190  }
191  remove_i(iter, value);
192  }
const LogLevel::Value value
Definition: debug.cpp:61
void remove_i(typename Container::iterator iter, T value)

◆ remove_i()

template<typename T>
void OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::remove_i ( typename Container::iterator  iter,
value 
)
inlineprivate

Definition at line 253 of file DisjointSequence.h.

254  {
255  const TPair orig = *iter;
256  ranges_.erase(iter);
257  if (value == orig.first) {
258  if (value < orig.second) {
259  ranges_.insert(TPair(value + T(1), orig.second));
260  }
261  } else if (value == orig.second) {
262  ranges_.insert(TPair(orig.first, value - T(1)));
263  } else {
264  ranges_.insert(TPair(orig.first, value - T(1)));
265  ranges_.insert(TPair(value + T(1), orig.second));
266  }
267  }
const LogLevel::Value value
Definition: debug.cpp:61

◆ rend()

template<typename T>
const_reverse_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::rend ( void  ) const
inline

Definition at line 154 of file DisjointSequence.h.

◆ size()

template<typename T>
size_type OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::size ( void  ) const
inline

Definition at line 158 of file DisjointSequence.h.

Referenced by OpenDDS::DCPS::DisjointSequence::disjoint().

◆ upper_bound() [1/2]

template<typename T>
const_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::upper_bound ( const TPair p) const
inlineprivate

Definition at line 245 of file DisjointSequence.h.

245 { return ranges_.upper_bound(p); }

◆ upper_bound() [2/2]

template<typename T>
const_iterator OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::upper_bound ( t) const
inlineprivate

Definition at line 247 of file DisjointSequence.h.

248  {
249  return ranges_.upper_bound(TPair(T() /*ignored*/, t));
250  }

Friends And Related Function Documentation

◆ DisjointSequence

template<typename T>
friend class DisjointSequence
friend

Definition at line 269 of file DisjointSequence.h.

◆ operator==

template<typename T>
template<typename Type >
bool operator== ( const OrderedRanges< Type > &  a,
const OrderedRanges< Type > &  b 
)
friend

Member Data Documentation

◆ ranges_

template<typename T>
Container OpenDDS::DCPS::DisjointSequence::OrderedRanges< T >::ranges_
private

The documentation for this class was generated from the following file: