di 0.1.0
Loading...
Searching...
No Matches
ssize.h
Go to the documentation of this file.
1#pragma once
2
8#include "di/meta/language.h"
9
10namespace di::container {
11struct SSizeFunction;
12
13namespace detail {
14 template<typename T>
15 concept CustomSSize =
16 concepts::TagInvocableTo<SSizeFunction, meta::IteratorSSizeType<meta::ContainerIterator<T>>, T>;
17
18 template<typename T>
19 concept SizeSSize = requires { typename meta::ContainerSizeType<T>; };
20}
21
23 template<typename T>
24 requires(detail::CustomSSize<T> || detail::SizeSSize<T>)
25 constexpr auto operator()(T&& container) const -> meta::MakeSigned<meta::ContainerSizeType<T>> {
26 if constexpr (detail::CustomSize<T>) {
27 return function::tag_invoke(*this, util::forward<T>(container));
28 } else {
29 return static_cast<meta::MakeSigned<meta::ContainerSizeType<T>>>(size(util::forward<T>(container)));
30 }
31 }
32};
33
34constexpr inline auto ssize = SSizeFunction {};
35}
36
37namespace di {
39}
Definition sequence.h:12
constexpr auto ssize
Definition ssize.h:34
constexpr auto size
Definition size.h:62
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
decltype(container::size(util::declval< T >())) ContainerSizeType
Definition container_size_type.h:8
detail::MakeSignedHelper< RemoveCV< T > >::Type MakeSigned
Definition language.h:316
Definition any_storable.h:9
Definition ssize.h:22