Iros
 
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"
14#include "di/types/size_t.h"
15
16namespace di::container {
17struct SizeFunction;
18
19namespace detail {
20 template<typename T>
22
23 template<typename T>
25
26 template<typename T>
27 concept MemberSize = requires(T&& container) {
28 {
29 util::forward<T>(container).size()
31 };
32
33 template<typename T>
36}
37
39 template<typename T>
41 constexpr auto operator()(T&& container) const -> meta::IteratorSizeType<meta::ContainerIterator<T>> {
42 if constexpr (detail::ArraySize<T>) {
44 } else if constexpr (detail::CustomSize<T>) {
45 return function::tag_invoke(*this, util::forward<T>(container));
46 } else if constexpr (detail::MemberSize<T>) {
47 return util::forward<T>(container).size();
48 } else {
49 return end(container) - begin(container);
50 }
51 }
52};
53
54constexpr inline auto size = SizeFunction {};
55}
56
57namespace di {
58using container::size;
59}
Definition language.h:96
Definition forward_iterator.h:10
Implicit conversion for this test refers to the ability to return a value of function from a type.
Definition operations.h:89
Definition sized_sentinel_for.h:9
Definition tag_invoke.h:45
Definition sequence.h:13
Definition sequence.h:12
constexpr auto size
Definition size.h:54
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
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 zstring_parser.h:9
Definition size.h:38