3 #include <boost/iterator/iterator_adaptor.hpp> 18 template <
typename ContainerT>
20 :
public boost::iterator_facade<UniqueCompoundIterator<ContainerT>,
21 std::remove_reference_t<decltype(*ContainerT().begin()->begin())>,
22 std::random_access_iterator_tag> {
23 using Base = boost::iterator_facade<UniqueCompoundIterator<ContainerT>,
24 std::remove_reference_t<decltype(*ContainerT().
begin()->
begin())>,
25 std::random_access_iterator_tag>;
33 if (itBegin != c.end()) {
45 return std::find_if(c.begin(), c.end(), [](
auto& c) {
return !c.empty(); });
50 auto endIt =
end(*
c_);
53 }
while ((*
this) != endIt && old == *(*
this));
58 const auto startIt =
begin(*
c_);
59 if (*
this == startIt) {
66 if (*next != *(*
this)) {
69 }
while (next != startIt);
102 for (; d != 0; d--) {
106 for (; d != 0; d++) {
114 typename Base::difference_type
d{};
117 while (!cp.equal(other)) {
122 while (!cp.equal(other)) {
134 ContainerT*
c_{
nullptr};
bool equal(UniqueCompoundIterator other) const
Base::difference_type distance_to(UniqueCompoundIterator other) const
decltype(auto) dereference() const
static UniqueCompoundIterator begin(ContainerT &c)
static UniqueCompoundIterator end(ContainerT &c)
This iterator iterates over a container of containers as if it was one single container. Succeeding elements that are equal are ignored.
friend class boost::iterator_core_access
boost::iterator_facade< UniqueCompoundIterator< ContainerT >, std::remove_reference_t< decltype(*ContainerT().begin() ->begin())>, std::random_access_iterator_tag > Base
UniqueCompoundIterator(ContainerT &c, ItOuter itOuter, ItInner itInner)
std::decay_t< decltype(ContainerT().begin())> ItOuter
std::decay_t< decltype(ItOuter() ->begin())> ItInner
static ItOuter firstNonempty(ContainerT &c)
void advance(typename Base::difference_type d)
UniqueCompoundIterator()=default