]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Boost.Range library |
2 | // | |
3 | // Copyright Thorsten Ottosen 2003-2004. Use, modification and | |
4 | // distribution is subject to the Boost Software License, Version | |
5 | // 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
6 | // http://www.boost.org/LICENSE_1_0.txt) | |
7 | // | |
8 | // For more information, see http://www.boost.org/libs/range/ | |
9 | // | |
10 | ||
11 | #include <boost/detail/workaround.hpp> | |
12 | ||
13 | #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) | |
14 | # pragma warn -8091 // suppress warning in Boost.Test | |
15 | # pragma warn -8057 // unused argument argc/argv in Boost.Test | |
16 | #endif | |
17 | ||
18 | #include <boost/range/concepts.hpp> | |
19 | #include <boost/range/functions.hpp> | |
20 | #include <boost/range/metafunctions.hpp> | |
21 | #include <boost/static_assert.hpp> | |
22 | #include <boost/type_traits.hpp> | |
23 | #include <boost/test/test_tools.hpp> | |
24 | #include <vector> | |
25 | ||
26 | void check_iterator_pair() | |
27 | { | |
28 | typedef std::vector<int> vec_t; | |
29 | vec_t vec; | |
30 | vec.push_back( 4 ); | |
31 | typedef std::pair<vec_t::iterator,vec_t::iterator> | |
32 | pair_t; | |
33 | typedef std::pair<vec_t::const_iterator,vec_t::const_iterator> | |
34 | const_pair_t; | |
35 | typedef const pair_t const_pair_tt; | |
36 | pair_t pair = std::make_pair( boost::begin( vec ), boost::end( vec ) ); | |
37 | const_pair_t const_pair = std::make_pair( boost::begin( vec ), boost::end( vec ) ); | |
38 | const_pair_tt constness_pair( pair ); | |
39 | ||
40 | ||
41 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_value<pair_t>::type, | |
42 | boost::detail::iterator_traits<pair_t::first_type>::value_type>::value )); | |
43 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator<pair_t>::type, pair_t::first_type >::value )); | |
44 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_const_iterator<pair_t>::type, pair_t::first_type >::value )); | |
45 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_difference<pair_t>::type, | |
46 | boost::detail::iterator_traits<pair_t::first_type>::difference_type >::value )); | |
47 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_size<pair_t>::type, std::size_t >::value )); | |
48 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator<pair_t>::type, pair_t::first_type >::value )); | |
49 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator<const_pair_t>::type, const_pair_t::first_type >::value )); | |
50 | ||
51 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_value<const_pair_tt>::type, | |
52 | boost::detail::iterator_traits<const_pair_t::first_type>::value_type>::value )); | |
53 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value )); | |
54 | // | |
55 | // This behavior is not supported with v2. | |
56 | //BOOST_STATIC_ASSERT(( is_same< range_const_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value )); | |
57 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_difference<const_pair_tt>::type, | |
58 | boost::detail::iterator_traits<const_pair_tt::first_type>::difference_type >::value )); | |
59 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_size<const_pair_tt>::type, std::size_t >::value )); | |
60 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value )); | |
61 | BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value )); | |
62 | ||
63 | BOOST_CHECK( boost::begin( pair ) == pair.first ); | |
64 | BOOST_CHECK( boost::end( pair ) == pair.second ); | |
65 | BOOST_CHECK( boost::empty( pair ) == (pair.first == pair.second) ); | |
66 | BOOST_CHECK( boost::size( pair ) == | |
67 | static_cast<std::size_t>( | |
68 | std::distance(pair.first, pair.second)) ); | |
69 | ||
70 | BOOST_CHECK( boost::begin( const_pair ) == const_pair.first ); | |
71 | BOOST_CHECK( boost::end( const_pair ) == const_pair.second ); | |
72 | BOOST_CHECK( boost::empty( const_pair ) == (const_pair.first == const_pair.second) ); | |
73 | BOOST_CHECK( boost::size( const_pair ) == | |
74 | static_cast<std::size_t>( | |
75 | std::distance(const_pair.first, const_pair.second)) ); | |
76 | ||
77 | BOOST_CHECK( boost::begin( constness_pair ) == constness_pair.first ); | |
78 | BOOST_CHECK( boost::end( constness_pair ) == constness_pair.second ); | |
79 | BOOST_CHECK( boost::empty( constness_pair ) == (constness_pair.first == const_pair.second) ); | |
80 | BOOST_CHECK( boost::size( constness_pair ) == | |
81 | static_cast<std::size_t>( | |
82 | std::distance(constness_pair.first, | |
83 | constness_pair.second)) ); | |
84 | } | |
85 | ||
86 | ||
87 | #include <boost/test/unit_test.hpp> | |
88 | ||
89 | boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) | |
90 | { | |
91 | boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); | |
92 | ||
93 | test->add( BOOST_TEST_CASE( &check_iterator_pair ) ); | |
94 | ||
95 | return test; | |
96 | } | |
97 | ||
98 | ||
99 | ||
100 | ||
101 | ||
102 |