mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04: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]
 |