1 #ifndef theplu_yat_utility_segment_set 2 #define theplu_yat_utility_segment_set 28 #include "SegmentTree.h" 30 #include "yat_assert.h" 46 template<
typename T,
class Compare = std::less<T> >
49 SegmentCompare<T, Compare> >,
51 Identity<const Segment<T, Compare>&> >
67 std::pair<typename me::iterator, typename me::iterator> p =
70 return move_insert_merge(p, std::move(tmp));
82 std::pair<typename me::iterator, typename me::iterator> p =
84 return move_insert_merge(p, std::move(segment));
112 std::pair<typename me::iterator, typename me::iterator> p(hint, hint);
114 return move_insert_merge(p, std::move(segment));
118 if (hint!=this->
end() && compare(*hint, segment))
121 if (p.first!=this->begin()) {
125 if (compare(segment, *p.first))
128 while (p.first!=this->begin() && !compare(*p.first, segment))
130 YAT_ASSERT(p.first==this->begin() || compare(*p.first, segment));
131 YAT_ASSERT(p.first!=this->end());
132 if (compare(*p.first, segment))
137 while (p.second!=this->end() && !compare(segment, *p.second))
140 return move_insert_merge(p, std::move(segment));
152 template<
typename Iterator>
156 for ( ; first!=last; ++first) {
171 move_insert_merge(
const std::pair<
typename me::iterator,
175 YAT_ASSERT(p.first==this->end() || !compare(*p.first, segment));
176 YAT_ASSERT(p.second==this->end() || compare(segment, *p.second));
177 if (p.first==p.second) {
178 return this->
container_.insert(p.first, std::move(segment));
189 YAT_ASSERT(last==this->
end() || compare(segment, *last));
190 YAT_ASSERT(last!=this->
begin());
192 YAT_ASSERT(compare_3way(segment, *last)==0);
195 segment2(std::min(p.first->begin(), segment.begin(), comp),
196 std::max(last->end(), segment.end(), comp));
199 return this->
container_.insert(p.second, std::move(segment2));
SegmentSet(void)
creates a set with no segments
Definition: SegmentSet.h:58
std::set< Segment< T, Compare >, SegmentCompare< T, Compare > > ::iterator iterator
iterator
Definition: SegmentTree.h:89
const_iterator end(void) const
Definition: SegmentTree.h:131
The Department of Theoretical Physics namespace as we define it.
me::const_iterator insert_merge(const Segment< T, Compare > &segment)
Definition: SegmentSet.h:65
T max(const T &a, const T &b, const T &c)
Definition: stl_utility.h:699
me::iterator insert_merge(typename me::iterator hint, const Segment< T, Compare > &segment)
insert with a hint
Definition: SegmentSet.h:97
std::set< Segment< T, Compare >, SegmentCompare< T, Compare > > ::const_iterator const_iterator
const_iterator
Definition: SegmentTree.h:91
a set of Segments
Definition: SegmentSet.h:47
void insert_merge(Iterator first, Iterator last)
Definition: SegmentSet.h:153
a class for a Segment or Interval
Definition: Segment.h:49
me::iterator insert_merge(typename me::iterator hint, Segment< T, Compare > &&segment)
Definition: SegmentSet.h:109
Base Class for SegmentSet and SegmentMap.
Definition: SegmentTree.h:46
me::const_iterator insert_merge(Segment< T, Compare > &&segment)
Definition: SegmentSet.h:80
std::pair< iterator, iterator > overlap_range(const key_type &segment)
Definition: SegmentTree.h:247
const_iterator begin(void) const
Definition: SegmentTree.h:106
std::set< Segment< T, Compare >, SegmentCompare< T, Compare > > container_
underlying container
Definition: SegmentTree.h:240