// Copyright 2025 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #define BOOST_ENABLE_ASSERT_HANDLER #include #include #include struct assertion_failure { }; namespace boost { void assertion_failed( char const* /*expr*/, char const* /*function*/, char const* /*file*/, long /*line*/ ) { throw assertion_failure(); } void assertion_failed_msg( char const* /*expr*/, char const* /*msg*/, char const* /*function*/, char const* /*file*/, long /*line*/ ) { throw assertion_failure(); } } // namespace boost template void test() { { boost::array a = {{}}; T* p1 = a.data(); for( std::size_t i = 0; i < N; ++i ) { T* p2 = &a[ i ]; T* p3 = &a.at( i ); BOOST_TEST_EQ( p2, p1 + i ); BOOST_TEST_EQ( p3, p1 + i ); } { T* p2 = &a.front(); T* p3 = &a.back(); BOOST_TEST_EQ( p2, p1 + 0 ); BOOST_TEST_EQ( p3, p1 + N - 1 ); } BOOST_TEST_THROWS( a.at( N ), std::out_of_range ); BOOST_TEST_THROWS( a[ N ], assertion_failure ); } { boost::array const a = {{}}; T const* p1 = a.data(); for( std::size_t i = 0; i < N; ++i ) { T const* p2 = &a[ i ]; T const* p3 = &a.at( i ); BOOST_TEST_EQ( p2, p1 + i ); BOOST_TEST_EQ( p3, p1 + i ); } { T const* p2 = &a.front(); T const* p3 = &a.back(); BOOST_TEST_EQ( p2, p1 + 0 ); BOOST_TEST_EQ( p3, p1 + N - 1 ); } BOOST_TEST_THROWS( a.at( N ), std::out_of_range ); BOOST_TEST_THROWS( a[ N ], assertion_failure ); } } template void test2() { { boost::array a = {}; BOOST_TEST_THROWS( a.at( 0 ), std::out_of_range ); BOOST_TEST_THROWS( a[ 0 ], std::out_of_range ); BOOST_TEST_THROWS( a.front(), std::out_of_range ); BOOST_TEST_THROWS( a.back(), std::out_of_range ); } { boost::array const a = {}; BOOST_TEST_THROWS( a.at( 0 ), std::out_of_range ); BOOST_TEST_THROWS( a[ 0 ], std::out_of_range ); BOOST_TEST_THROWS( a.front(), std::out_of_range ); BOOST_TEST_THROWS( a.back(), std::out_of_range ); } } int main() { test(); test(); test(); test(); test2(); return boost::report_errors(); }