}
}
+// ctor: mapping(layout_{right,left}::mapping<OExtents>)
+namespace from_left_or_right
+{
+ template<typename SLayout, typename OLayout, typename SExtents,
+ typename OExtents>
+ constexpr void
+ verify_ctor(OExtents oexts)
+ {
+ using SMapping = typename SLayout::mapping<SExtents>;
+ using OMapping = typename OLayout::mapping<OExtents>;
+
+ constexpr bool expected = std::is_convertible_v<OExtents, SExtents>;
+ if constexpr (expected)
+ verify_nothrow_convertible<SMapping>(OMapping(oexts));
+ else
+ verify_nothrow_constructible<SMapping>(OMapping(oexts));
+ }
+
+ template<typename SLayout, typename OLayout>
+ constexpr bool
+ test_ctor()
+ {
+ assert_not_constructible<
+ typename SLayout::mapping<std::extents<int>>,
+ typename OLayout::mapping<std::extents<int, 1>>>();
+
+ verify_ctor<OLayout, SLayout, std::extents<int>>(
+ std::extents<unsigned int>{});
+
+ verify_ctor<OLayout, SLayout, std::extents<unsigned int>>(
+ std::extents<int>{});
+
+ assert_not_constructible<
+ typename SLayout::mapping<std::extents<int, 1>>,
+ typename OLayout::mapping<std::extents<int>>>();
+
+ verify_ctor<OLayout, SLayout, std::extents<int, 1>>(
+ std::extents<int, 1>{});
+
+ verify_ctor<OLayout, SLayout, std::extents<int, 1>>(
+ std::extents<unsigned int, 1>{});
+
+ verify_ctor<OLayout, SLayout, std::extents<unsigned int, 1>>(
+ std::extents<int, 1>{});
+
+ assert_not_constructible<
+ typename SLayout::mapping<std::extents<int, 1, 2>>,
+ typename OLayout::mapping<std::extents<int, 1, 2>>>();
+ return true;
+ }
+
+ template<typename SLayout, typename OLayout>
+ constexpr void
+ test_all()
+ {
+ test_ctor<SLayout, OLayout>();
+ static_assert(test_ctor<SLayout, OLayout>());
+ }
+}
+
template<typename Layout>
constexpr void
test_all()
main()
{
test_all<std::layout_left>();
+ test_all<std::layout_right>();
+
+ from_left_or_right::test_all<std::layout_left, std::layout_right>();
+ from_left_or_right::test_all<std::layout_right, std::layout_left>();
return 0;
}
VERIFY(m.stride(1) == 3);
}
+template<>
+ constexpr void
+ test_stride_2d<std::layout_right>()
+ {
+ std::layout_right::mapping<std::extents<int, 3, 5>> m;
+ VERIFY(m.stride(0) == 5);
+ VERIFY(m.stride(1) == 1);
+ }
+
template<typename Layout>
constexpr void
test_stride_3d();
VERIFY(m.stride(2) == 3*5);
}
+template<>
+ constexpr void
+ test_stride_3d<std::layout_right>()
+ {
+ std::layout_right::mapping m(std::dextents<int, 3>(3, 5, 7));
+ VERIFY(m.stride(0) == 5*7);
+ VERIFY(m.stride(1) == 7);
+ VERIFY(m.stride(2) == 1);
+ }
+
template<typename Layout>
constexpr bool
test_stride_all()
{ m2 != m1 } -> std::same_as<bool>;
};
-template<typename Layout>
- constexpr bool
+template<typename SLayout, typename OLayout, bool Expected>
+ constexpr void
test_has_op_eq()
{
+ static_assert(has_op_eq<
+ typename SLayout::mapping<std::extents<int>>,
+ typename OLayout::mapping<std::extents<int>>> == Expected);
+
static_assert(!has_op_eq<
- typename Layout::mapping<std::extents<int, 1, 2>>,
- typename Layout::mapping<std::extents<int, 1>>>);
+ typename SLayout::mapping<std::extents<int>>,
+ typename OLayout::mapping<std::extents<int, 1>>>);
static_assert(has_op_eq<
- typename Layout::mapping<std::extents<int, 1>>,
- typename Layout::mapping<std::extents<int, 1>>>);
+ typename SLayout::mapping<std::extents<int, 1>>,
+ typename OLayout::mapping<std::extents<int, 1>>> == Expected);
static_assert(has_op_eq<
- typename Layout::mapping<std::extents<int, 1>>,
- typename Layout::mapping<std::extents<int, 2>>>);
- return true;
+ typename SLayout::mapping<std::extents<int, 1>>,
+ typename OLayout::mapping<std::extents<int, 2>>> == Expected);
+
+ static_assert(!has_op_eq<
+ typename SLayout::mapping<std::extents<int, 1>>,
+ typename OLayout::mapping<std::extents<int, 1, 2>>>);
+
+ static_assert(has_op_eq<
+ typename SLayout::mapping<std::extents<int, 1, 2>>,
+ typename OLayout::mapping<std::extents<int, 1, 2>>> == Expected);
+
+ static_assert(has_op_eq<
+ typename SLayout::mapping<std::extents<int, 1, 2>>,
+ typename OLayout::mapping<std::extents<int, 2, 2>>> == Expected);
+
+ static_assert(!has_op_eq<
+ typename SLayout::mapping<std::extents<int, 1, 2>>,
+ typename OLayout::mapping<std::extents<int, 1, 2, 3>>>);
}
+constexpr void
+test_has_op_eq_peculiar()
+{
+ static_assert(has_op_eq<
+ std::layout_right::mapping<std::extents<int>>,
+ std::layout_left::mapping<std::extents<unsigned int>>>);
+
+ static_assert(has_op_eq<
+ std::layout_right::mapping<std::extents<int, 1>>,
+ std::layout_left::mapping<std::extents<int, dyn>>>);
+
+ static_assert(!has_op_eq<
+ std::layout_right::mapping<std::extents<int, 1, 2>>,
+ std::layout_left::mapping<std::extents<int, dyn, 2>>>);
+}
+
template<typename Layout>
constexpr bool
test_mapping_all()
test_has_stride_0d<Layout>();
test_has_stride_1d<Layout>();
test_has_stride_2d<Layout>();
- test_has_op_eq<Layout>();
+ test_has_op_eq<Layout, Layout, true>();
}
int
main()
{
test_all<std::layout_left>();
+ test_all<std::layout_right>();
+
+ test_has_op_eq<std::layout_right, std::layout_left, false>();
+ test_has_op_eq_peculiar();
return 0;
}