241 static_assert (copy_constructible<Iterator<T>>,
"Must be able to create Iterator<T> to use Iterable<T>");
242#if !qCompilerAndStdLib_constructible_Buggy
243 static_assert (copyable<T>);
292 explicit
Iterable (CONTAINER_OF_T&& from)
293 requires (not derived_from<remove_cvref_t<CONTAINER_OF_T>,
Iterable<T>>
294#if !qCompilerAndStdLib_constructible_Buggy
295 and (copyable<remove_cvref_t<CONTAINER_OF_T>> or same_as<remove_cvref_t<CONTAINER_OF_T>, initializer_list<T>>)
298#
if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
299 :
_fRep{mk_ (forward<CONTAINER_OF_T> (from)).
_fRep} {}
310 Iterable (
const initializer_list<T>& from);
321 explicit Iterable (
const shared_ptr<_IRep>& rep)
noexcept;
322 explicit Iterable (shared_ptr<_IRep>&& rep)
noexcept;
337 nonvirtual
explicit operator bool ()
const;
377 nonvirtual
size_t size ()
const;
392 nonvirtual
bool empty ()
const;
409 template <Common::IPotentiallyComparer<T> EQUALS_COMPARER = equal_to<T>>
410 nonvirtual
bool Contains (ArgByValueType<T> element, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{})
const;
430 template <ranges::range LHS_CONTAINER_TYPE, ranges::range RHS_CONTAINER_TYPE, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
431 static bool SetEquals (
const LHS_CONTAINER_TYPE& lhs,
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{});
432 template <ranges::range RHS_CONTAINER_TYPE = initializer_list<T>, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
433 nonvirtual
bool SetEquals (
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{})
const;
444 template <ranges::range LHS_CONTAINER_TYPE, ranges::range RHS_CONTAINER_TYPE, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
445 static bool MultiSetEquals (
const LHS_CONTAINER_TYPE& lhs,
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{});
446 template <ranges::range RHS_CONTAINER_TYPE = initializer_list<T>, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
447 nonvirtual
bool MultiSetEquals (
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{})
const;
461 template <ranges::range LHS_CONTAINER_TYPE, ranges::range RHS_CONTAINER_TYPE, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
462 static bool SequentialEquals (
const LHS_CONTAINER_TYPE& lhs,
const RHS_CONTAINER_TYPE& rhs,
463 EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{},
bool useIterableSize =
false);
464 template <ranges::range RHS_CONTAINER_TYPE = initializer_list<T>, IEqualsComparer<T> EQUALS_COMPARER = equal_to<T>>
465 nonvirtual
bool SequentialEquals (
const RHS_CONTAINER_TYPE& rhs, EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{},
466 bool useIterableSize =
false)
const;
469 template <qCompilerAndStdLib_Constra
intDiffersInTemplateRedeclaration_BWA (IEqualsComparer<T>) T_EQUALS_COMPARER = equal_to<T>>
470 struct SequentialEqualsComparer;
473 template <qCompilerAndStdLib_Constra
intDiffersInTemplateRedeclaration_BWA (IThreeWayComparer<T>) T_THREEWAY_COMPARER = compare_three_way>
474 struct SequentialThreeWayComparer;
502 nonvirtual Iterator<T>
begin ()
const;
511 static constexpr default_sentinel_t
end () noexcept;
556 nonvirtual
void Apply (const function<
void (ArgByValueType<T> item)>& doToElement,
557 Execution::SequencePolicy seq = Execution::SequencePolicy::eDEFAULT) const;
622 template <predicate<T> THAT_FUNCTION>
623 nonvirtual
Iterator<T>
Find (THAT_FUNCTION&& that, Execution::SequencePolicy seq = Execution::SequencePolicy::eDEFAULT) const;
624 template <Common::IPotentiallyComparer<T> EQUALS_COMPARER>
625 nonvirtual
Iterator<T>
Find (Common::ArgByValueType<T> v, EQUALS_COMPARER&& equalsComparer = {},
627 template <predicate<T> THAT_FUNCTION>
630 template <Common::IPotentiallyComparer<T> EQUALS_COMPARER>
648 template <IIterableOfFrom<T> CONTAINER_OF_T,
typename... CONTAINER_OF_T_CONSTRUCTOR_ARGS>
649 nonvirtual CONTAINER_OF_T
As (CONTAINER_OF_T_CONSTRUCTOR_ARGS... args)
const;
667 nonvirtual T
Nth (ptrdiff_t n)
const;
681 nonvirtual T
NthValue (ptrdiff_t n, ArgByValueType<T> defaultValue = {})
const;
710#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
711 template <
typename RESULT_CONTAINER = Iterable<T>, predicate<T> INCLUDE_PREDICATE>
712 nonvirtual RESULT_CONTAINER
Where (INCLUDE_PREDICATE&& includeIfTrue)
const;
713 template <
typename RESULT_CONTAINER = Iterable<T>, predicate<T> INCLUDE_PREDICATE>
714 nonvirtual RESULT_CONTAINER
Where (INCLUDE_PREDICATE&& includeIfTrue, RESULT_CONTAINER&& emptyResult)
const;
716 template <derived_from<Iterable<T>> RESULT_CONTAINER = Iterable<T>, predicate<T> INCLUDE_PREDICATE>
717 nonvirtual RESULT_CONTAINER
Where (INCLUDE_PREDICATE&& includeIfTrue)
const;
718 template <derived_from<Iterable<T>> RESULT_CONTAINER = Iterable<T>, predicate<T> INCLUDE_PREDICATE>
719 nonvirtual RESULT_CONTAINER
Where (INCLUDE_PREDICATE&& includeIfTrue, RESULT_CONTAINER&& emptyResult)
const;
737 template <Common::IPotentiallyComparer<T> EQUALS_COMPARER = equal_to<T>>
739 template <
typename RESULT, Common::IPotentiallyComparer<T> EQUALS_COMPARER = equal_to<RESULT>>
741 EQUALS_COMPARER&& equalsComparer = EQUALS_COMPARER{})
const;
813 template <ranges::range RESULT_CONTAINER = Iterable<T>, invocable<T> ELEMENT_MAPPER>
814 nonvirtual RESULT_CONTAINER
Map (ELEMENT_MAPPER&& elementMapper)
const
815 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, T>,
typename RESULT_CONTAINER::value_type> or
816 convertible_to<invoke_result_t<ELEMENT_MAPPER, T>, optional<typename RESULT_CONTAINER::value_type>>);
817 template <ranges::range RESULT_CONTAINER = Iterable<T>, invocable<T> ELEMENT_MAPPER>
818 nonvirtual RESULT_CONTAINER
Map (ELEMENT_MAPPER&& elementMapper, RESULT_CONTAINER&& emptyResult)
const
819 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, T>,
typename RESULT_CONTAINER::value_type> or
820 convertible_to<invoke_result_t<ELEMENT_MAPPER, T>, optional<typename RESULT_CONTAINER::value_type>>);
861 template <
typename REDUCED_TYPE = T>
862 nonvirtual optional<REDUCED_TYPE>
Reduce (
const function<REDUCED_TYPE (ArgByValueType<T>, ArgByValueType<T>)>& op)
const;
868 template <
typename REDUCED_TYPE = T>
869 nonvirtual REDUCED_TYPE
ReduceValue (
const function<REDUCED_TYPE (ArgByValueType<T>, ArgByValueType<T>)>& op,
870 ArgByValueType<REDUCED_TYPE> defaultValue = {})
const;
884 template <same_as<Characters::String> RESULT_T = Characters::String>
886 if constexpr (same_as<T, Characters::String> and same_as<RESULT_T, Characters::String>) {
890 return Characters::UnoverloadedToString<T>;
938#if qCompilerAndStdLib_template_SubstDefaultTemplateParamVariableTemplate_Buggy
939 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT = decltype (kDefaultToStringConverter<RESULT_T>),
940 invocable<RESULT_T, RESULT_T,
bool> COMBINER = decltype (Characters::kDefaultStringCombiner)>
941 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult = kDefaultToStringConverter<RESULT_T>,
943 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T> and
944 convertible_to<invoke_result_t<COMBINER, RESULT_T, RESULT_T, bool>, RESULT_T>);
946 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT = decltype (kDefaultToStringConverter<>),
947 invocable<RESULT_T, RESULT_T,
bool> COMBINER = decltype (Characters::kDefaultStringCombiner)>
948 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult = kDefaultToStringConverter<>,
950 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T> and
951 convertible_to<invoke_result_t<COMBINER, RESULT_T, RESULT_T, bool>, RESULT_T>);
953#if qCompilerAndStdLib_template_optionalDeclareIncompleteType_Buggy
956 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT>
957 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult,
const RESULT_T& separator)
const
958 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T>);
959 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT>
960 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult,
const RESULT_T& separator,
const optional<RESULT_T>& finalSeparator)
const
961 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T>);
964 template <
typename RESULT_T = Characters::String, invocable<T> CONVERT_TO_RESULT>
965 nonvirtual RESULT_T
Join (
const CONVERT_TO_RESULT& convertToResult,
const RESULT_T& separator,
const optional<RESULT_T>& finalSeparator = {})
const
966 requires (convertible_to<invoke_result_t<CONVERT_TO_RESULT, T>, RESULT_T>);
986 nonvirtual Iterable<T>
Skip (
size_t nItems)
const;
1004 nonvirtual Iterable<T>
Take (
size_t nItems)
const;
1026 nonvirtual Iterable<T>
Slice (
size_t from,
size_t to)
const;
1051 nonvirtual Iterable<T>
Top ()
const;
1052 nonvirtual Iterable<T>
Top (
size_t n)
const;
1053 template <Common::IPotentiallyComparer<T> COMPARER>
1054 nonvirtual Iterable<T>
Top (COMPARER&& cmp)
const;
1055 template <Common::IPotentiallyComparer<T> COMPARER>
1056 nonvirtual Iterable<T>
Top (
size_t n, COMPARER&& cmp)
const;
1090 template <Common::IPotentiallyComparer<T> INORDER_COMPARER_TYPE = less<T>>
1101 template <Common::IPotentiallyComparer<T> INORDER_COMPARER_TYPE = less<T>>
1102 nonvirtual
bool IsOrderedBy (INORDER_COMPARER_TYPE&& inorderComparer = INORDER_COMPARER_TYPE{})
const;
1129 nonvirtual optional<T>
First ()
const;
1130 template <invocable<T> F>
1131 nonvirtual optional<T>
First (F&& that)
const
1132 requires (convertible_to<invoke_result_t<F, T>,
bool>);
1133 template <
typename RESULT_T = T>
1134 nonvirtual optional<RESULT_T>
First (
const function<optional<RESULT_T> (ArgByValueType<T>)>& that)
const;
1150 nonvirtual T
FirstValue (ArgByValueType<T> defaultValue = {})
const;
1151 template <invocable<T> F>
1152 nonvirtual T
FirstValue (F&& that, ArgByValueType<T> defaultValue = {})
const
1153 requires (convertible_to<invoke_result_t<F, T>,
bool>);
1170 nonvirtual optional<T>
Last ()
const;
1171 template <invocable<T> F>
1172 nonvirtual optional<T>
Last (F&& that)
const
1173 requires (convertible_to<invoke_result_t<F, T>,
bool>);
1174 template <
typename RESULT_T = T>
1175 nonvirtual optional<RESULT_T>
Last (
const function<optional<RESULT_T> (ArgByValueType<T>)>& that)
const;
1190 nonvirtual T
LastValue (ArgByValueType<T> defaultValue = {})
const;
1191 template <invocable<T> F>
1192 nonvirtual T
LastValue (F&& that, ArgByValueType<T> defaultValue = {})
const
1193 requires (convertible_to<invoke_result_t<F, T>,
bool>);
1211 nonvirtual
bool All (
const function<
bool (ArgByValueType<T>)>& testEachElt)
const;
1231 nonvirtual optional<T>
Min ()
const;
1237 template <
typename RESULT_TYPE = T>
1238 nonvirtual RESULT_TYPE
MinValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1258 nonvirtual optional<T>
Max ()
const;
1264 template <
typename RESULT_TYPE = T>
1265 nonvirtual RESULT_TYPE
MaxValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1284 template <
typename RESULT_TYPE = T>
1285 nonvirtual optional<RESULT_TYPE>
Mean ()
const;
1291 template <
typename RESULT_TYPE = T>
1292 nonvirtual RESULT_TYPE
MeanValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1311 template <
typename RESULT_TYPE = T>
1312 nonvirtual optional<RESULT_TYPE>
Sum ()
const;
1318 template <
typename RESULT_TYPE = T>
1319 nonvirtual RESULT_TYPE
SumValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1334 template <constructible_from<T> RESULT_TYPE = T, Common::IPotentiallyComparer<RESULT_TYPE> INORDER_COMPARE_FUNCTION = less<RESULT_TYPE>>
1335 nonvirtual optional<RESULT_TYPE>
Median (
const INORDER_COMPARE_FUNCTION& compare = {})
const;
1341 template <constructible_from<T> RESULT_TYPE = T>
1342 nonvirtual RESULT_TYPE
MedianValue (ArgByValueType<RESULT_TYPE> defaultValue = {})
const;
1371 nonvirtual
bool Any ()
const;
1372 nonvirtual
bool Any (
const function<
bool (ArgByValueType<T>)>& includeIfTrue)
const;
1385 nonvirtual
size_t Count ()
const;
1386 nonvirtual
size_t Count (
const function<
bool (ArgByValueType<T>)>& includeIfTrue)
const;
1392 nonvirtual
size_t length ()
const;
1404 static shared_ptr<_IRep> Clone_ (
const _IRep& rep);
1407#if (__cplusplus < kStrokia_Foundation_Common_cplusplus_20) || qCompilerAndStdLib_lambdas_in_unevaluatedContext_Buggy
1408 struct Rep_Cloner_ {
1409 auto operator() (
const _IRep& t)
const -> shared_ptr<_IRep>
1415 using Rep_Cloner_ =
decltype ([] (
const _IRep& t) -> shared_ptr<_IRep> {
return Iterable<T>::Clone_ (t); });
1419 template <
typename CONTAINER_OF_T>
1420 static Iterable<T> mk_ (CONTAINER_OF_T&& from)
1421 requires (copyable<remove_cvref_t<CONTAINER_OF_T>> or same_as<remove_cvref_t<CONTAINER_OF_T>, initializer_list<T>>);
1431 template <
typename REP_SUB_TYPE = _IRep>
1435 template <
typename REP_SUB_TYPE = _IRep>
1448 template <
typename SHARED_T>
1449 using PtrImplementationTemplate [[deprecated (
"Since Stroika v3.0d1 - use shared_ptr directly")]] = shared_ptr<SHARED_T>;
1450 template <
typename SHARED_T,
typename... ARGS_TYPE>
1451 [[deprecated (
"Since Stroika v3.0d1 - use Memory::MakeSharedPtr directly")]]
static shared_ptr<SHARED_T> MakeSmartPtr (ARGS_TYPE&&... args)
1453 return Memory::MakeSharedPtr<SHARED_T> (forward<ARGS_TYPE> (args)...);
1455 template <
typename SHARED_T>
1456 using enable_shared_from_this_PtrImplementationTemplate [[deprecated (
"Since Stroika v3.0d1")]] = std::enable_shared_from_this<SHARED_T>;
1459 using _IterableRepSharedPtr [[deprecated (
"Since Stroika v3.0d1 use shared_ptr<_IRep> directly")]] = shared_ptr<_IRep>;
1460 using _IteratorRepSharedPtr [[deprecated (
"Since Stroika v3.0d1 use unique_ptr<typename Iterator<T>::IRep> directly")]] =
1461 unique_ptr<typename Iterator<T>::IRep>;