mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Boost.Range library
 | 
						|
//
 | 
						|
//  Copyright Neil Groves 2014. 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 <boost/range/iterator.hpp>
 | 
						|
#include <boost/static_assert.hpp>
 | 
						|
#include <boost/type_traits/is_same.hpp>
 | 
						|
#include <boost/type_traits/is_base_of.hpp>
 | 
						|
#include <boost/type_traits/decay.hpp>
 | 
						|
 | 
						|
#include <boost/test/test_tools.hpp>
 | 
						|
#include <boost/test/unit_test.hpp>
 | 
						|
 | 
						|
#include <vector>
 | 
						|
 | 
						|
namespace boost_range_test
 | 
						|
{
 | 
						|
 | 
						|
struct point
 | 
						|
{
 | 
						|
    int x;
 | 
						|
    int y;
 | 
						|
};
 | 
						|
 | 
						|
class shape
 | 
						|
{
 | 
						|
public:
 | 
						|
    virtual ~shape()
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
    const std::vector<point>& points() const
 | 
						|
    {
 | 
						|
        return m_points;
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    std::vector<point> m_points;
 | 
						|
};
 | 
						|
 | 
						|
class rectangle : public shape
 | 
						|
{
 | 
						|
};
 | 
						|
 | 
						|
class circle : public shape
 | 
						|
{
 | 
						|
};
 | 
						|
 | 
						|
class container
 | 
						|
{
 | 
						|
    typedef std::vector<point> impl_t;
 | 
						|
};
 | 
						|
 | 
						|
} // namespace boost_range_test
 | 
						|
 | 
						|
namespace boost
 | 
						|
{
 | 
						|
    template<typename T>
 | 
						|
    struct range_mutable_iterator<
 | 
						|
            T,
 | 
						|
            typename boost::enable_if<
 | 
						|
                boost::is_base_of<
 | 
						|
                    boost_range_test::shape,
 | 
						|
                    typename boost::remove_reference<
 | 
						|
                        typename boost::remove_cv<T>::type
 | 
						|
                    >::type
 | 
						|
                >
 | 
						|
            >::type
 | 
						|
        >
 | 
						|
    {
 | 
						|
        typedef std::vector<boost_range_test::point>::iterator type;
 | 
						|
    };
 | 
						|
 | 
						|
    template<typename T>
 | 
						|
    struct range_const_iterator<
 | 
						|
            T,
 | 
						|
            typename boost::enable_if<
 | 
						|
                boost::is_base_of<
 | 
						|
                    boost_range_test::shape,
 | 
						|
                    typename boost::remove_reference<
 | 
						|
                        typename boost::remove_cv<T>::type
 | 
						|
                    >::type
 | 
						|
                >
 | 
						|
            >::type
 | 
						|
        >
 | 
						|
    {
 | 
						|
        typedef std::vector<boost_range_test::point>::const_iterator type;
 | 
						|
    };
 | 
						|
 | 
						|
    template<>
 | 
						|
    struct range_mutable_iterator<boost_range_test::container>
 | 
						|
    {
 | 
						|
        typedef std::vector<boost_range_test::point>::iterator type;
 | 
						|
    };
 | 
						|
 | 
						|
    template<>
 | 
						|
    struct range_const_iterator<boost_range_test::container>
 | 
						|
    {
 | 
						|
        typedef std::vector<boost_range_test::point>::const_iterator type;
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
namespace boost_range_test
 | 
						|
{
 | 
						|
    template<typename Shape>
 | 
						|
    void test_iterator_impl()
 | 
						|
    {
 | 
						|
        BOOST_STATIC_ASSERT((
 | 
						|
            boost::is_same<
 | 
						|
                std::vector<point>::iterator,
 | 
						|
                typename boost::range_iterator<Shape>::type
 | 
						|
            >::value));
 | 
						|
 | 
						|
        BOOST_STATIC_ASSERT((
 | 
						|
            boost::is_same<
 | 
						|
                std::vector<point>::const_iterator,
 | 
						|
                typename boost::range_iterator<const Shape>::type
 | 
						|
            >::value));
 | 
						|
 | 
						|
    #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
        BOOST_STATIC_ASSERT((
 | 
						|
            boost::is_same<
 | 
						|
                std::vector<point>::iterator,
 | 
						|
                typename boost::range_iterator<Shape&&>::type
 | 
						|
            >::value));
 | 
						|
    #endif
 | 
						|
    }
 | 
						|
 | 
						|
    void test_iterator()
 | 
						|
    {
 | 
						|
        test_iterator_impl<shape>();
 | 
						|
        test_iterator_impl<rectangle>();
 | 
						|
        test_iterator_impl<circle>();
 | 
						|
 | 
						|
        test_iterator_impl<container>();
 | 
						|
    }
 | 
						|
} // namespace boost_range_test
 | 
						|
 | 
						|
boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] )
 | 
						|
{
 | 
						|
    boost::unit_test::test_suite* test =
 | 
						|
        BOOST_TEST_SUITE("Boost.Range range_iterator meta-function");
 | 
						|
 | 
						|
    test->add(BOOST_TEST_CASE(&boost_range_test::test_iterator));
 | 
						|
 | 
						|
    return test;
 | 
						|
}
 |