mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
	
	
		
			116 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								[/
							 | 
						||
| 
								 | 
							
								    Copyright 2010 Neil Groves
							 | 
						||
| 
								 | 
							
								    Distributed under 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)
							 | 
						||
| 
								 | 
							
								/]
							 | 
						||
| 
								 | 
							
								[section:any_range any_range]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[heading Description]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`any_range` is a range that has the type information erased hence a `any_range<int, boost::forward_traversal_tag, int, std::ptrdiff_t>`
							 | 
						||
| 
								 | 
							
								can be used to represent a `std::vector<int>`, a `std::list<int>` or many other types.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The __type_erasure_article__ covers the motivation and goals of type erasure in this context. Clearly
							 | 
						||
| 
								 | 
							
								my implementation is building upon a lot of prior art created by others. Thomas Becker's `any_iterator` was a strong
							 | 
						||
| 
								 | 
							
								influence. Adobe also have an `any_iterator` implementation, but this has very tight coupling to other parts of the
							 | 
						||
| 
								 | 
							
								library that precluded it from use in Boost.Range.
							 | 
						||
| 
								 | 
							
								Early development versions of this Range Adaptor directly used Thomas Becker's any_iterator implementation.
							 | 
						||
| 
								 | 
							
								Subsequently I discovered that the heap allocations of this and many other implementations cause poor
							 | 
						||
| 
								 | 
							
								speed performance particularly at the tails of the distribution. To solve this required a new design that
							 | 
						||
| 
								 | 
							
								incorporated the embedded buffer optimization.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Despite the underlying `any_iterator` being the fastest available implementation, the performance overhead of `any_range` is still appreciable due to the cost of virtual function calls required to implement `increment`, `decrement`, `advance`, `equal` etc. Frequently a better design choice is to convert to a canonical form.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Please see the __range_adaptors_type_erased__ for a Range Adaptor that returns `any_range` instances.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[heading Synopsis]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								``
							 | 
						||
| 
								 | 
							
								template<
							 | 
						||
| 
								 | 
							
								    class Value
							 | 
						||
| 
								 | 
							
								  , class Traversal
							 | 
						||
| 
								 | 
							
								  , class Reference
							 | 
						||
| 
								 | 
							
								  , class Difference
							 | 
						||
| 
								 | 
							
								  , class Buffer = any_iterator_default_buffer
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class any_range
							 | 
						||
| 
								 | 
							
								    : public iterator_range<
							 | 
						||
| 
								 | 
							
								        range_detail::any_iterator<
							 | 
						||
| 
								 | 
							
								            Value
							 | 
						||
| 
								 | 
							
								          , Traversal
							 | 
						||
| 
								 | 
							
								          , Reference
							 | 
						||
| 
								 | 
							
								          , Difference
							 | 
						||
| 
								 | 
							
								          , Buffer
							 | 
						||
| 
								 | 
							
								        >
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    typedef range_detail::any_iterator<
							 | 
						||
| 
								 | 
							
								        Value
							 | 
						||
| 
								 | 
							
								      , Traversal
							 | 
						||
| 
								 | 
							
								      , Reference
							 | 
						||
| 
								 | 
							
								      , Difference
							 | 
						||
| 
								 | 
							
								      , Buffer
							 | 
						||
| 
								 | 
							
								    > any_iterator_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef iterator_range<any_iterator_type> base_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct enabler {};
							 | 
						||
| 
								 | 
							
								    struct disabler {};
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								    typedef any_iterator_type iterator;
							 | 
						||
| 
								 | 
							
								    typedef any_iterator_type const_iterator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    any_range()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    any_range(const any_range& other)
							 | 
						||
| 
								 | 
							
								        : base_type(other)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<class WrappedRange>
							 | 
						||
| 
								 | 
							
								    any_range(WrappedRange& wrapped_range)
							 | 
						||
| 
								 | 
							
								    : base_type(boost::begin(wrapped_range),
							 | 
						||
| 
								 | 
							
								                boost::end(wrapped_range))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<class WrappedRange>
							 | 
						||
| 
								 | 
							
								    any_range(const WrappedRange& wrapped_range)
							 | 
						||
| 
								 | 
							
								    : base_type(boost::begin(wrapped_range),
							 | 
						||
| 
								 | 
							
								                boost::end(wrapped_range))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<
							 | 
						||
| 
								 | 
							
								        class OtherValue
							 | 
						||
| 
								 | 
							
								      , class OtherTraversal
							 | 
						||
| 
								 | 
							
								      , class OtherReference
							 | 
						||
| 
								 | 
							
								      , class OtherDifference
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								    any_range(const any_range<
							 | 
						||
| 
								 | 
							
								                        OtherValue
							 | 
						||
| 
								 | 
							
								                      , OtherTraversal
							 | 
						||
| 
								 | 
							
								                      , OtherReference
							 | 
						||
| 
								 | 
							
								                      , OtherDifference
							 | 
						||
| 
								 | 
							
								                      , Buffer
							 | 
						||
| 
								 | 
							
								                    >& other)
							 | 
						||
| 
								 | 
							
								    : base_type(boost::begin(other), boost::end(other))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<class Iterator>
							 | 
						||
| 
								 | 
							
								    any_range(Iterator first, Iterator last)
							 | 
						||
| 
								 | 
							
								        : base_type(first, last)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[heading Definition]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Defined in header file `boost/range/any_range.hpp`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect]
							 |