| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- //
- // traits.hpp
- // stream
- //
- // Created by Sam Jaffe on 6/24/17.
- //
- #pragma once
- #include <type_traits>
- #include <utility>
- #include <iterator/detail/traits.h>
- #include <iterator/facade.h>
- #include <stream/forward.h>
- #include <stream/detail/macro.h>
- namespace stream::detail {
- template <typename C> using begin_t = decltype(std::begin(VAL(C)));
- template <typename C> using end_t = decltype(std::end(VAL(C)));
- template <typename C> using ref_t = decltype(*VAL(begin_t<C>));
- template <typename C> using value_type = std::remove_reference_t<ref_t<C>>;
- template <typename C> using cref_t = std::add_const_t<ref_t<C>>;
- template <typename, typename = void> struct has_size : std::false_type {};
- template <typename, typename = void> struct has_empty : std::false_type {};
- template <typename C>
- struct has_size<C, std::enable_if_t<std::is_integral_v<TYPE(C, size())>>>
- : std::true_type {};
- template <typename C>
- struct has_empty<C, std::enable_if_t<std::is_same_v<TYPE(C, empty()), bool>>>
- : std::true_type {};
- template <typename It, typename S, typename = void>
- struct is_comparable : std::false_type {};
- template <typename It, typename S>
- struct is_comparable<It, S, EXISTS(VAL(It) == VAL(S))> : std::true_type {};
- template <typename It, typename S, typename = void>
- struct is_sized_sentinel : std::false_type {};
- template <typename It, typename S>
- struct is_sized_sentinel<It, S, EXISTS(VAL(S) - VAL(It))> : std::true_type {};
- template <typename C> constexpr bool has_size_v = has_size<C>{};
- template <typename C> constexpr bool has_empty_v = has_empty<C>{};
- template <typename It, typename S>
- constexpr bool is_comparable_v = is_comparable<It, S>{};
- template <typename S>
- constexpr bool has_sentinal_v = !std::is_same_v<begin_t<S>, end_t<S>>;
- template <typename S, template <typename...> class Iter, typename... Ts>
- using sentinel_iterator =
- std::conditional_t<detail::has_sentinal_v<S>, detail::end_t<S>,
- Iter<detail::begin_t<S>, Ts...>>;
- template <typename It, typename S>
- constexpr bool is_sized_sentinel_v = is_sized_sentinel<It, S>{};
- }
- #include <stream/detail/undef.h>
|