diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index a3dd7e3..0d629fb 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -37,6 +37,7 @@ run array_data_test.cpp ; run array_iterator_test.cpp ; run array_reverse_test.cpp ; run array_size_test.cpp ; +run array_access_test.cpp ; # diff --git a/test/array_access_test.cpp b/test/array_access_test.cpp new file mode 100644 index 0000000..44be92e --- /dev/null +++ b/test/array_access_test.cpp @@ -0,0 +1,117 @@ +// 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(); +}