mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 04:50:34 -04:00 
			
		
		
		
	
		
			
	
	
		
			147 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			147 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | // Header file for the test of the circular buffer library.
 | ||
|  | 
 | ||
|  | // Copyright (c) 2003-2008 Jan Gaspar
 | ||
|  | 
 | ||
|  | // 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)
 | ||
|  | 
 | ||
|  | #if !defined(BOOST_CIRCULAR_BUFFER_TEST_HPP)
 | ||
|  | #define BOOST_CIRCULAR_BUFFER_TEST_HPP
 | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) && _MSC_VER >= 1200
 | ||
|  |     #pragma once
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define BOOST_CB_TEST
 | ||
|  | 
 | ||
|  | #include <boost/circular_buffer.hpp>
 | ||
|  | #include <boost/test/included/unit_test.hpp>
 | ||
|  | #include <boost/iterator.hpp>
 | ||
|  | #include <iterator>
 | ||
|  | #include <numeric>
 | ||
|  | #include <vector>
 | ||
|  | #if !defined(BOOST_NO_EXCEPTIONS)
 | ||
|  |     #include <exception>
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | // Integer (substitute for int) - more appropriate for testing
 | ||
|  | class MyInteger { | ||
|  | private: | ||
|  |     int* m_pValue; | ||
|  |     static int ms_exception_trigger; | ||
|  |     void check_exception() { | ||
|  |         if (ms_exception_trigger > 0) { | ||
|  |             if (--ms_exception_trigger == 0) { | ||
|  |                 delete m_pValue; | ||
|  |                 m_pValue = 0; | ||
|  | #if !defined(BOOST_NO_EXCEPTIONS)
 | ||
|  |                 throw std::exception(); | ||
|  | #endif
 | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | public: | ||
|  |     MyInteger() : m_pValue(new int(0)) { check_exception(); } | ||
|  |     MyInteger(int i) : m_pValue(new int(i)) { check_exception(); } | ||
|  |     MyInteger(const MyInteger& src) : m_pValue(new int(src)) { check_exception(); } | ||
|  |     ~MyInteger() { delete m_pValue; } | ||
|  |     MyInteger& operator = (const MyInteger& src) { | ||
|  |         if (this == &src) | ||
|  |             return *this; | ||
|  |         check_exception(); | ||
|  |         delete m_pValue; | ||
|  |         m_pValue = new int(src); | ||
|  |         return *this; | ||
|  |     } | ||
|  |     operator int () const { return *m_pValue; } | ||
|  |     static void set_exception_trigger(int n) { ms_exception_trigger = n; } | ||
|  | }; | ||
|  | 
 | ||
|  | // default constructible class
 | ||
|  | class MyDefaultConstructible | ||
|  | { | ||
|  | public: | ||
|  |     MyDefaultConstructible() : m_n(1) {} | ||
|  |     MyDefaultConstructible(int n) : m_n(n) {} | ||
|  |     int m_n; | ||
|  | }; | ||
|  | 
 | ||
|  | // class counting instances of self
 | ||
|  | class InstanceCounter { | ||
|  | public: | ||
|  |     InstanceCounter() { increment(); } | ||
|  |     InstanceCounter(const InstanceCounter& y) { y.increment(); } | ||
|  |     ~InstanceCounter() { decrement(); } | ||
|  |     static int count() { return ms_count; } | ||
|  | private: | ||
|  |     void increment() const { ++ms_count; } | ||
|  |     void decrement() const { --ms_count; } | ||
|  |     static int ms_count; | ||
|  | }; | ||
|  | 
 | ||
|  | // dummy class suitable for iterator referencing test
 | ||
|  | class Dummy { | ||
|  | public: | ||
|  |     enum DummyEnum { | ||
|  |         eVar, | ||
|  |         eFnc, | ||
|  |         eConst, | ||
|  |         eVirtual | ||
|  |     }; | ||
|  |     Dummy() : m_n(eVar) {} | ||
|  |     DummyEnum fnc() { return eFnc; } | ||
|  |     DummyEnum const_fnc() const { return eConst; } | ||
|  |     virtual DummyEnum virtual_fnc() { return eVirtual; } | ||
|  |     DummyEnum m_n; | ||
|  | }; | ||
|  | 
 | ||
|  | // simulator of an input iterator
 | ||
|  | struct MyInputIterator | ||
|  | : boost::iterator<std::input_iterator_tag, int, ptrdiff_t, int*, int&> { | ||
|  |     typedef std::vector<int>::iterator vector_iterator; | ||
|  |     typedef int value_type; | ||
|  |     typedef int* pointer; | ||
|  |     typedef int& reference; | ||
|  |     typedef size_t size_type; | ||
|  |     typedef ptrdiff_t difference_type; | ||
|  |     explicit MyInputIterator(const vector_iterator& it) : m_it(it) {} | ||
|  |     MyInputIterator& operator = (const MyInputIterator& it) { | ||
|  |         if (this == &it) | ||
|  |             return *this; | ||
|  |         m_it = it.m_it; | ||
|  |         return *this; | ||
|  |     } | ||
|  |     reference operator * () const { return *m_it; } | ||
|  |     pointer operator -> () const { return &(operator*()); } | ||
|  |     MyInputIterator& operator ++ () { | ||
|  |         ++m_it; | ||
|  |         return *this; | ||
|  |     } | ||
|  |     MyInputIterator operator ++ (int) { | ||
|  |         MyInputIterator tmp = *this; | ||
|  |         ++*this; | ||
|  |         return tmp; | ||
|  |     } | ||
|  |     bool operator == (const MyInputIterator& it) const { return m_it == it.m_it; } | ||
|  |     bool operator != (const MyInputIterator& it) const { return m_it != it.m_it; } | ||
|  | private: | ||
|  |     vector_iterator m_it; | ||
|  | }; | ||
|  | 
 | ||
|  | #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR)
 | ||
|  | 
 | ||
|  | inline std::input_iterator_tag iterator_category(const MyInputIterator&) { | ||
|  |     return std::input_iterator_tag(); | ||
|  | } | ||
|  | inline int* value_type(const MyInputIterator&) { return 0; } | ||
|  | inline ptrdiff_t* distance_type(const MyInputIterator&) { return 0; } | ||
|  | 
 | ||
|  | #endif // #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR)
 | ||
|  | 
 | ||
|  | using boost::unit_test::test_suite; | ||
|  | using namespace boost; | ||
|  | using namespace std; | ||
|  | 
 | ||
|  | #endif // #if !defined(BOOST_CIRCULAR_BUFFER_TEST_HPP)
 |