1 #ifndef theplu_yat_utility_merge_iterator
2 #define theplu_yat_utility_merge_iterator
26 #include "yat/utility/yat_assert.h"
28 #include <boost/iterator/iterator_facade.hpp>
52 class Compare=std::less<typename std::iterator_traits<Base>::value_type>
55 :
public boost::iterator_facade<
56 MergeIterator<Base, Compare>,
57 const typename std::iterator_traits<Base>::value_type,
58 std::input_iterator_tag
89 : data_(PairCompare(comp))
93 friend class boost::iterator_core_access;
97 void init(
const std::vector<std::pair<Base,Base> >& v);
104 PairCompare(
const Compare& c) : comp_(c) {}
105 bool operator()(
const std::pair<Base, Base>& x,
106 const std::pair<Base, Base>& y)
const
107 {
return comp_(*x.first, *y.first); }
112 std::multiset<std::pair<Base, Base>, PairCompare> data_;
120 template<
typename Base>
134 template<
typename Base,
class Compare>
146 template<
typename Base,
class Compare>
150 YAT_ASSERT(data_.size());
151 YAT_ASSERT(data_.begin()->first != data_.begin()->second);
152 return *data_.begin()->first;
156 template<
typename Base,
class Compare>
157 bool MergeIterator<Base, Compare>::equal(
const MergeIterator& other)
const
159 if (data_.empty() || other.data_.empty())
160 return data_.empty() == other.data_.empty();
161 return data_.begin()->first == other.data_.begin()->first;
165 template<
typename Base,
class Compare>
167 MergeIterator<Base,Compare>::init(
const std::vector<std::pair<Base,Base> >& v)
169 for (
size_t i=0; i<v.size(); ++i)
170 if (v[i].first != v[i].second)
175 template<
typename Base,
class Compare>
176 void MergeIterator<Base, Compare>::increment(
void)
181 std::pair<Base, Base> tmp = *data_.begin();
183 data_.erase(data_.begin());
186 if (++(tmp.first) != tmp.second)
MergeIterator< Base, Compare > make_merge_iterator(const std::vector< std::pair< Base, Base > > &vec, const Compare &comp)
Definition: MergeIterator.h:136
Iterate over several ranges as if ranges have been merged.
Definition: MergeIterator.h:54
MergeIterator(const std::vector< std::pair< Base, Base > > &vec)
Create MergeIterator.
Definition: MergeIterator.h:75
MergeIterator< Base > make_merge_iterator(const std::vector< std::pair< Base, Base > > &vec)
Definition: MergeIterator.h:122
MergeIterator(const std::vector< std::pair< Base, Base > > &vec, const Compare &comp)
Creates MergeIterator using comp as compare object.
Definition: MergeIterator.h:87
MergeIterator(void)
Definition: MergeIterator.h:65