26template<
typename RangeLike,
typename OutContainer, AK_REQUIRES(AkTraits::isAppendable<OutContainer>)>
27OutContainer copyContainer(
const RangeLike &range)
30 rv.reserve(range.size());
31 for (
auto &&v : range) {
32 rv.push_back(std::move(v));
37template<
typename RangeLike,
typename OutContainer, AK_REQUIRES(AkTraits::isInsertable<OutContainer>)>
38OutContainer copyContainer(
const RangeLike &range)
41 rv.reserve(range.size());
42 for (
const auto &v : range) {
48template<
typename RangeList,
typename OutContainer>
49OutContainer copyAssocContainer(
const RangeList &range)
52 for (
const auto &v : range) {
53 rv.insert(v.first, v.second);
58template<
typename Iterator>
60 using iterator_category =
typename Iterator::iterator_category;
61 using value_type =
typename Iterator::value_type;
62 using difference_type =
typename Iterator::difference_type;
63 using pointer =
typename Iterator::pointer;
64 using reference =
typename Iterator::reference;
70template<
typename Iterator>
71struct IteratorTrait<Iterator *> {
73 using iterator_category = std::random_access_iterator_tag;
74 using value_type = Iterator;
75 using difference_type = qsizetype;
76 using pointer = Iterator *;
77 using reference = Iterator &;
80template<
typename Iterator>
81struct IteratorTrait<const Iterator *> {
82 using iterator_category = std::random_access_iterator_tag;
83 using value_type = Iterator;
84 using difference_type = qsizetype;
85 using pointer =
const Iterator *;
86 using reference =
const Iterator &;
89template<
typename IterImpl,
typename RangeLike,
typename Iterator =
typename RangeLike::const_iterator>
92 using iterator_category =
typename IteratorTrait<Iterator>::iterator_category;
93 using value_type =
typename IteratorTrait<Iterator>::value_type;
94 using difference_type =
typename IteratorTrait<Iterator>::difference_type;
95 using pointer =
typename IteratorTrait<Iterator>::pointer;
96 using reference =
typename IteratorTrait<Iterator>::reference;
98 IteratorBase(
const IteratorBase<IterImpl, RangeLike> &other)
100 , mRange(other.mRange)
104 IterImpl &operator++()
106 ++
static_cast<IterImpl *
>(
this)->mIter;
107 return *
static_cast<IterImpl *
>(
this);
110 IterImpl operator++(
int)
112 auto ret = *
static_cast<IterImpl *
>(
this);
113 ++
static_cast<IterImpl *
>(
this)->mIter;
117 bool operator==(
const IterImpl &other)
const
119 return mIter == other.mIter;
122 bool operator!=(
const IterImpl &other)
const
124 return !(*
static_cast<const IterImpl *
>(
this) == other);
127 bool operator<(
const IterImpl &other)
const
129 return mIter < other.mIter;
132 auto operator-(
const IterImpl &other)
const
134 return mIter - other.mIter;
137 auto operator*()
const
143 IteratorBase(
const Iterator &iter,
const RangeLike &range)
148 IteratorBase(
const Iterator &iter, RangeLike &&range)
158template<
typename RangeLike,
typename TransformFn,
typename Iterator =
typename RangeLike::const_iterator>
159struct TransformIterator :
public IteratorBase<TransformIterator<RangeLike, TransformFn>, RangeLike> {
161 template<
typename... T>
164 template<
typename R,
typename... Args>
165 struct ResultOf<R(Args...)> {
169 using IteratorValueType = std::invoke_result_t<TransformFn, typename IteratorTrait<Iterator>::value_type>;
172 using value_type = IteratorValueType;
173 using pointer = IteratorValueType *;
174 using reference =
const IteratorValueType &;
176 TransformIterator(
const Iterator &iter,
const TransformFn &fn,
const RangeLike &range)
177 : IteratorBase<TransformIterator<RangeLike, TransformFn>, RangeLike>(iter, range)
182 auto operator*()
const
184 return std::invoke(mFn, *(this->mIter));
191template<
typename RangeLike,
typename Predicate,
typename Iterator =
typename RangeLike::const_iterator>
192class FilterIterator :
public IteratorBase<FilterIterator<RangeLike, Predicate>, RangeLike>
197 using iterator_category = std::input_iterator_tag;
199 FilterIterator(
const Iterator &iter,
const Iterator &end,
const Predicate &predicate,
const RangeLike &range)
200 : IteratorBase<FilterIterator, RangeLike>(iter, range)
201 , mPredicate(predicate)
204 while (this->mIter != mEnd && !std::invoke(mPredicate, *this->mIter)) {
211 if (this->mIter != mEnd) {
214 }
while (this->mIter != mEnd && !std::invoke(mPredicate, *this->mIter));
227 Predicate mPredicate;
231template<
typename RangeLike,
typename Iterator =
typename RangeLike::const_iterator>
232class EnumerateIterator :
public IteratorBase<EnumerateIterator<RangeLike>, RangeLike>
235 using value_type = std::pair<qsizetype, typename Iterator::value_type>;
236 using pointer = value_type *;
237 using reference =
const value_type &;
239 EnumerateIterator(
const Iterator &iter, qsizetype
start,
const RangeLike &range)
240 : IteratorBase<EnumerateIterator, RangeLike>(iter, range)
252 auto &operator++(
int)
259 QPair<qsizetype, typename Iterator::value_type> operator*()
const
261 return qMakePair(mCount, *this->mIter);
265 qsizetype mCount = 0;
268template<
typename Container,
int Pos,
typename Iterator =
typename Container::const_key_value_iterator>
269class AssociativeContainerIterator :
public IteratorBase<AssociativeContainerIterator<Container, Pos>, Container, Iterator>
272 using value_type = std::remove_const_t<std::remove_reference_t<typename std::tuple_element<Pos, typename Iterator::value_type>::type>>;
273 using pointer = std::add_pointer_t<value_type>;
274 using reference = std::add_lvalue_reference_t<value_type>;
276 AssociativeContainerIterator(
const Iterator &iter,
const Container &container)
277 : IteratorBase<AssociativeContainerIterator<Container, Pos>, Container, Iterator>(iter, container)
281 auto operator*()
const
283 return std::get<Pos>(*this->mIter);
287template<
typename Container>
288using AssociativeContainerKeyIterator = AssociativeContainerIterator<Container, 0>;
289template<
typename Container>
290using AssociativeContainerValueIterator = AssociativeContainerIterator<Container, 1>;
292template<
typename Iterator>
295 using iterator = Iterator;
296 using const_iterator = Iterator;
297 using value_type =
typename detail::IteratorTrait<Iterator>::value_type;
299 Range(Iterator &&begin, Iterator &&end)
305 Iterator begin()
const
310 Iterator cbegin()
const
320 Iterator cend()
const
327 return std::distance(mBegin, mEnd);
336using IsRange =
typename std::is_same<T, Range<typename T::iterator>>;
340template<
template<
typename>
class Cont>
343 using OutputContainer = Cont<T>;
346template<
template<
typename,
typename>
class Cont>
348 template<
typename Key,
typename Value>
349 using OuputContainer = Cont<Key, Value>;
357template<
typename UnaryOperation>
358struct TransformTag_ {
362template<
typename UnaryPredicate>
367template<
typename UnaryOperation>
372template<
typename UnaryPredicate>
377template<
typename UnaryPredicate>
382template<
typename UnaryPredicate>
387struct EnumerateTag_ {
388 qsizetype mStart = 0;
395template<
typename RangeLike,
template<
typename>
class OutContainer,
typename T =
typename RangeLike::value_type>
396auto operator|(
const RangeLike &range, AkRanges::detail::ToTag_<OutContainer>) -> OutContainer<T>
398 using namespace AkRanges::detail;
399 return copyContainer<RangeLike, OutContainer<T>>(range);
404template<
template<
typename>
class InContainer,
typename T>
405auto operator|(
const InContainer<T> &in, AkRanges::detail::ToTag_<InContainer>) -> InContainer<T>
411template<
typename RangeLike,
template<
typename,
typename>
class OutContainer,
typename T =
typename RangeLike::value_type>
412auto operator|(
const RangeLike &range, AkRanges::detail::ToAssocTag_<OutContainer>) -> OutContainer<typename T::first_type, typename T::second_type>
414 using namespace AkRanges::detail;
415 return copyAssocContainer<RangeLike, OutContainer<typename T::first_type, typename T::second_type>>(range);
419template<
typename RangeLike,
typename UnaryOperation>
420auto operator|(
const RangeLike &range, AkRanges::detail::TransformTag_<UnaryOperation> t)
422 using namespace AkRanges::detail;
423 using OutIt = TransformIterator<RangeLike, UnaryOperation>;
424 return Range<OutIt>(OutIt(std::cbegin(range), t.mFn, range), OutIt(std::cend(range), t.mFn, range));
428template<
typename RangeLike,
typename UnaryPredicate>
429auto operator|(
const RangeLike &range, AkRanges::detail::FilterTag_<UnaryPredicate> p)
431 using namespace AkRanges::detail;
432 using OutIt = FilterIterator<RangeLike, UnaryPredicate>;
433 return Range<OutIt>(OutIt(std::cbegin(range), std::cend(range), p.mFn, range), OutIt(std::cend(range), std::cend(range), p.mFn, range));
437template<
typename RangeLike>
438auto operator|(
const RangeLike &range, AkRanges::detail::EnumerateTag_ tag)
440 using namespace AkRanges::detail;
441 using OutIt = EnumerateIterator<RangeLike>;
442 return Range<OutIt>(OutIt(std::cbegin(range), tag.mStart, range), OutIt(std::cend(range), tag.mStart, range));
446template<
typename RangeLike,
typename UnaryOperation>
447auto operator|(
const RangeLike &range, AkRanges::detail::ForEachTag_<UnaryOperation> op)
449 std::for_each(std::cbegin(range), std::cend(range), [op = std::move(op)](
const auto &val)
mutable {
450 std::invoke(op.mFn, val);
456template<
typename RangeLike,
typename UnaryPredicate>
457auto operator|(
const RangeLike &range, AkRanges::detail::AllTag_<UnaryPredicate> p)
459 return std::all_of(std::cbegin(range), std::cend(range), p.mFn);
463template<
typename RangeLike,
typename PredicateFn>
464auto operator|(
const RangeLike &range, AkRanges::detail::AnyTag_<PredicateFn> p)
466 return std::any_of(std::cbegin(range), std::cend(range), p.mFn);
470template<
typename RangeLike,
typename UnaryPredicate>
471auto operator|(
const RangeLike &range, AkRanges::detail::NoneTag_<UnaryPredicate> p)
473 return std::none_of(std::cbegin(range), std::cend(range), p.mFn);
477template<
typename AssocContainer>
478auto operator|(
const AssocContainer &in, AkRanges::detail::KeysTag_)
480 using namespace AkRanges::detail;
481 using OutIt = AssociativeContainerKeyIterator<AssocContainer>;
482 return Range<OutIt>(OutIt(in.constKeyValueBegin(), in), OutIt(in.constKeyValueEnd(), in));
486template<
typename AssocContainer>
487auto operator|(
const AssocContainer &in, AkRanges::detail::ValuesTag_)
489 using namespace AkRanges::detail;
490 using OutIt = AssociativeContainerValueIterator<AssocContainer>;
491 return Range<OutIt>(OutIt(in.constKeyValueBegin(), in), OutIt(in.constKeyValueEnd(), in));
499static constexpr auto toQVector = detail::ToTag_<QList>{};
501static constexpr auto toQSet = detail::ToTag_<QSet>{};
503static constexpr auto toQList = detail::ToTag_<QList>{};
505static constexpr auto toQMap = detail::ToAssocTag_<QMap>{};
507static constexpr auto toQHash = detail::ToAssocTag_<QHash>{};
510template<
typename UnaryOperation>
511detail::ForEachTag_<UnaryOperation> forEach(UnaryOperation &&op)
513 return detail::ForEachTag_<UnaryOperation>{std::forward<UnaryOperation>(op)};
517template<
typename UnaryPredicate>
518detail::AllTag_<UnaryPredicate> all(UnaryPredicate &&pred)
520 return detail::AllTag_<UnaryPredicate>{std::forward<UnaryPredicate>(pred)};
524template<
typename UnaryPredicate>
525detail::AnyTag_<UnaryPredicate> any(UnaryPredicate &&pred)
527 return detail::AnyTag_<UnaryPredicate>{std::forward<UnaryPredicate>(pred)};
531template<
typename UnaryPredicate>
532detail::NoneTag_<UnaryPredicate> none(UnaryPredicate &&pred)
534 return detail::NoneTag_<UnaryPredicate>{std::forward<UnaryPredicate>(pred)};
542static constexpr auto values = detail::ValuesTag_{};
544static constexpr auto keys = detail::KeysTag_{};
547template<
typename UnaryOperation>
548detail::TransformTag_<UnaryOperation>
transform(UnaryOperation &&op)
550 return detail::TransformTag_<UnaryOperation>{std::forward<UnaryOperation>(op)};
554template<
typename UnaryPredicate>
555detail::FilterTag_<UnaryPredicate>
filter(UnaryPredicate &&pred)
557 return detail::FilterTag_<UnaryPredicate>{std::forward<UnaryPredicate>(pred)};
561inline detail::EnumerateTag_ enumerate(qsizetype
start = 0)
563 return detail::EnumerateTag_{
start};
567template<
typename Iterator1,
typename Iterator2,
typename It = std::remove_reference_t<Iterator1>>
568detail::Range<It> range(Iterator1 begin, Iterator2 end)
570 return detail::Range<It>(std::move(begin), std::move(end));
Q_SCRIPTABLE Q_NOREPLY void start()
KIOCORE_EXPORT CopyJob * move(const QList< QUrl > &src, const QUrl &dest, JobFlags flags=DefaultFlags)
VehicleSection::Type type(QStringView coachNumber, QStringView coachClassification)
const QList< QKeySequence > & end()
A glue between Qt and the standard library.
QFuture< void > filter(QThreadPool *pool, Sequence &sequence, KeepFunctor &&filterFunction)