mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			201 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			4.7 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/detail/workaround.hpp>
 | 
						|
#include <boost/range/iterator_range_core.hpp>
 | 
						|
#include <boost/cstdint.hpp>
 | 
						|
 | 
						|
#include <boost/test/test_tools.hpp>
 | 
						|
#include <boost/test/unit_test.hpp>
 | 
						|
 | 
						|
#include <vector>
 | 
						|
 | 
						|
namespace boost_range_test
 | 
						|
{
 | 
						|
    namespace
 | 
						|
    {
 | 
						|
 | 
						|
class single_pass_iterator
 | 
						|
        : public boost::iterator_facade<
 | 
						|
            single_pass_iterator,
 | 
						|
            boost::int32_t,
 | 
						|
            boost::single_pass_traversal_tag,
 | 
						|
            const boost::int32_t&
 | 
						|
        >
 | 
						|
{
 | 
						|
    friend class boost::iterator_core_access;
 | 
						|
 | 
						|
    typedef std::vector<boost::int32_t>::const_iterator iterator_t;
 | 
						|
 | 
						|
public:
 | 
						|
    single_pass_iterator() { }
 | 
						|
 | 
						|
    explicit single_pass_iterator(iterator_t it)
 | 
						|
        : m_it(it)
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    void increment()
 | 
						|
    {
 | 
						|
        ++m_it;
 | 
						|
    }
 | 
						|
 | 
						|
    bool equal(single_pass_iterator other) const
 | 
						|
    {
 | 
						|
        return m_it == other.m_it;
 | 
						|
    }
 | 
						|
 | 
						|
    reference dereference() const
 | 
						|
    {
 | 
						|
        return *m_it;
 | 
						|
    }
 | 
						|
 | 
						|
    iterator_t m_it;
 | 
						|
};
 | 
						|
 | 
						|
class bidirectional_iterator
 | 
						|
        : public boost::iterator_facade<
 | 
						|
            bidirectional_iterator,
 | 
						|
            boost::int32_t,
 | 
						|
            boost::bidirectional_traversal_tag,
 | 
						|
            const boost::int32_t&
 | 
						|
        >
 | 
						|
{
 | 
						|
    friend class boost::iterator_core_access;
 | 
						|
 | 
						|
    typedef std::vector<boost::int32_t>::const_iterator iterator_t;
 | 
						|
 | 
						|
public:
 | 
						|
    bidirectional_iterator() { }
 | 
						|
 | 
						|
    explicit bidirectional_iterator(iterator_t it)
 | 
						|
        : m_it(it)
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    void increment()
 | 
						|
    {
 | 
						|
        ++m_it;
 | 
						|
    }
 | 
						|
 | 
						|
    void decrement()
 | 
						|
    {
 | 
						|
        --m_it;
 | 
						|
    }
 | 
						|
 | 
						|
    bool equal(bidirectional_iterator other) const
 | 
						|
    {
 | 
						|
        return m_it == other.m_it;
 | 
						|
    }
 | 
						|
 | 
						|
    reference dereference() const
 | 
						|
    {
 | 
						|
        return *m_it;
 | 
						|
    }
 | 
						|
 | 
						|
    iterator_t m_it;
 | 
						|
};
 | 
						|
 | 
						|
template<typename SinglePassRange>
 | 
						|
boost::iterator_range<single_pass_iterator>
 | 
						|
single_pass_range(const SinglePassRange& rng)
 | 
						|
{
 | 
						|
    return boost::iterator_range<single_pass_iterator>(
 | 
						|
                single_pass_iterator(boost::begin(rng)),
 | 
						|
                single_pass_iterator(boost::end(rng)));
 | 
						|
}
 | 
						|
 | 
						|
template<typename BidirectionalRange>
 | 
						|
boost::iterator_range<bidirectional_iterator>
 | 
						|
bidirectional_range(const BidirectionalRange& rng)
 | 
						|
{
 | 
						|
    return boost::iterator_range<bidirectional_iterator>(
 | 
						|
                bidirectional_iterator(boost::begin(rng)),
 | 
						|
                bidirectional_iterator(boost::end(rng)));
 | 
						|
}
 | 
						|
 | 
						|
void test_drop_front()
 | 
						|
{
 | 
						|
    std::vector<boost::int32_t> v;
 | 
						|
    std::vector<boost::int32_t> ref_output;
 | 
						|
 | 
						|
    for (boost::int32_t i = 0; i < 10; ++i)
 | 
						|
    {
 | 
						|
        v.push_back(i);
 | 
						|
        ref_output.push_back(i);
 | 
						|
    }
 | 
						|
 | 
						|
    boost::iterator_range<single_pass_iterator> rng = single_pass_range(v);
 | 
						|
 | 
						|
    BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
 | 
						|
                                  ref_output.begin(), ref_output.end());
 | 
						|
 | 
						|
    rng.drop_front();
 | 
						|
 | 
						|
    ref_output.erase(ref_output.begin());
 | 
						|
 | 
						|
    BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
 | 
						|
                                  ref_output.begin(), ref_output.end());
 | 
						|
 | 
						|
    rng.drop_front(5);
 | 
						|
 | 
						|
    ref_output.erase(ref_output.begin(), ref_output.begin() + 5);
 | 
						|
 | 
						|
    BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
 | 
						|
                                  ref_output.begin(), ref_output.end());
 | 
						|
}
 | 
						|
 | 
						|
void test_drop_back()
 | 
						|
{
 | 
						|
    std::vector<boost::int32_t> v;
 | 
						|
    std::vector<boost::int32_t> ref_output;
 | 
						|
 | 
						|
    for (boost::int32_t i = 0; i < 10; ++i)
 | 
						|
    {
 | 
						|
        v.push_back(i);
 | 
						|
        ref_output.push_back(i);
 | 
						|
    }
 | 
						|
 | 
						|
    boost::iterator_range<bidirectional_iterator> rng = bidirectional_range(v);
 | 
						|
 | 
						|
    BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
 | 
						|
                                  ref_output.begin(), ref_output.end());
 | 
						|
 | 
						|
    rng.drop_back();
 | 
						|
 | 
						|
    ref_output.pop_back();
 | 
						|
 | 
						|
    BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
 | 
						|
                                  ref_output.begin(), ref_output.end());
 | 
						|
 | 
						|
    rng.drop_back(5);
 | 
						|
 | 
						|
    ref_output.erase(ref_output.end() - 5, ref_output.end());
 | 
						|
 | 
						|
    BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(),
 | 
						|
                                  ref_output.begin(), ref_output.end());
 | 
						|
}
 | 
						|
 | 
						|
    } // anonymous namespace
 | 
						|
} // 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 iterator_range drop functions");
 | 
						|
 | 
						|
    test->add(BOOST_TEST_CASE(&boost_range_test::test_drop_front));
 | 
						|
    test->add(BOOST_TEST_CASE(&boost_range_test::test_drop_back));
 | 
						|
 | 
						|
    return test;
 | 
						|
}
 |