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)
8 // For more information, see http://www.boost.org/libs/range/
12 #include <boost/detail/workaround.hpp>
14 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
15 # pragma warn -8091 // suppress warning in Boost.Test
16 # pragma warn -8057 // unused argument argc/argv in Boost.Test
19 #include <boost/range/sub_range.hpp>
20 #include <boost/range/as_literal.hpp>
21 #include <boost/test/unit_test.hpp>
22 #include <boost/test/test_tools.hpp>
27 namespace boost_range_test
32 void check_sub_range()
35 typedef std::string::iterator iterator;
36 typedef std::string::const_iterator const_iterator;
37 typedef boost::iterator_range<iterator> irange;
38 typedef boost::iterator_range<const_iterator> cirange;
39 std::string str = "hello world";
40 const std::string cstr = "const world";
41 irange r = boost::make_iterator_range( str );
42 r = boost::make_iterator_range( str.begin(), str.end() );
43 cirange r2 = boost::make_iterator_range( cstr );
44 r2 = boost::make_iterator_range( cstr.begin(), cstr.end() );
45 r2 = boost::make_iterator_range( str );
47 typedef boost::sub_range<std::string> srange;
48 typedef boost::sub_range<const std::string> csrange;
50 BOOST_CHECK( r == r );
51 BOOST_CHECK( s == r );
52 s = boost::make_iterator_range( str );
55 s2 = boost::make_iterator_range( cstr );
56 BOOST_CHECK( r2 == r2 );
57 BOOST_CHECK( s2 != r2 );
58 s2 = boost::make_iterator_range( str );
59 BOOST_CHECK( !(s != s) );
61 BOOST_CHECK( r.begin() == s.begin() );
62 BOOST_CHECK( r2.begin()== s2.begin() );
63 BOOST_CHECK( r.end() == s.end() );
64 BOOST_CHECK( r2.end() == s2.end() );
65 BOOST_CHECK_EQUAL( r.size(), s.size() );
66 BOOST_CHECK_EQUAL( r2.size(), s2.size() );
68 //#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
70 // BOOST_CHECK( false );
72 // BOOST_CHECK( false );
74 // BOOST_CHECK( false );
76 // BOOST_CHECK( false );
88 std::cout << r << r2 << s << s2;
90 std::string res = boost::copy_range<std::string>( r );
91 BOOST_CHECK_EQUAL_COLLECTIONS( res.begin(), res.end(), r.begin(), r.end() );
99 // As of range v2 not legal anymore.
101 //irange singular_irange;
102 //BOOST_CHECK( singular_irange.empty() );
103 //BOOST_CHECK( singular_irange.size() == 0 );
105 //srange singular_srange;
106 //BOOST_CHECK( singular_srange.empty() );
107 //BOOST_CHECK( singular_srange.size() == 0 );
109 //BOOST_CHECK( empty( singular_irange ) );
110 //BOOST_CHECK( empty( singular_srange ) );
113 srange rr = boost::make_iterator_range( str );
114 BOOST_CHECK( rr.equal( r ) );
116 rr = boost::make_iterator_range( str.begin(), str.begin() + 5 );
117 BOOST_CHECK( rr == boost::as_literal("hello") );
118 BOOST_CHECK( rr != boost::as_literal("hell") );
119 BOOST_CHECK( rr < boost::as_literal("hello dude") );
120 BOOST_CHECK( boost::as_literal("hello") == rr );
121 BOOST_CHECK( boost::as_literal("hell") != rr );
122 BOOST_CHECK( ! (boost::as_literal("hello dude") < rr ) );
125 BOOST_CHECK( rrr == rr );
126 BOOST_CHECK( !( rrr != rr ) );
127 BOOST_CHECK( !( rrr < rr ) );
129 const irange cr = boost::make_iterator_range( str );
130 BOOST_CHECK_EQUAL( cr.front(), 'h' );
131 BOOST_CHECK_EQUAL( cr.back(), 'd' );
132 BOOST_CHECK_EQUAL( cr[1], 'e' );
133 BOOST_CHECK_EQUAL( cr(1), 'e' );
135 rrr = boost::make_iterator_range( str, 1, -1 );
136 BOOST_CHECK( rrr == boost::as_literal("ello worl") );
137 rrr = boost::make_iterator_range( rrr, -1, 1 );
138 BOOST_CHECK( rrr == str );
142 BOOST_CHECK( rrr == boost::as_literal("HEllo worlD") );
146 void check_mutable_type(T&)
148 BOOST_STATIC_ASSERT(!boost::is_const<T>::value);
152 void check_constant_type(T&)
154 BOOST_STATIC_ASSERT(boost::is_const<T>::value);
157 template<class Range, class Iterator>
158 void check_is_const_iterator(Iterator it)
160 BOOST_STATIC_ASSERT((
162 BOOST_DEDUCED_TYPENAME boost::range_iterator<
163 BOOST_DEDUCED_TYPENAME boost::add_const<Range>::type
169 template<class Range, class Iterator>
170 void check_is_iterator(Iterator it)
172 BOOST_STATIC_ASSERT((
174 BOOST_DEDUCED_TYPENAME boost::range_iterator<
175 BOOST_DEDUCED_TYPENAME boost::remove_const<Range>::type
181 void const_propagation_mutable_collection(void)
183 typedef std::vector<int> coll_t;
184 typedef boost::sub_range<coll_t> sub_range_t;
190 const sub_range_t crng(c);
192 check_is_iterator<sub_range_t>(rng.begin());
193 check_is_iterator<sub_range_t>(rng.end());
195 check_is_const_iterator<sub_range_t>(crng.begin());
196 check_is_const_iterator<sub_range_t>(crng.end());
198 check_mutable_type(rng[0]);
199 check_mutable_type(rng.front());
200 check_mutable_type(rng.back());
201 check_constant_type(crng[0]);
202 check_constant_type(crng.front());
203 check_constant_type(crng.back());
206 void const_propagation_const_collection(void)
208 typedef std::vector<int> coll_t;
209 typedef boost::sub_range<const coll_t> sub_range_t;
215 const sub_range_t crng(c);
217 check_is_const_iterator<sub_range_t>(rng.begin());
218 check_is_const_iterator<sub_range_t>(rng.end());
220 check_is_const_iterator<sub_range_t>(crng.begin());
221 check_is_const_iterator<sub_range_t>(crng.end());
223 check_constant_type(rng[0]);
224 check_constant_type(rng.front());
225 check_constant_type(rng.back());
226 check_constant_type(crng[0]);
227 check_constant_type(crng.front());
228 check_constant_type(crng.back());
231 inline void test_advance()
236 typedef boost::sub_range<std::vector<int> > rng_t;
237 rng_t r1(l.begin(), l.end());
238 BOOST_CHECK(r1.advance_begin(1).advance_end(-1).empty());
240 rng_t r2(l.begin(), l.end());
241 BOOST_CHECK_EQUAL(r2.advance_begin(1).size(), 1u);
243 rng_t r3(l.begin(), l.end());
244 BOOST_CHECK_EQUAL(r3.advance_end(-1).size(), 1u);
247 } // anonymous namespace
248 } // namespace boost_range_test
250 boost::unit_test::test_suite* init_unit_test_suite(int, char*[])
252 boost::unit_test::test_suite* test =
253 BOOST_TEST_SUITE( "Boost.Range sub_range test suite" );
255 test->add(BOOST_TEST_CASE(&boost_range_test::check_sub_range));
257 test->add(BOOST_TEST_CASE(
258 &boost_range_test::const_propagation_const_collection));
260 test->add(BOOST_TEST_CASE(
261 &boost_range_test::const_propagation_mutable_collection));
263 test->add(BOOST_TEST_CASE(&boost_range_test::test_advance));