// Boost.Range library // // Copyright Thorsten Ottosen 2003-2004. Use, modification and // distribution is subject to the Boost Software License, Version // 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // For more information, see http://www.boost.org/libs/range/ // #include #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) # pragma warn -8091 // suppress warning in Boost.Test # pragma warn -8057 // unused argument argc/argv in Boost.Test #endif #include #include #include #include #include #include #include namespace boost_range_extension_size_test { class FooWithoutSize { typedef std::list impl_t; BOOST_STATIC_ASSERT(( boost::is_same< boost::range_size >::type, std::list::size_type >::value)); typedef impl_t::const_iterator const_iterator; typedef impl_t::iterator iterator; public: friend inline const_iterator range_begin(const FooWithoutSize& obj) { return obj.m_impl.begin(); } friend inline iterator range_begin(FooWithoutSize& obj) { return obj.m_impl.begin(); } friend inline const_iterator range_end(const FooWithoutSize& obj) { return obj.m_impl.end(); } friend inline iterator range_end(FooWithoutSize& obj){ return obj.m_impl.end(); } private: impl_t m_impl; }; template class FooWithSize { public: typedef SizeType size_type; typedef boost::uint8_t* iterator; typedef const boost::uint8_t* const_iterator; const_iterator begin() const; iterator begin(); const_iterator end() const; iterator end(); }; BOOST_STATIC_ASSERT(( boost::is_same< boost::uint8_t, boost::range_size >::type >::value )); BOOST_STATIC_ASSERT(( boost::is_same< boost::uint16_t, boost::range_size >::type >::value )); BOOST_STATIC_ASSERT(( boost::is_same< boost::uint32_t, boost::range_size >::type >::value )); BOOST_STATIC_ASSERT(( boost::is_same< boost::uint64_t, boost::range_size >::type >::value )); class UdtSizeType { public: typedef boost::uint16_t value_type; UdtSizeType() : value_(0) { } UdtSizeType(value_type value) : value_(value) { } operator value_type() const { return value_; } private: value_type value_; }; BOOST_STATIC_ASSERT(( boost::is_same< UdtSizeType, boost::range_size >::type >::value )); class Foo2WithoutSize { public: struct const_iterator { typedef std::forward_iterator_tag iterator_category; typedef boost::int8_t difference_type; typedef boost::int16_t value_type; typedef value_type* pointer; typedef value_type& reference; reference operator*() const; pointer operator->() const; const_iterator& operator++(); const_iterator operator++(int); bool operator==(const const_iterator&) const; bool operator!=(const const_iterator&) const; }; struct iterator : const_iterator { typedef const value_type* pointer; typedef const value_type& reference; reference operator*() const; pointer operator->() const; iterator& operator++(); iterator operator++(int); bool operator==(const iterator&) const; bool operator!=(const iterator&) const; }; const_iterator begin() const; iterator begin(); const_iterator end() const; iterator end(); }; BOOST_STATIC_ASSERT(( boost::is_same< boost::uint8_t, boost::range_size< ::boost_range_extension_size_test::Foo2WithoutSize>::type >::value )); } namespace boost { template<> struct range_iterator { typedef std::list::const_iterator type; }; template<> struct range_iterator< ::boost_range_extension_size_test::FooWithoutSize> { typedef std::list::iterator type; }; } namespace boost_range_extension_size_test { inline boost::range_size::type range_calculate_size(const FooWithoutSize& rng) { return 2u; } } BOOST_STATIC_ASSERT(( boost::is_same< boost::make_unsigned::type, boost::range_size< boost_range_extension_size_test::FooWithoutSize>::type >::value )); typedef boost::make_unsigned::type t1; typedef boost::range_size::type t1; namespace { void check_size_works_with_random_access() { std::vector container; container.push_back(1); BOOST_CHECK_EQUAL( boost::size(container), 1u ); } void check_extension_size() { BOOST_CHECK_EQUAL( boost::size(boost_range_extension_size_test::FooWithoutSize()), 2u ); } } // anonymous namespace using boost::unit_test::test_suite; test_suite* init_unit_test_suite( int argc, char* argv[] ) { test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); test->add( BOOST_TEST_CASE( &check_size_works_with_random_access )); test->add( BOOST_TEST_CASE( &check_extension_size ) ); return test; }