22 #ifndef DBA_CORE_STLUTILS_H
23 #define DBA_CORE_STLUTILS_H
38 virtual bool valid()
const = 0;
39 virtual const T&
get()
const = 0;
40 virtual void next() = 0;
47 struct Sequences :
public std::vector<stlutils::Sequence<T>*>
49 typedef typename std::vector<stlutils::Sequence<T>*>::iterator iterator;
50 typedef typename std::vector<stlutils::Sequence<T>*>::const_iterator const_iterator;
55 for (iterator i = this->begin(); i != this->end(); ++i)
63 template<
typename ITER>
64 void add(
const ITER& begin,
const ITER& end);
68 void add(
const C& container);
73 void add_union(std::auto_ptr<
Sequences<T> >& sequences);
76 void add_intersection(std::auto_ptr<
Sequences<T> >& sequences);
102 if (&sg ==
this)
return this;
103 if (sequences)
delete sequences;
104 sequences = sg.sequences;
111 if (sequences)
delete sequences;
115 bool has_items()
const {
return sequences != 0; }
119 if (sequences == i.sequences)
return true;
120 if (!sequences || !i.sequences)
return false;
121 return *sequences == *i.sequences;
125 if (sequences == i.sequences)
return false;
126 if (!sequences || !i.sequences)
return true;
127 return *sequences != *i.sequences;
142 const T&
get()
const {
return (*this->sequences)[0]->get(); }
146 (*this->sequences)[0]->next();
154 const T& operator*()
const {
return this->
get(); }
188 const T&
get()
const {
return *minval; }
202 const T& operator*()
const {
return this->
get(); }
222 const_iterator begin(std::auto_ptr<
Sequences<T> >& sequences)
const
224 return const_iterator(sequences);
227 const_iterator end()
const
229 return const_iterator();
237 std::vector<const std::set<T>*> sets;
241 void add(
const std::set<T>& set)
243 sets.push_back(&set);
248 const_iterator begin()
250 std::auto_ptr< Sequences<T> > sequences(
new Sequences<T>);
255 for (
typename std::vector<
const std::set<T>*>::const_iterator i = sets.begin();
256 i != sets.end(); ++i)
258 const std::set<T>& s = **i;
260 if (s.begin() == s.end())
return end();
263 max_of_first = *s.begin();
266 if (max_of_first < *s.begin())
267 max_of_first = *s.begin();
272 for (
typename std::vector<
const std::set<T>*>::const_iterator i = sets.begin();
273 i != sets.end(); ++i)
275 const std::set<T>& s = **i;
276 sequences->add(s.lower_bound(max_of_first), s.end());
279 return intersection.begin(sequences);
284 return intersection.end();
298 const_iterator begin(std::auto_ptr<
Sequences<T> >& sequences)
const
300 return const_iterator(sequences);
303 const_iterator end()
const
305 return const_iterator();
314 class TrivialInserter :
public std::iterator<std::output_iterator_tag, void, void, void, void>
323 V operator=(V val) { target->insert(val);
return val; }
341 class Pusher :
public std::iterator<std::output_iterator_tag, void, void, void, void>
347 Pusher(T& target) : target(&target) {}
350 V operator=(V val) { target->push(val);
return val; }
352 Pusher& operator*() {
return *
this; }
353 Pusher& operator++() {
return *
this; }
354 Pusher& operator++(
int) {
return *
this; }
368 class Eraser :
public std::iterator<std::output_iterator_tag, void, void, void, void>
374 Eraser(T& target) : target(&target) {}
377 V operator=(V val) { target->erase(val);
return val; }
379 Eraser& operator*() {
return *
this; }
380 Eraser& operator++() {
return *
this; }
381 Eraser& operator++(
int) {
return *
this; }
Definition: stlutils.h:35
void find_min()
Find the next minimum value.
void add_singleton(const T &val)
Add a singleton set.
Definition: stlutils.h:132
Similar to std::inserter, but just calls target.insert() without requiring it to have iterators at al...
Definition: stlutils.h:368
Virtual container containing the intersection of an arbitrary number of sorted (begin, end) sequences.
Definition: stlutils.h:217
List of ranges.
Definition: stlutils.h:47
Similar to std::inserter, but just calls target.insert() without requiring it to have iterators at al...
Definition: stlutils.h:314
Definition: stlutils.h:234
Virtual container containing the union of an arbitrary number of sorted (begin, end) sequences...
Definition: stlutils.h:293
Definition: stlutils.h:86
Definition: stlutils.h:163
Similar to std::inserter, but just calls target.insert() without requiring it to have iterators at al...
Definition: stlutils.h:341