di 0.1.0
Loading...
Searching...
No Matches
size.h
Go to the documentation of this file.
1#pragma once
2
11#include "di/meta/core.h"
12#include "di/meta/language.h"
13#include "di/meta/operations.h"
15#include "di/types/size_t.h"
16
17namespace di::container {
18struct SizeFunction;
19
20namespace detail {
21 template<typename T>
22 concept ArraySize = concepts::BoundedLanguageArray<meta::RemoveReference<T>>;
23
24 template<typename T>
25 concept CustomSize = concepts::TagInvocableTo<SizeFunction, meta::IteratorSizeType<meta::ContainerIterator<T>>, T>;
26
27 template<typename T>
28 concept MemberSize = requires(T&& container) {
29 {
30 util::forward<T>(container).size()
31 } -> concepts::ImplicitlyConvertibleTo<meta::IteratorSizeType<meta::ContainerIterator<T>>>;
32 };
33
34 template<typename T>
35 concept IteratorSize = concepts::ForwardIterator<meta::ContainerIterator<T>> &&
36 concepts::SizedSentinelFor<meta::ContainerSentinel<T>, meta::ContainerIterator<T>>;
37}
38
40 template<typename T>
41 requires(detail::ArraySize<T> || detail::CustomSize<T> || detail::MemberSize<T> || detail::IteratorSize<T>)
42 constexpr auto operator()(T&& container) const -> meta::IteratorSizeType<meta::ContainerIterator<T>> {
43 if constexpr (detail::ArraySize<T>) {
45 } else if constexpr (detail::CustomSize<T>) {
46 return function::tag_invoke(*this, util::forward<T>(container));
47 } else if constexpr (detail::MemberSize<T>) {
48#ifdef DI_CLANG
49#pragma clang diagnostic push
50#pragma clang diagnostic ignored "-Wunused-result"
51#endif
52 return util::forward<T>(container).size();
53#ifdef DI_CLANG
54#pragma clang diagnostic pop
55#endif
56 } else {
57 return end(container) - begin(container);
58 }
59 }
60};
61
62constexpr inline auto size = SizeFunction {};
63}
64
65namespace di {
66using container::size;
67}
Definition sequence.h:12
constexpr auto size
Definition size.h:62
constexpr auto end
Definition end.h:55
constexpr auto begin
Definition begin.h:52
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto Extent
Definition language.h:149
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
MakeUnsigned< IteratorSSizeType< T > > IteratorSizeType
Definition iterator_size_type.h:8
Definition any_storable.h:9
Definition size.h:39