di 0.1.0
Loading...
Searching...
No Matches
distance.h
Go to the documentation of this file.
1#pragma once
2
14
15namespace di::container {
16namespace detail {
17 struct DistanceFunction {
18 template<concepts::Iterator Iter, concepts::SentinelFor<Iter> Sent>
19 requires(!concepts::SizedSentinelFor<Sent, Iter>)
20 constexpr auto operator()(Iter iter, Sent sent) const -> meta::IteratorSSizeType<Iter> {
22 for (; iter != sent; ++iter) {
23 ++distance;
24 }
25 return distance;
26 }
27
28 template<concepts::Iterator Iter, concepts::SizedSentinelFor<Iter> Sent>
29 constexpr auto operator()(Iter const& iter, Sent const& sent) const {
30 return sent - iter;
31 }
32
33 template<concepts::Container Con>
34 constexpr auto operator()(Con&& container) const -> meta::ContainerSSizeType<Con> {
35 if constexpr (concepts::SizedContainer<Con>) {
36 return container::ssize(container);
37 } else {
38 return (*this)(begin(container), end(container));
39 }
40 }
41 };
42}
43
44constexpr inline auto distance = detail::DistanceFunction {};
45}
46
47namespace di {
49}
Definition sequence.h:12
constexpr auto ssize
Definition ssize.h:34
constexpr auto distance
Definition distance.h:44
constexpr auto end
Definition end.h:55
constexpr auto begin
Definition begin.h:52
IteratorSSizeType< ContainerIterator< T > > ContainerSSizeType
Definition container_ssize_type.h:8
decltype(container::iterator_ssize_type(types::in_place_type< meta::RemoveCVRef< T > >)) IteratorSSizeType
Definition iterator_ssize_type.h:8
Definition any_storable.h:9