/* Copyright 2019-2023 Glen Joseph Fernandes (glenjofe@gmail.com) Distributed under the Boost Software License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) */ #include #if !defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CXX11_DECLTYPE) #include #include template class range { public: T* data() { return &v_[0]; } std::size_t size() const { return 4; } private: T v_[4]; }; void test_extent() { BOOST_TEST_EQ(boost::span::extent, boost::dynamic_extent); BOOST_TEST_EQ((boost::span::extent), 2); } void test_default_construct_dynamic() { boost::span s; BOOST_TEST_EQ(s.data(), static_cast(0)); BOOST_TEST_EQ(s.size(), 0); } void test_default_construct_static() { boost::span s; BOOST_TEST_EQ(s.data(), static_cast(0)); BOOST_TEST_EQ(s.size(), 0); } void test_construct_data_size() { int a[4]; boost::span s(&a[0], 4); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 4); } void test_construct_first_last() { int a[4]; boost::span s(&a[0], &a[4]); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 4); } void test_construct_array_dynamic() { int a[4]; boost::span s(a); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 4); } void test_construct_array_static() { int a[4]; boost::span s(a); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 4); } void test_construct_std_array_dynamic() { std::array a; boost::span s(a); BOOST_TEST_EQ(s.data(), a.data()); BOOST_TEST_EQ(s.size(), a.size()); } void test_construct_std_array_static() { std::array a; boost::span s(a); BOOST_TEST_EQ(s.data(), a.data()); BOOST_TEST_EQ(s.size(), a.size()); } void test_construct_const_std_array_dynamic() { const std::array a = std::array(); boost::span s(a); BOOST_TEST_EQ(s.data(), a.data()); BOOST_TEST_EQ(s.size(), a.size()); } void test_construct_const_std_array_static() { const std::array a = std::array(); boost::span s(a); BOOST_TEST_EQ(s.data(), a.data()); BOOST_TEST_EQ(s.size(), a.size()); } void test_construct_range() { range c; boost::span s(c); BOOST_TEST_EQ(s.data(), c.data()); BOOST_TEST_EQ(s.size(), c.size()); } void test_construct_initializer_list() { std::initializer_list l{1, 2}; boost::span s(l); BOOST_TEST_EQ(s.data(), l.begin()); BOOST_TEST_EQ(s.size(), l.size()); } void test_construct_span_dynamic() { int a[4]; boost::span s(boost::span(&a[0], 4)); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 4); } void test_construct_span_dynamic_static() { int a[4]; boost::span s(boost::span(&a[0], 4)); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 4); } void test_construct_span_static() { int a[4]; boost::span s(boost::span(&a[0], 4)); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 4); } void test_construct_span_static_dynamic() { int a[4]; boost::span s(boost::span(&a[0], 4)); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 4); } void test_copy_dynamic() { int a[4]; boost::span s1(&a[0], 4); boost::span s2(s1); BOOST_TEST_EQ(s2.data(), &a[0]); BOOST_TEST_EQ(s2.size(), 4); } void test_copy_static() { int a[4]; boost::span s1(&a[0], 4); boost::span s2(s1); BOOST_TEST_EQ(s2.data(), &a[0]); BOOST_TEST_EQ(s2.size(), 4); } void test_assign_dynamic() { boost::span s; int a[4]; s = boost::span(&a[0], 4); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 4); } void test_assign_static() { int a1[4]; boost::span s(&a1[0], 4); int a2[4]; s = boost::span(&a2[0], 4); BOOST_TEST_EQ(s.data(), &a2[0]); BOOST_TEST_EQ(s.size(), 4); } void test_first() { int a[4]; boost::span s = boost::span(&a[0], 4).first<2>(); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 2); } void test_last() { int a[4]; boost::span s = boost::span(&a[0], 4).last<2>(); BOOST_TEST_EQ(s.data(), &a[2]); BOOST_TEST_EQ(s.size(), 2); } void test_subspan_dynamic() { int a[4]; boost::span s = boost::span(&a[0], 4).subspan<2>(); BOOST_TEST_EQ(s.data(), &a[2]); BOOST_TEST_EQ(s.size(), 2); } void test_subspan_static() { int a[4]; boost::span s = boost::span(&a[0], 4).subspan<2>(); BOOST_TEST_EQ(s.data(), &a[2]); BOOST_TEST_EQ(s.size(), 2); } void test_subspan() { int a[4]; boost::span s = boost::span(&a[0], 4).subspan<2, 1>(); BOOST_TEST_EQ(s.data(), &a[2]); BOOST_TEST_EQ(s.size(), 1); } void test_first_size() { int a[4]; boost::span s = boost::span(&a[0], 4).first(2); BOOST_TEST_EQ(s.data(), &a[0]); BOOST_TEST_EQ(s.size(), 2); } void test_last_size() { int a[4]; boost::span s = boost::span(&a[0], 4).last(2); BOOST_TEST_EQ(s.data(), &a[2]); BOOST_TEST_EQ(s.size(), 2); } void test_subspan_range() { int a[4]; boost::span s = boost::span(&a[0], 4).subspan(2); BOOST_TEST_EQ(s.data(), &a[2]); BOOST_TEST_EQ(s.size(), 2); } void test_subspan_range_count() { int a[4]; boost::span s = boost::span(&a[0], 4).subspan(2, 1); BOOST_TEST_EQ(s.data(), &a[2]); BOOST_TEST_EQ(s.size(), 1); } void test_size() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).size()), 4); } void test_size_bytes() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).size_bytes()), 4 * sizeof(int)); } void test_empty_dynamic() { int a[4]; BOOST_TEST(boost::span().empty()); BOOST_TEST_NOT((boost::span(&a[0], 4).empty())); } void test_empty_static() { int a[4]; BOOST_TEST((boost::span().empty())); BOOST_TEST_NOT((boost::span(&a[0], 4).empty())); } void test_index() { int a[4] = { 1, 2, 3, 4 }; BOOST_TEST_EQ((boost::span(&a[0], 4)[2]), 3); } void test_front() { int a[4] = { 1, 2, 3, 4 }; BOOST_TEST_EQ((boost::span(&a[0], 4).front()), 1); } void test_back() { int a[4] = { 1, 2, 3, 4 }; BOOST_TEST_EQ((boost::span(&a[0], 4).back()), 4); } void test_data() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).data()), &a[0]); } void test_begin() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).begin()), &a[0]); } void test_end() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).end()), &a[4]); } void test_rbegin() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).rbegin().base()), &a[4]); } void test_rend() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).rend().base()), &a[0]); } void test_cbegin() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).cbegin()), &a[0]); } void test_cend() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).cend()), &a[4]); } void test_crbegin() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).crbegin().base()), &a[4]); } void test_crend() { int a[4]; BOOST_TEST_EQ((boost::span(&a[0], 4).crend().base()), &a[0]); } int main() { test_extent(); test_default_construct_dynamic(); test_default_construct_static(); test_construct_data_size(); test_construct_first_last(); test_construct_array_dynamic(); test_construct_array_static(); test_construct_std_array_dynamic(); test_construct_std_array_static(); test_construct_const_std_array_dynamic(); test_construct_const_std_array_static(); test_construct_range(); test_construct_initializer_list(); test_construct_span_dynamic(); test_construct_span_dynamic_static(); test_construct_span_static(); test_construct_span_static_dynamic(); test_copy_dynamic(); test_copy_static(); test_assign_dynamic(); test_assign_static(); test_first(); test_last(); test_subspan_dynamic(); test_subspan_static(); test_subspan(); test_first_size(); test_last_size(); test_subspan_range(); test_subspan_range_count(); test_size(); test_size_bytes(); test_empty_dynamic(); test_empty_static(); test_index(); test_front(); test_back(); test_data(); test_begin(); test_end(); test_rbegin(); test_rend(); test_cbegin(); test_cend(); test_crbegin(); test_crend(); return boost::report_errors(); } #else int main() { return 0; } #endif