mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2026-02-08 18:56:41 +08:00
upd: [imp] span (TBD)
This commit is contained in:
parent
081e20bfd6
commit
3a3168b6f4
@ -25,16 +25,16 @@ namespace detail {
|
|||||||
template <typename From, typename To>
|
template <typename From, typename To>
|
||||||
using array_convertible = std::is_convertible<From(*)[], To(*)[]>;
|
using array_convertible = std::is_convertible<From(*)[], To(*)[]>;
|
||||||
|
|
||||||
|
template <typename From, typename To>
|
||||||
|
using is_array_convertible =
|
||||||
|
typename std::enable_if<array_convertible<From, To>::value>::type;
|
||||||
|
|
||||||
template <typename T, typename Ref>
|
template <typename T, typename Ref>
|
||||||
using compatible_ref = array_convertible<typename std::remove_reference<Ref>::type, T>;
|
using compatible_ref = array_convertible<typename std::remove_reference<Ref>::type, T>;
|
||||||
|
|
||||||
template <typename It>
|
template <typename It>
|
||||||
using iter_reference_t = decltype(*std::declval<It&>());
|
using iter_reference_t = decltype(*std::declval<It&>());
|
||||||
|
|
||||||
template <typename From, typename To>
|
|
||||||
using is_array_convertible =
|
|
||||||
typename std::enable_if<array_convertible<From, To>::value>::type;
|
|
||||||
|
|
||||||
template <typename T, typename It>
|
template <typename T, typename It>
|
||||||
using is_compatible_iter =
|
using is_compatible_iter =
|
||||||
typename std::enable_if<compatible_ref<T, iter_reference_t<It>>::value>::type;
|
typename std::enable_if<compatible_ref<T, iter_reference_t<It>>::value>::type;
|
||||||
@ -43,6 +43,10 @@ template <typename From, typename To>
|
|||||||
using is_inconvertible =
|
using is_inconvertible =
|
||||||
typename std::enable_if<!std::is_convertible<From, To>::value>::type;
|
typename std::enable_if<!std::is_convertible<From, To>::value>::type;
|
||||||
|
|
||||||
|
template <typename S, typename I>
|
||||||
|
using is_sized_sentinel_for =
|
||||||
|
is_inconvertible<decltype(std::declval<S>() - std::declval<I>()), std::ptrdiff_t>;
|
||||||
|
|
||||||
/// @brief Obtain the address represented by p
|
/// @brief Obtain the address represented by p
|
||||||
/// without forming a reference to the object pointed to by p.
|
/// without forming a reference to the object pointed to by p.
|
||||||
/// @see https://en.cppreference.com/w/cpp/memory/to_address
|
/// @see https://en.cppreference.com/w/cpp/memory/to_address
|
||||||
@ -97,7 +101,7 @@ public:
|
|||||||
|
|
||||||
template <typename It, typename End,
|
template <typename It, typename End,
|
||||||
typename = detail::is_compatible_iter<T, It>,
|
typename = detail::is_compatible_iter<T, It>,
|
||||||
typename = detail::is_compatible_iter<T, End>,
|
typename = detail::is_sized_sentinel_for<End, It>,
|
||||||
typename = detail::is_inconvertible<End, size_type>>
|
typename = detail::is_inconvertible<End, size_type>>
|
||||||
constexpr span(It first, End last) noexcept(noexcept(last - first))
|
constexpr span(It first, End last) noexcept(noexcept(last - first))
|
||||||
: ptr_ (detail::to_address(first))
|
: ptr_ (detail::to_address(first))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user