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] |