yat  0.12.3pre
MergeIterator.h
1 #ifndef theplu_yat_utility_merge_iterator
2 #define theplu_yat_utility_merge_iterator
3 
4 // $Id: MergeIterator.h 3139 2013-12-02 04:21:06Z peter $
5 
6 /*
7  Copyright (C) 2013 Peter Johansson
8 
9  This file is part of the yat library, http://dev.thep.lu.se/yat
10 
11  The yat library is free software; you can redistribute it and/or
12  modify it under the terms of the GNU General Public License as
13  published by the Free Software Foundation; either version 3 of the
14  License, or (at your option) any later version.
15 
16  The yat library is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  General Public License for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with yat. If not, see <http://www.gnu.org/licenses/>.
23 */
24 
25 #include "stl_utility.h"
26 #include "yat/utility/yat_assert.h"
27 
28 #include <boost/iterator/iterator_facade.hpp>
29 
30 #include <iterator>
31 #include <set>
32 #include <vector>
33 
34 namespace theplu {
35 namespace yat {
36 namespace utility {
37 
50  template<
51  typename Base,
52  class Compare=std::less<typename std::iterator_traits<Base>::value_type>
53  >
55  : public boost::iterator_facade<
56  MergeIterator<Base, Compare>,
57  const typename std::iterator_traits<Base>::value_type,
58  std::input_iterator_tag
59  >
60  {
61  public:
65  MergeIterator(void) {};
66 
75  MergeIterator(const std::vector<std::pair<Base, Base> >& vec)
76  { init(vec); };
77 
87  MergeIterator(const std::vector<std::pair<Base, Base> >& vec,
88  const Compare& comp)
89  : data_(PairCompare(comp))
90  { init(vec); }
91 
92  private:
93  friend class boost::iterator_core_access;
94 
95  typename MergeIterator<Base, Compare>::reference dereference(void) const;
96  bool equal(const MergeIterator& other) const;
97  void init(const std::vector<std::pair<Base,Base> >& v);
98  void increment(void);
99 
100  class PairCompare
101  {
102  public:
103  PairCompare(void) {}
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); }
108  private:
109  Compare comp_;
110  };
111 
112  std::multiset<std::pair<Base, Base>, PairCompare> data_;
113  };
114 
120  template<typename Base>
121  MergeIterator<Base>
122  make_merge_iterator(const std::vector<std::pair<Base, Base> >& vec)
123  {
124  return MergeIterator<Base>(vec);
125  }
126 
127 
134  template<typename Base, class Compare>
136  make_merge_iterator(const std::vector<std::pair<Base, Base> >& vec,
137  const Compare& comp)
138  {
139  return MergeIterator<Base, Compare>(vec, comp);
140  }
141 
142 
143 
144  // template implementations
145 
146  template<typename Base, class Compare>
149  {
150  YAT_ASSERT(data_.size());
151  YAT_ASSERT(data_.begin()->first != data_.begin()->second);
152  return *data_.begin()->first;
153  }
154 
155 
156  template<typename Base, class Compare>
157  bool MergeIterator<Base, Compare>::equal(const MergeIterator& other) const
158  {
159  if (data_.empty() || other.data_.empty())
160  return data_.empty() == other.data_.empty();
161  return data_.begin()->first == other.data_.begin()->first;
162  }
163 
164 
165  template<typename Base, class Compare>
166  void
167  MergeIterator<Base,Compare>::init(const std::vector<std::pair<Base,Base> >& v)
168  {
169  for (size_t i=0; i<v.size(); ++i)
170  if (v[i].first != v[i].second)
171  data_.insert(v[i]);
172  }
173 
174 
175  template<typename Base, class Compare>
176  void MergeIterator<Base, Compare>::increment(void)
177  {
178  if (data_.empty())
179  return;
180  // store first range
181  std::pair<Base, Base> tmp = *data_.begin();
182  // remove first range from set of ranges
183  data_.erase(data_.begin());
184  // iterate the first range and if not end-of-range, insert the
185  // range back into set of ranges
186  if (++(tmp.first) != tmp.second)
187  data_.insert(tmp);
188  }
189 
190 }}}
191 #endif
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

Generated on Mon Jun 1 2015 12:29:52 for yat by  doxygen 1.8.5