241 static_assert (copy_constructible<Iterator<T>>,
"Must be able to create Iterator<T> to use Iterable<T>");
242 static_assert (copyable<T>);
290 explicit
Iterable (CONTAINER_OF_T&& from)
291 requires (not derived_from<remove_cvref_t<CONTAINER_OF_T>,
Iterable<T>>)
292#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
293 :
_fRep{mk_ (forward<CONTAINER_OF_T> (from))._fRep} {}
304 Iterable (
const initializer_list<T>& from);
315 explicit Iterable (
const shared_ptr<_IRep>& rep)
noexcept;
316 explicit Iterable (shared_ptr<_IRep>&& rep)
noexcept;
331 nonvirtual
explicit operator bool ()
const;
371 nonvirtual
size_t size ()
const;
386 nonvirtual
bool empty ()
const;
403 template <Common::IPotentiallyComparer<T> EQUALS_COMPARER = equal_to<T>>
404 nonvirtual
bool Contains (ArgByValueType<T> element, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{})
const;
424 template <ranges::range LHS_CONTAINER_TYPE, ranges::range RHS_CONTAINER_TYPE, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
425 static bool SetEquals (
const LHS_CONTAINER_TYPE& lhs,
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{});
426 template <ranges::range RHS_CONTAINER_TYPE = initializer_list<T>, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
427 nonvirtual
bool SetEquals (
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{})
const;
438 template <ranges::range LHS_CONTAINER_TYPE, ranges::range RHS_CONTAINER_TYPE, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
439 static bool MultiSetEquals (
const LHS_CONTAINER_TYPE& lhs,
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{});
440 template <ranges::range RHS_CONTAINER_TYPE = initializer_list<T>, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
441 nonvirtual
bool MultiSetEquals (
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{})
const;
455 template <ranges::range LHS_CONTAINER_TYPE, ranges::range RHS_CONTAINER_TYPE, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
456 static bool SequentialEquals (
const LHS_CONTAINER_TYPE& lhs,
const RHS_CONTAINER_TYPE& rhs,
457 EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{},
bool useIterableSize =
false);
458 template <ranges::range RHS_CONTAINER_TYPE = initializer_list<T>, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
459 nonvirtual
bool SequentialEquals (
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{},
460 bool useIterableSize =
false)
const;
463 template <qCompilerAndStdLib_Constra
intDiffersInTemplateRedeclaration_BWA (IEqualsComparer<T>) T_EQUALS_COMPARER = equal_to<T>>
464 struct SequentialEqualsComparer;
467 template <qCompilerAndStdLib_Constra
intDiffersInTemplateRedeclaration_BWA (IThreeWayComparer<T>) T_THREEWAY_COMPARER = compare_three_way>
468 struct SequentialThreeWayComparer;
496 nonvirtual Iterator<T>
begin ()
const;
505 static constexpr default_sentinel_t
end () noexcept;
550 nonvirtual
void Apply (const function<
void (ArgByValueType<T> item)>& doToElement,
551 Execution::SequencePolicy seq = Execution::SequencePolicy::eDEFAULT) const;
616 template <predicate<T> THAT_FUNCTION>
617 nonvirtual
Iterator<T>
Find (THAT_FUNCTION&& that, Execution::SequencePolicy seq = Execution::SequencePolicy::eDEFAULT) const;
618 template <Common::IPotentiallyComparer<T> EQUALS_COMPARER>
619 nonvirtual
Iterator<T>
Find (Common::ArgByValueType<T> v, EQUALS_COMPARER&& equalsComparer = {},
621 template <predicate<T> THAT_FUNCTION>
624 template <Common::IPotentiallyComparer<T> EQUALS_COMPARER>
642 template <IIterableOfFrom<T> CONTAINER_OF_T,
typename... CONTAINER_OF_T_CONSTRUCTOR_ARGS>
643 nonvirtual CONTAINER_OF_T
As (CONTAINER_OF_T_CONSTRUCTOR_ARGS... args)
const;
661 nonvirtual T
Nth (ptrdiff_t n)
const;
675 nonvirtual T
NthValue (ptrdiff_t n, ArgByValueType<T> defaultValue = {})
const;
704#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
705 template <
typename RESULT_CONTAINER = Iterable<T>, predicate<T> INCLUDE_PREDICATE>
706 nonvirtual RESULT_CONTAINER
Where (INCLUDE_PREDICATE&& includeIfTrue)
const;
707 template <
typename RESULT_CONTAINER = Iterable<T>, predicate<T> INCLUDE_PREDICATE>
708 nonvirtual RESULT_CONTAINER
Where (INCLUDE_PREDICATE&& includeIfTrue, RESULT_CONTAINER&& emptyResult)
const;
710 template <derived_from<Iterable<T>> RESULT_CONTAINER = Iterable<T>, predicate<T> INCLUDE_PREDICATE>
711 nonvirtual RESULT_CONTAINER
Where (INCLUDE_PREDICATE&& includeIfTrue)
const;
712 template <derived_from<Iterable<T>> RESULT_CONTAINER = Iterable<T>, predicate<T> INCLUDE_PREDICATE>
713 nonvirtual RESULT_CONTAINER
Where (INCLUDE_PREDICATE&& includeIfTrue, RESULT_CONTAINER&& emptyResult)
const;
731 template <Common::IPotentiallyComparer<T> EQUALS_COMPARER = equal_to<T>>
733 template <
typename RESULT, Common::IPotentiallyComparer<T> EQUALS_COMPARER = equal_to<RESULT>>
735 EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{})
const;
807 template <ranges::range RESULT_CONTAINER = Iterable<T>, invocable<T> ELEMENT_MAPPER>
808 nonvirtual RESULT_CONTAINER
Map (ELEMENT_MAPPER&& elementMapper)
const
809 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, T>,
typename RESULT_CONTAINER::value_type> or
810 convertible_to<invoke_result_t<ELEMENT_MAPPER, T>, optional<typename RESULT_CONTAINER::value_type>>);
811 template <ranges::range RESULT_CONTAINER = Iterable<T>, invocable<T> ELEMENT_MAPPER>
812 nonvirtual RESULT_CONTAINER
Map (ELEMENT_MAPPER&& elementMapper, RESULT_CONTAINER&& emptyResult)
const
813 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, T>,
typename RESULT_CONTAINER::value_type> or
814 convertible_to<invoke_result_t<ELEMENT_MAPPER, T>, optional<typename RESULT_CONTAINER::value_type>>);
855 template <
typename REDUCED_TYPE = T>
856 nonvirtual optional<REDUCED_TYPE>
Reduce (
const function<REDUCED_TYPE (ArgByValueType<T>, ArgByValueType<T>)>& op)
const;
862 template <
typename REDUCED_TYPE = T>
863 nonvirtual REDUCED_TYPE
ReduceValue (
const function<REDUCED_TYPE (ArgByValueType<T>, ArgByValueType<T>)>& op,
864 ArgByValueType<REDUCED_TYPE> defaultValue = {})
const;
878 template <same_as<Characters::String> RESULT_T = Characters::String>
880 if constexpr (same_as<T, Characters::String> and same_as<RESULT_T, Characters::String>) {
884 return Characters::UnoverloadedToString<T>;
932#if qCompilerAndStdLib_template_SubstDefaultTemplateParamVariableTemplate_Buggy
933 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT = decltype (kDefaultToStringConverter<RESULT_T>),
934 invocable<RESULT_T, RESULT_T,
bool> COMBINER = decltype (Characters::kDefaultStringCombiner)>
935 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult = kDefaultToStringConverter<RESULT_T>,
937 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T> and
938 convertible_to<invoke_result_t<COMBINER, RESULT_T, RESULT_T, bool>, RESULT_T>);
940 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT = decltype (kDefaultToStringConverter<>),
941 invocable<RESULT_T, RESULT_T,
bool> COMBINER = decltype (Characters::kDefaultStringCombiner)>
942 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult = kDefaultToStringConverter<>,
944 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T> and
945 convertible_to<invoke_result_t<COMBINER, RESULT_T, RESULT_T, bool>, RESULT_T>);
947#if qCompilerAndStdLib_template_optionalDeclareIncompleteType_Buggy
950 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT>
951 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult,
const RESULT_T& separator)
const
952 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T>);
953 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT>
954 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult,
const RESULT_T& separator,
const optional<RESULT_T>& finalSeparator)
const
955 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T>);
958 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT>
959 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult,
const RESULT_T& separator,
const optional<RESULT_T>& finalSeparator = {})
const
960 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T>);
980 nonvirtual Iterable<T>
Skip (
size_t nItems)
const;
998 nonvirtual Iterable<T>
Take (
size_t nItems)
const;
1020 nonvirtual Iterable<T>
Slice (
size_t from,
size_t to)
const;
1045 nonvirtual Iterable<T>
Top ()
const;
1046 nonvirtual Iterable<T>
Top (
size_t n)
const;
1047 template <Common::IPotentiallyComparer<T> COMPARER>
1048 nonvirtual Iterable<T>
Top (COMPARER&& cmp)
const;
1049 template <Common::IPotentiallyComparer<T> COMPARER>
1050 nonvirtual Iterable<T>
Top (
size_t n, COMPARER&& cmp)
const;
1084 template <Common::IPotentiallyComparer<T> INORDER_COMPARER_TYPE = less<T>>
1095 template <Common::IPotentiallyComparer<T> INORDER_COMPARER_TYPE = less<T>>
1096 nonvirtual
bool IsOrderedBy (INORDER_COMPARER_TYPE&& inorderComparer = INORDER_COMPARER_TYPE{})
const;
1123 nonvirtual optional<T>
First ()
const;
1124 template <invocable<T> F>
1125 nonvirtual optional<T>
First (F&& that)
const
1126 requires (convertible_to<invoke_result_t<F, T>,
bool>);
1127 template <
typename RESULT_T = T>
1128 nonvirtual optional<RESULT_T>
First (
const function<optional<RESULT_T> (ArgByValueType<T>)>& that)
const;
1144 nonvirtual T
FirstValue (ArgByValueType<T> defaultValue = {})
const;
1145 template <invocable<T> F>
1146 nonvirtual T
FirstValue (F&& that, ArgByValueType<T> defaultValue = {})
const
1147 requires (convertible_to<invoke_result_t<F, T>,
bool>);
1164 nonvirtual optional<T>
Last ()
const;
1165 template <invocable<T> F>
1166 nonvirtual optional<T>
Last (F&& that)
const
1167 requires (convertible_to<invoke_result_t<F, T>,
bool>);
1168 template <
typename RESULT_T = T>
1169 nonvirtual optional<RESULT_T>
Last (
const function<optional<RESULT_T> (ArgByValueType<T>)>& that)
const;
1184 nonvirtual T
LastValue (ArgByValueType<T> defaultValue = {})
const;
1185 template <invocable<T> F>
1186 nonvirtual T
LastValue (F&& that, ArgByValueType<T> defaultValue = {})
const
1187 requires (convertible_to<invoke_result_t<F, T>,
bool>);
1205 nonvirtual
bool All (
const function<
bool (ArgByValueType<T>)>& testEachElt)
const;
1225 nonvirtual optional<T>
Min ()
const;
1231 template <
typename RESULT_TYPE = T>
1232 nonvirtual RESULT_TYPE
MinValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1252 nonvirtual optional<T>
Max ()
const;
1258 template <
typename RESULT_TYPE = T>
1259 nonvirtual RESULT_TYPE
MaxValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1278 template <
typename RESULT_TYPE = T>
1279 nonvirtual optional<RESULT_TYPE>
Mean ()
const;
1285 template <
typename RESULT_TYPE = T>
1286 nonvirtual RESULT_TYPE
MeanValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1305 template <
typename RESULT_TYPE = T>
1306 nonvirtual optional<RESULT_TYPE>
Sum ()
const;
1312 template <
typename RESULT_TYPE = T>
1313 nonvirtual RESULT_TYPE
SumValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1328 template <constructible_from<T> RESULT_TYPE = T, Common::IPotentiallyComparer<RESULT_TYPE> INORDER_COMPARE_FUNCTION = less<RESULT_TYPE>>
1329 nonvirtual optional<RESULT_TYPE>
Median (
const INORDER_COMPARE_FUNCTION& compare = {})
const;
1335 template <constructible_from<T> RESULT_TYPE = T>
1336 nonvirtual RESULT_TYPE
MedianValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1365 nonvirtual
bool Any ()
const;
1366 nonvirtual
bool Any (
const function<
bool (ArgByValueType<T>)>& includeIfTrue)
const;
1379 nonvirtual
size_t Count ()
const;
1380 nonvirtual
size_t Count (
const function<
bool (ArgByValueType<T>)>& includeIfTrue)
const;
1386 nonvirtual
size_t length ()
const;
1398 static shared_ptr<_IRep> Clone_ (
const _IRep& rep);
1401#if (__cplusplus < kStrokia_Foundation_Common_cplusplus_20) || qCompilerAndStdLib_lambdas_in_unevaluatedContext_Buggy
1402 struct Rep_Cloner_ {
1403 auto operator() (
const _IRep& t)
const -> shared_ptr<_IRep>
1409 using Rep_Cloner_ =
decltype ([] (
const _IRep& t) -> shared_ptr<_IRep> {
return Iterable<T>::Clone_ (t); });
1413 template <
typename CONTAINER_OF_T>
1414 static Iterable<T> mk_ (CONTAINER_OF_T&& from);
1424 template <
typename REP_SUB_TYPE = _IRep>
1428 template <
typename REP_SUB_TYPE = _IRep>
1441 template <
typename SHARED_T>
1442 using PtrImplementationTemplate [[deprecated (
"Since Stroika v3.0d1 - use shared_ptr directly")]] = shared_ptr<SHARED_T>;
1443 template <
typename SHARED_T,
typename... ARGS_TYPE>
1444 [[deprecated (
"Since Stroika v3.0d1 - use Memory::MakeSharedPtr directly")]]
static shared_ptr<SHARED_T> MakeSmartPtr (ARGS_TYPE&&... args)
1446 return Memory::MakeSharedPtr<SHARED_T> (forward<ARGS_TYPE> (args)...);
1448 template <
typename SHARED_T>
1449 using enable_shared_from_this_PtrImplementationTemplate [[deprecated (
"Since Stroika v3.0d1")]] = std::enable_shared_from_this<SHARED_T>;
1452 using _IterableRepSharedPtr [[deprecated (
"Since Stroika v3.0d1 use shared_ptr<_IRep> directly")]] = shared_ptr<_IRep>;
1453 using _IteratorRepSharedPtr [[deprecated (
"Since Stroika v3.0d1 use unique_ptr<typename Iterator<T>::IRep> directly")]] =
1454 unique_ptr<typename Iterator<T>::IRep>;