5 #ifndef YGG_INTERVALMAP_HPP 6 #define YGG_INTERVALMAP_HPP 8 #include "intervaltree.hpp" 10 #include "options.hpp" 12 #include "size_holder.hpp" 16 namespace intervalmap_internal {
20 class RepresentativeSegListTag {
25 template <
class KeyT,
class ValueT>
27 :
public RBTreeNodeBase<InnerNode<KeyT, ValueT>,
28 TreeOptions<TreeFlags::MULTIPLE>, InnerRBTTag>,
29 public ListNodeBase<InnerNode<KeyT, ValueT>, SegListTag>,
30 public ListNodeBase<InnerNode<KeyT, ValueT>, RepresentativeSegListTag> {
34 InnerNode<KeyT, ValueT> * repr;
39 operator()(
const InnerNode<KeyT, ValueT> & lhs,
40 const InnerNode<KeyT, ValueT> & rhs)
const 42 return lhs.point < rhs.point;
46 operator()(
int lhs,
const InnerNode<KeyT, ValueT> & rhs)
const 48 return lhs < rhs.point;
52 operator()(
const InnerNode<KeyT, ValueT> & lhs,
int rhs)
const 54 return lhs.point < rhs;
80 template <
class KeyT,
class ValueT,
class Tag =
int>
88 using Segment = intervalmap_internal::InnerNode<KeyT, ValueT>;
94 using value_type = ValueT;
95 using key_type = KeyT;
110 template <
class Node>
111 class IMapNodeTraits {
116 using key_type =
typename Node::key_type;
120 using value_type =
typename Node::value_type;
129 static key_type get_lower(
const Node & n) =
delete;
138 static key_type get_upper(
const Node & n) =
delete;
147 static value_type get_value(
const Node & n) =
delete;
158 on_value_changed(
typename Node::Segment & seg,
const value_type & old_val,
159 const value_type & new_val)
177 on_length_changed(
typename Node::Segment & seg)
190 on_segment_inserted(
typename Node::Segment & seg)
202 on_segment_removed(
typename Node::Segment & seg)
240 template <
class Node,
class NodeTraits,
class Options = DefaultOptions,
257 using Segment = intervalmap_internal::InnerNode<
typename Node::key_type,
258 typename Node::value_type>;
261 static_assert(std::is_base_of<IMapNodeTraits<Node>, NodeTraits>::value,
262 "NodeTraits not properly derived from IMapNodeTraits!");
264 static_assert(Options::multiple,
265 "IntervalMap always allows multiple equal intervals.");
268 IMapNodeBase<typename Node::key_type, typename Node::value_type, Tag>;
269 static_assert(std::is_base_of<NB, Node>::value,
270 "Node class not properly derived from IMapNodeBase!");
272 RBTree<Segment, RBDefaultNodeTraits, TreeOptions<TreeFlags::MULTIPLE>,
273 intervalmap_internal::InnerRBTTag,
typename Segment::Compare>;
275 List<Segment, TreeOptions<>, intervalmap_internal::SegListTag>;
276 using RepresentativeSegList =
277 List<Segment, TreeOptions<>,
278 intervalmap_internal::RepresentativeSegListTag>;
279 using value_type =
typename Node::value_type;
280 using key_type =
typename Node::key_type;
290 void insert(Node & n);
299 void remove(Node & n);
327 value_type get_aggregate(Segment & s);
330 template <
class ConcreteIterator,
class InnerIterator>
333 typedef typename InnerIterator::difference_type difference_type;
334 typedef typename InnerIterator::value_type value_type;
335 typedef typename InnerIterator::reference reference;
336 typedef typename InnerIterator::pointer pointer;
337 typedef std::input_iterator_tag iterator_category;
340 IteratorBase(
const InnerIterator & it, RepresentativeSegList * l);
341 IteratorBase(
const ConcreteIterator & other);
343 ConcreteIterator & operator=(
const ConcreteIterator & other);
344 ConcreteIterator & operator=(ConcreteIterator && other);
346 bool operator==(
const ConcreteIterator & other)
const;
347 bool operator!=(
const ConcreteIterator & other)
const;
349 ConcreteIterator & operator++();
350 ConcreteIterator operator++(
int);
351 ConcreteIterator & operator+=(
size_t steps);
352 ConcreteIterator operator+(
size_t steps)
const;
354 ConcreteIterator & operator--();
355 ConcreteIterator operator--(
int);
357 reference operator*()
const;
358 pointer operator->()
const;
360 key_type get_lower()
const;
361 key_type get_upper()
const;
362 const typename IntervalMap<Node, NodeTraits, Options, Tag>::value_type &
367 RepresentativeSegList * l;
375 :
public IteratorBase<const_iterator,
376 typename RepresentativeSegList::const_iterator> {
380 typename RepresentativeSegList::const_iterator>::IteratorBase;
387 :
public IteratorBase<iterator,
388 typename RepresentativeSegList::iterator> {
390 using IteratorBase<iterator,
391 typename RepresentativeSegList::iterator>::IteratorBase;
394 const_iterator begin()
const;
395 const_iterator end()
const;
402 Segment * get_head(Segment * seg);
404 Segment * insert_segment(Segment * seg);
405 void remove_segment(Segment * seg);
407 void repr_now_equal(Segment * a, Segment * b);
408 void repr_now_different(Segment * a, Segment * b);
409 void repr_replaced(Segment * old, Segment * replacement);
412 iterator find_lower_bound_representative(
typename Node::key_type point);
416 RepresentativeSegList repr_list;
418 SizeHolder<Options::constant_time_size> s;
420 void dbg_verify_list();
421 void dbg_verify_representatives();
426 #include "intervalmap.cpp" 428 #endif // YGG_INTERVALMAP_HPP Definition: rbtree.hpp:18