view: move alignment test for cast into the implementation
Moving the alignment test from SFINAE into the implementation as a static_assert means that users don't need to include the implementation for types where `cast` isn't called. Otherwise, iterator_traits requires a definition to work with.
This commit is contained in:
parent
c7689960be
commit
644cae506f
25
view.hpp
25
view.hpp
@ -434,20 +434,27 @@ namespace cruft {
|
|||||||
std::is_pointer_v<BeginT> &&
|
std::is_pointer_v<BeginT> &&
|
||||||
std::is_pointer_v<EndT> &&
|
std::is_pointer_v<EndT> &&
|
||||||
std::is_same_v<BeginT,EndT> &&
|
std::is_same_v<BeginT,EndT> &&
|
||||||
std::is_pointer_v<ValueT> &&
|
std::is_pointer_v<ValueT>
|
||||||
// The values they point to must allow for alignment in one
|
|
||||||
// direction or another.
|
|
||||||
(
|
|
||||||
sizeof (typename std::iterator_traits<BeginT>::value_type) %
|
|
||||||
sizeof (typename std::iterator_traits<ValueT>::value_type) == 0 ||
|
|
||||||
sizeof (typename std::iterator_traits<ValueT>::value_type) %
|
|
||||||
sizeof (typename std::iterator_traits<BeginT>::value_type) == 0
|
|
||||||
)
|
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
view<ValueT>
|
view<ValueT>
|
||||||
cast (void) const
|
cast (void) const
|
||||||
{
|
{
|
||||||
|
// The values they point to must allow for alignment in one
|
||||||
|
// direction or another.
|
||||||
|
//
|
||||||
|
// We prefer a static_assert over SFINAE because it reduces the
|
||||||
|
// header burden for users (they do not need to include the
|
||||||
|
// implementation of the pointer values to satisfy
|
||||||
|
// iterator_traits), and it is quite unlikely we want to disable
|
||||||
|
// this only if alignment is incompatible).
|
||||||
|
static_assert (
|
||||||
|
sizeof (typename std::iterator_traits<BeginT>::value_type) %
|
||||||
|
sizeof (typename std::iterator_traits<ValueT>::value_type) == 0 ||
|
||||||
|
sizeof (typename std::iterator_traits<ValueT>::value_type) %
|
||||||
|
sizeof (typename std::iterator_traits<BeginT>::value_type) == 0
|
||||||
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
cast::alignment<ValueT> (m_begin),
|
cast::alignment<ValueT> (m_begin),
|
||||||
cast::alignment<ValueT> (m_end)
|
cast::alignment<ValueT> (m_end)
|
||||||
|
Loading…
Reference in New Issue
Block a user