mirror of
https://github.com/microsoft/GSL.git
synced 2024-11-03 17:56:43 -05:00
Added conversion ctors.
This commit is contained in:
parent
c40094a532
commit
717a2e35f1
@ -92,6 +92,53 @@ template <class T>
|
|||||||
struct is_span : is_span_oracle<std::remove_cv_t<T>>
|
struct is_span : is_span_oracle<std::remove_cv_t<T>>
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class From, class To>
|
||||||
|
struct is_allowed_pointer_conversion
|
||||||
|
: std::integral_constant<bool,
|
||||||
|
std::is_pointer<From>::value &&
|
||||||
|
std::is_pointer<To>::value &&
|
||||||
|
std::is_convertible<From, To>::value
|
||||||
|
>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class From, class To>
|
||||||
|
struct is_allowed_integral_conversion
|
||||||
|
: std::integral_constant<bool,
|
||||||
|
std::is_integral<From>::value &&
|
||||||
|
std::is_integral<To>::value &&
|
||||||
|
sizeof(From) == sizeof(To) &&
|
||||||
|
alignof(From) == alignof(To) &&
|
||||||
|
std::is_convertible<From, To>::value
|
||||||
|
>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class From, class To>
|
||||||
|
struct is_allowed_element_type_conversion
|
||||||
|
: std::integral_constant<bool,
|
||||||
|
std::is_same<From, std::remove_cv_t<To>>::value ||
|
||||||
|
is_allowed_pointer_conversion<From, To>::value ||
|
||||||
|
is_allowed_integral_conversion<From, To>::value
|
||||||
|
>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class From>
|
||||||
|
struct is_allowed_element_type_conversion<From, char>
|
||||||
|
: std::integral_constant<bool, !std::is_const<From>::value>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class From>
|
||||||
|
struct is_allowed_element_type_conversion<From, const char>
|
||||||
|
: std::integral_constant<bool, true>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace details
|
} // namespace details
|
||||||
|
|
||||||
|
|
||||||
@ -163,13 +210,29 @@ public:
|
|||||||
>
|
>
|
||||||
span(const Container&&) = delete;
|
span(const Container&&) = delete;
|
||||||
|
|
||||||
#if 0 // TODO
|
|
||||||
constexpr span(const span& other) noexcept = default;
|
constexpr span(const span& other) noexcept = default;
|
||||||
constexpr span(span&& other) noexcept = default;
|
constexpr span(span&& other) noexcept = default;
|
||||||
template <class OtherElementType, ptrdiff_t OtherExtent>
|
|
||||||
constexpr span(const span<OtherElementType, OtherExtent>& other);
|
template <class OtherElementType, std::ptrdiff_t OtherExtent,
|
||||||
template <class OtherElementType, ptrdiff_t OtherExtent>
|
class = std::enable_if_t<!std::is_same<element_type, OtherElementType>::value &&
|
||||||
constexpr span(span<OtherElementType, OtherExtent>&& other);
|
details::is_allowed_element_type_conversion<OtherElementType, element_type>::value
|
||||||
|
>
|
||||||
|
>
|
||||||
|
constexpr span(const span<OtherElementType, OtherExtent>& other)
|
||||||
|
: storage_(reinterpret_cast<pointer>(other.data()), other.length())
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <class OtherElementType, std::ptrdiff_t OtherExtent,
|
||||||
|
class = std::enable_if_t<!std::is_same<element_type, OtherElementType>::value &&
|
||||||
|
details::is_allowed_element_type_conversion<OtherElementType, element_type>::value
|
||||||
|
>
|
||||||
|
>
|
||||||
|
constexpr span(span<OtherElementType, OtherExtent>&& other)
|
||||||
|
: storage_(reinterpret_cast<pointer>(other.data()), other.length())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0 // TODO
|
||||||
~span() noexcept = default;
|
~span() noexcept = default;
|
||||||
constexpr span& operator=(const span& other) noexcept = default;
|
constexpr span& operator=(const span& other) noexcept = default;
|
||||||
constexpr span& operator=(span&& other) noexcept = default;
|
constexpr span& operator=(span&& other) noexcept = default;
|
||||||
|
@ -512,34 +512,44 @@ SUITE(span_tests)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
TEST(from_convertible_span_constructor)
|
TEST(from_convertible_span_constructor)
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
span<DerivedClass> avd;
|
||||||
|
span<const DerivedClass> avcd = avd;
|
||||||
|
(void)avcd;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
#ifdef CONFIRM_COMPILATION_ERRORS
|
#ifdef CONFIRM_COMPILATION_ERRORS
|
||||||
span<int, 7, 4, 2> av1(nullptr, b1);
|
span<DerivedClass> avd;
|
||||||
|
span<BaseClass> avb = avd;
|
||||||
auto f = [&]() { span<int, 7, 4, 2> av1(nullptr); };
|
(void) avb;
|
||||||
CHECK_THROW(f(), fail_fast);
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
span<int> s;
|
||||||
|
span<unsigned int> s2 = s;
|
||||||
|
(void)s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
span<int> s;
|
||||||
|
span<const unsigned int> s2 = s;
|
||||||
|
(void)s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
#ifdef CONFIRM_COMPILATION_ERRORS
|
#ifdef CONFIRM_COMPILATION_ERRORS
|
||||||
static_bounds<size_t, 7, dynamic_range, 2> b12(b11);
|
span<int> s;
|
||||||
b12 = b11;
|
span<short> s2 = s;
|
||||||
b11 = b12;
|
(void)s2;
|
||||||
|
|
||||||
span<int, dynamic_range> av1 = nullptr;
|
|
||||||
span<int, 7, dynamic_range, 2> av2(av1);
|
|
||||||
span<int, 7, 4, 2> av2(av1);
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
span<DerivedClass> avd;
|
|
||||||
#ifdef CONFIRM_COMPILATION_ERRORS
|
|
||||||
span<BaseClass> avb = avd;
|
|
||||||
#endif
|
|
||||||
span<const DerivedClass> avcd = avd;
|
|
||||||
(void) avcd;
|
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
TEST(copy_move_and_assignment)
|
TEST(copy_move_and_assignment)
|
||||||
{
|
{
|
||||||
span<int> s1;
|
span<int> s1;
|
||||||
|
Loading…
Reference in New Issue
Block a user