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>
29 #include <boost/iterator/iterator_traits.hpp>
60 class Compare=std::less<typename std::iterator_traits<Base>::value_type>
63 :
public boost::iterator_facade<
64 MergeIterator<Base, Compare>,
65 typename boost::iterator_value<Base>::type,
66 boost::single_pass_traversal_tag,
67 typename boost::iterator_reference<Base>::type
98 : data_(PairCompare(comp))
102 friend class boost::iterator_core_access;
106 void init(
const std::vector<std::pair<Base,Base> >& v);
107 void increment(
void);
113 PairCompare(
const Compare& c) : comp_(c) {}
114 bool operator()(
const std::pair<Base, Base>& x,
115 const std::pair<Base, Base>& y)
const
116 {
return comp_(*x.first, *y.first); }
121 std::multiset<std::pair<Base, Base>, PairCompare> data_;
129 template<
typename Base>
143 template<
typename Base,
class Compare>
155 template<
typename Base,
class Compare>
159 YAT_ASSERT(data_.size());
160 YAT_ASSERT(data_.begin()->first != data_.begin()->second);
161 return *data_.begin()->first;
165 template<
typename Base,
class Compare>
166 bool MergeIterator<Base, Compare>::equal(
const MergeIterator& other)
const
168 if (data_.empty() || other.data_.empty())
169 return data_.empty() == other.data_.empty();
170 return data_.begin()->first == other.data_.begin()->first;
174 template<
typename Base,
class Compare>
176 MergeIterator<Base,Compare>::init(
const std::vector<std::pair<Base,Base> >& v)
178 for (
size_t i=0; i<v.size(); ++i)
179 if (v[i].first != v[i].second)
184 template<
typename Base,
class Compare>
185 void MergeIterator<Base, Compare>::increment(
void)
190 std::pair<Base, Base> tmp = *data_.begin();
192 data_.erase(data_.begin());
195 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:145
Iterate over several ranges as if ranges have been merged.
Definition: MergeIterator.h:62
MergeIterator(const std::vector< std::pair< Base, Base > > &vec)
Create MergeIterator.
Definition: MergeIterator.h:84
MergeIterator< Base > make_merge_iterator(const std::vector< std::pair< Base, Base > > &vec)
Definition: MergeIterator.h:131
MergeIterator(const std::vector< std::pair< Base, Base > > &vec, const Compare &comp)
Creates MergeIterator using comp as compare object.
Definition: MergeIterator.h:96
MergeIterator(void)
Definition: MergeIterator.h:74