diff --git a/src/shared/akranges.h b/src/shared/akranges.h --- a/src/shared/akranges.h +++ b/src/shared/akranges.h @@ -46,28 +46,24 @@ struct Values_ {}; struct Keys_ {}; -template && AkTraits::isReservable) - > -OutContainer copyContainer(const InContainer &in) +template && AkTraits::isReservable)> +OutContainer copyContainer(const RangeLike &range) { OutContainer rv; - rv.reserve(in.size()); - for (auto &&v : in) { + rv.reserve(range.size()); + for (auto &&v : range) { rv.push_back(std::move(v)); } return rv; } -template) - > -OutContainer copyContainer(const InContainer &in) +template)> +OutContainer copyContainer(const RangeLike &range) { OutContainer rv; - for (const auto &v : in) { + for (const auto &v : range) { rv.insert(v); } return rv; @@ -104,10 +100,7 @@ using reference = const Iterator &; }; -template +template struct IteratorBase { public: @@ -117,8 +110,8 @@ using pointer = typename IteratorTrait::pointer; using reference = typename IteratorTrait::reference; - IteratorBase(const IteratorBase &other) - : mIter(other.mIter), mContainer(other.mContainer) + IteratorBase(const IteratorBase &other) + : mIter(other.mIter), mRange(other.mRange) {} IterImpl &operator++() @@ -160,22 +153,19 @@ } protected: - IteratorBase(const Iterator &iter, const Container &container) - : mIter(iter), mContainer(container) + IteratorBase(const Iterator &iter, const RangeLike &range) + : mIter(iter), mRange(range) {} - IteratorBase(const Iterator &iter, Container &&container) - : mIter(iter), mContainer(std::move(container)) + IteratorBase(const Iterator &iter, RangeLike &&range) + : mIter(iter), mRange(std::move(range)) {} Iterator mIter; - Container mContainer; + RangeLike mRange; }; -template -struct TransformIterator : public IteratorBase, Container> +template +struct TransformIterator : public IteratorBase, RangeLike> { private: template @@ -194,8 +184,8 @@ using pointer = IteratorValueType *; // FIXME: preserve const-ness using reference = const IteratorValueType &; // FIXME: preserve const-ness - TransformIterator(const Iterator &iter, const TransformFn &fn, const Container &container) - : IteratorBase, Container>(iter, container) + TransformIterator(const Iterator &iter, const TransformFn &fn, const RangeLike &range) + : IteratorBase, RangeLike>(iter, range) , mFn(fn) { } @@ -209,17 +199,12 @@ TransformFn mFn; }; -template -class FilterIterator : public IteratorBase, Container> +template +class FilterIterator : public IteratorBase, RangeLike> { public: - FilterIterator(const Iterator &iter, const Iterator &end, - const Predicate &predicate, - const Container &container) - : IteratorBase, Container>(iter, container) + FilterIterator(const Iterator &iter, const Iterator &end, const Predicate &predicate, const RangeLike &range) + : IteratorBase, RangeLike>(iter, range) , mPredicate(predicate), mEnd(end) { while (this->mIter != mEnd && !Akonadi::invoke(mPredicate, *this->mIter)) { @@ -250,9 +235,7 @@ }; -template +template class AssociativeContainerIterator : public IteratorBase, Container, Iterator> { @@ -358,110 +341,82 @@ } // namespace Akonadi // Generic operator| for To_<> convertor -template class OutContainer, - typename T = typename InContainer::value_type - > -auto operator|(const InContainer &in, - const Akonadi::detail::To_ &) -> OutContainer +template class OutContainer, typename T = typename RangeLike::value_type> +auto operator|(const RangeLike &range, const Akonadi::detail::To_ &) -> OutContainer { using namespace Akonadi::detail; - return copyContainer>(in); + return copyContainer>(range); } // Specialization for case when InContainer and OutContainer are identical // Create a copy, but for Qt container this is very cheap due to implicit sharing. -template class InContainer, - typename T - > -auto operator|(const InContainer &in, - const Akonadi::detail::To_ &) -> InContainer +template class InContainer, typename T> +auto operator|(const InContainer &in, const Akonadi::detail::To_ &) -> InContainer { return in; } - - // Generic operator| for transform() -template -auto operator|(const InContainer &in, - const Akonadi::detail::Transform_ &t) +template +auto operator|(const RangeLike &range, const Akonadi::detail::Transform_ &t) { using namespace Akonadi::detail; - using OutIt = TransformIterator; - return Range(OutIt(std::cbegin(in), t.mFn, in), OutIt(std::cend(in), t.mFn, in)); + using OutIt = TransformIterator; + return Range(OutIt(std::cbegin(range), t.mFn, range), OutIt(std::cend(range), t.mFn, range)); } - // Generic operator| for filter() -template -auto operator|(const InContainer &in, - const Akonadi::detail::Filter_ &p) +template +auto operator|(const RangeLike &range, const Akonadi::detail::Filter_ &p) { using namespace Akonadi::detail; - using OutIt = FilterIterator; - return Range(OutIt(std::cbegin(in), std::cend(in), p.mFn, in), - OutIt(std::cend(in), std::cend(in), p.mFn, in)); + using OutIt = FilterIterator; + return Range(OutIt(std::cbegin(range), std::cend(range), p.mFn, range), + OutIt(std::cend(range), std::cend(range), p.mFn, range)); } - // Generic operator| fo foreach() -template -auto operator|(const InContainer &in, - Akonadi::detail::ForEach_ fun) +template +auto operator|(const RangeLike&range, Akonadi::detail::ForEach_ fun) { - std::for_each(std::cbegin(in), std::cend(in), + std::for_each(std::cbegin(range), std::cend(range), [&fun](const auto &val) { Akonadi::invoke(fun.mFn, val); }); - return in; + return range; } // Generic operator| for all -template -auto operator|(const InContainer &in, - Akonadi::detail::All_ fun) +template +auto operator|(const RangeLike &range, Akonadi::detail::All_ fun) { - return std::all_of(std::cbegin(in), std::cend(in), fun.mFn); + return std::all_of(std::cbegin(range), std::cend(range), fun.mFn); } // Generic operator| for any -template -auto operator|(const InContainer &in, - Akonadi::detail::Any_ fun) +template +auto operator|(const RangeLike &range, Akonadi::detail::Any_ fun) { - return std::any_of(std::cbegin(in), std::cend(in), fun.mFn); + return std::any_of(std::cbegin(range), std::cend(range), fun.mFn); } // Generic operator| for keys -template -auto operator|(const InContainer &in, Akonadi::detail::Keys_) +template +auto operator|(const Container &in, Akonadi::detail::Keys_) { using namespace Akonadi::detail; - using OutIt = AssociativeContainerKeyIterator; - return Range(OutIt(in.constKeyValueBegin(), in), - OutIt(in.constKeyValueEnd(), in)); + using OutIt = AssociativeContainerKeyIterator; + return Range(OutIt(in.constKeyValueBegin(), in), OutIt(in.constKeyValueEnd(), in)); } // Generic operator| for values -template -auto operator|(const InContainer &in, Akonadi::detail::Values_) +template +auto operator|(const Container &in, Akonadi::detail::Values_) { using namespace Akonadi::detail; - using OutIt = AssociativeContainerValueIterator; - return Range(OutIt(in.constKeyValueBegin(), in), - OutIt(in.constKeyValueEnd(), in)); + using OutIt = AssociativeContainerValueIterator; + return Range(OutIt(in.constKeyValueBegin(), in), OutIt(in.constKeyValueEnd(), in)); }