mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 13:10:19 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			325 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| [section:utilities Iterator Utilities]
 | |
| 
 | |
| [section:utilities_traits Traits]
 | |
| 
 | |
| [h2 Overview]
 | |
| 
 | |
| Have you ever wanted to write a generic function that can operate
 | |
| on any kind of dereferenceable object?  If you have, you've
 | |
| probably run into the problem of how to determine the type that the
 | |
| object "points at":
 | |
| 
 | |
|    template <class Dereferenceable>
 | |
|    void f(Dereferenceable p)
 | |
|    {
 | |
|        *what-goes-here?* value = \*p;
 | |
|        ...
 | |
|    }
 | |
| 
 | |
| 
 | |
| [h2 `pointee`]
 | |
| 
 | |
| It turns out to be impossible to come up with a fully-general
 | |
| algorithm to do determine *what-goes-here* directly, but it is
 | |
| possible to require that `pointee<Dereferenceable>::type` is
 | |
| correct. Naturally, `pointee` has the same difficulty: it can't
 | |
| determine the appropriate `::type` reliably for all
 | |
| `Dereferenceable`\ s, but it makes very good guesses (it works
 | |
| for all pointers, standard and boost smart pointers, and
 | |
| iterators), and when it guesses wrongly, it can be specialized as
 | |
| necessary:
 | |
| 
 | |
|   namespace boost
 | |
|   {
 | |
|     template <class T>
 | |
|     struct pointee<third_party_lib::smart_pointer<T> >
 | |
|     {
 | |
|         typedef T type;
 | |
|     };
 | |
|   }
 | |
| 
 | |
| [h2 `indirect_reference`]
 | |
| 
 | |
| `indirect_reference<T>::type` is rather more specialized than
 | |
| `pointee`, and is meant to be used to forward the result of
 | |
| dereferencing an object of its argument type.  Most dereferenceable
 | |
| types just return a reference to their pointee, but some return
 | |
| proxy references or return the pointee by value.  When that
 | |
| information is needed, call on `indirect_reference`.
 | |
| 
 | |
| Both of these templates are essential to the correct functioning of
 | |
| [link iterator.specialized.indirect `indirect_iterator`].
 | |
| 
 | |
| [h2 `minimum_category`]
 | |
| 
 | |
| `minimum_category` takes two iterator categories or two iterator traversal tags
 | |
| and returns the one that is the weakest (i.e. least advanced). For example:
 | |
| 
 | |
|   static_assert(
 | |
|       is_same<
 | |
|           minimum_category<
 | |
|               std::forward_iterator_tag,
 | |
|               std::random_access_iterator_tag
 | |
|           >::type,
 | |
|           std::forward_iterator_tag
 | |
|       >::value,
 | |
|       "Unexpected minimum_category result"
 | |
|   );
 | |
| 
 | |
| [h2 Iterator category and traversal tags manipulation]
 | |
| 
 | |
| The library provides several utilities to simplify conversions between iterator categories
 | |
| and traversal tags:
 | |
| 
 | |
| * `iterator_category_to_traversal<C>::type` - the metafunction takes an iterator category `C` and returns
 | |
| the corresponding traversal tag.
 | |
| * `iterator_traversal<T>::type` - a shorthand for `iterator_category_to_traversal<iterator_category<T>::type>::type`.
 | |
| * `pure_traversal_tag<T>::type` - the metafunction takes a tag `T` which derives from one of the iterator traversal tags
 | |
| and returns that traversal tag. `T` may also derive from other tags describing the iterator (e.g. whether this is a `const`-iterator
 | |
| or not), these additional tags are not considered.
 | |
| * `pure_iterator_traversal<T>::type` - a shorthand for `pure_traversal_tag<iterator_traversal<T>::type>::type`.
 | |
| 
 | |
| [h2 Reference]
 | |
| 
 | |
| [h3 `pointee`]
 | |
| 
 | |
|   template <class Dereferenceable>
 | |
|   struct pointee
 | |
|   {
 | |
|       typedef /* see below */ type;
 | |
|   };
 | |
| 
 | |
| [*Requires:] For an object `x` of type `Dereferenceable`, `*x`
 | |
|   is well-formed.  If `++x` is ill-formed it shall neither be
 | |
|   ambiguous nor shall it violate access control, and
 | |
|   `Dereferenceable::element_type` shall be an accessible type.
 | |
|   Otherwise `iterator_traits<Dereferenceable>::value_type` shall
 | |
|   be well formed. \[Note: These requirements need not apply to
 | |
|   explicit or partial specializations of `pointee`\]
 | |
| 
 | |
| `type` is determined according to the following algorithm, where
 | |
| `x` is an object of type `Dereferenceable`:
 | |
| 
 | |
|   if ( ++x is ill-formed )
 | |
|   {
 | |
|       return Dereferenceable::element_type
 | |
|   }
 | |
|   else if (*x is a mutable reference to
 | |
|            std::iterator_traits<Dereferenceable>::value_type)
 | |
|   {
 | |
|       return iterator_traits<Dereferenceable>::value_type
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|       return iterator_traits<Dereferenceable>::value_type const
 | |
|   }
 | |
| 
 | |
| [h3 `indirect_reference`]
 | |
| 
 | |
|   template <class Dereferenceable>
 | |
|   struct indirect_reference
 | |
|   {
 | |
|       typedef /* see below */ type;
 | |
|   };
 | |
| 
 | |
| [*Requires:] For an object `x` of type `Dereferenceable`, `*x`
 | |
|   is well-formed.  If `++x` is ill-formed it shall neither be
 | |
|   ambiguous nor shall it violate access control, and
 | |
|   `pointee<Dereferenceable>::type&` shall be well-formed.
 | |
|   Otherwise `iterator_traits<Dereferenceable>::reference` shall
 | |
|   be well formed.  \[Note: These requirements need not apply to
 | |
|   explicit or partial specializations of `indirect_reference`\]
 | |
| 
 | |
| `type` is determined according to the following algorithm, where
 | |
| `x` is an object of type `Dereferenceable`:
 | |
| 
 | |
|   if ( ++x is ill-formed )
 | |
|       return pointee<Dereferenceable>::type&
 | |
|   else
 | |
|       std::iterator_traits<Dereferenceable>::reference
 | |
| 
 | |
| [h3 `minimum_category`]
 | |
| 
 | |
|   template <typename C1, typename C2>
 | |
|   struct minimum_category
 | |
|   {
 | |
|       typedef /* see below */ type;
 | |
|   };
 | |
| 
 | |
| [*Requires:] Both `C1` and `C2` shall be standard iterator categories or
 | |
|   iterator traversal tags.
 | |
| 
 | |
| `type` is determined according to the following algorithm, where `c1` is an
 | |
| object of type `C1` and `c2` is an object of type `C2`:
 | |
| 
 | |
|   if (c1 is convertible to c2)
 | |
|       return C2;
 | |
|   else
 | |
|       return C1;
 | |
| 
 | |
| [note The above definition relies on the fact that the more restricting categories
 | |
| and traversal tags are convertible to the less restricting ones.]
 | |
| 
 | |
| [h3 `iterator_category_to_traversal`]
 | |
| 
 | |
|   template <typename C>
 | |
|   struct iterator_category_to_traversal
 | |
|   {
 | |
|       typedef /* see below */ type;
 | |
|   };
 | |
| 
 | |
| [*Requires:] `C` shall be a standard iterator category or an
 | |
|   iterator traversal tag.
 | |
| 
 | |
| If `C` is an iterator traversal tag or convertible to one, `type` equivalent to `C`.
 | |
| Otherwise, `type` is defined to the closest iterator traversal tag matching `C`.
 | |
| 
 | |
| [h3 `iterator_traversal`]
 | |
| 
 | |
|   template <typename Iterator>
 | |
|   struct iterator_traversal
 | |
|   {
 | |
|       typedef typename iterator_category_to_traversal<
 | |
|           typename iterator_category<Iterator>::type
 | |
|       >::type type;
 | |
|   };
 | |
| 
 | |
| [*Requires:] `Iterator` shall be an iterator.
 | |
| 
 | |
| [h3 `pure_traversal_tag`]
 | |
| 
 | |
|   template <typename T>
 | |
|   struct pure_traversal_tag
 | |
|   {
 | |
|       typedef /* see below */ type;
 | |
|   };
 | |
| 
 | |
| [*Requires:] `T` shall be convertible to an iterator traversal tag.
 | |
| 
 | |
| `type` is defined to be the most advanced traversal tag `Tag` so that `T` is convertible to `Tag`.
 | |
| 
 | |
| [h3 `pure_iterator_traversal`]
 | |
| 
 | |
|   template <typename Iterator>
 | |
|   struct pure_iterator_traversal
 | |
|   {
 | |
|       typedef typename pure_traversal_tag<
 | |
|           typename iterator_traversal<Iterator>::type
 | |
|       >::type type;
 | |
|   };
 | |
| 
 | |
| [*Requires:] `Iterator` shall be an iterator.
 | |
| 
 | |
| [endsect]
 | |
| 
 | |
| [section:utilities_testing Testing and Concept Checking]
 | |
| 
 | |
| The iterator concept checking classes provide a mechanism for a
 | |
| template to report better error messages when a user instantiates
 | |
| the template with a type that does not meet the requirements of the
 | |
| template.
 | |
| 
 | |
| For an introduction to using concept checking classes, see
 | |
| the documentation for the 
 | |
| [@../../concept_check/index.html `boost::concept_check`] library.
 | |
| 
 | |
| 
 | |
| [h2 Reference]
 | |
| 
 | |
| [h3 Iterator Access Concepts]
 | |
| 
 | |
| * |Readable|_ 
 | |
| * |Writable|_ 
 | |
| * |Swappable|_ 
 | |
| * |Lvalue|_ 
 | |
| 
 | |
| [/ .. |Readable| replace:: *Readable Iterator* ]
 | |
| [/ .. _Readable: ReadableIterator.html            ]
 | |
| [/                                                ]
 | |
| [/ .. |Writable| replace:: *Writable Iterator*    ]
 | |
| [/ .. _Writable: WritableIterator.html            ]
 | |
| [/                                                ]
 | |
| [/ .. |Swappable| replace:: *Swappable Iterator*  ]
 | |
| [/ .. _Swappable: SwappableIterator.html          ]
 | |
| [/                                                ]
 | |
| [/ .. |Lvalue| replace:: *Lvalue Iterator*        ]
 | |
| [/ .. _Lvalue: LvalueIterator.html                ]
 | |
| 
 | |
| 
 | |
| Iterator Traversal Concepts
 | |
| ...........................
 | |
| 
 | |
| * |Incrementable|_
 | |
| * |SinglePass|_
 | |
| * |Forward|_
 | |
| * |Bidir|_
 | |
| * |Random|_
 | |
| 
 | |
| 
 | |
| [/ .. |Incrementable| replace:: *Incrementable Iterator* ]
 | |
| [/ .. _Incrementable: IncrementableIterator.html         ]
 | |
| [/                                                       ]
 | |
| [/ .. |SinglePass| replace:: *Single Pass Iterator*      ]
 | |
| [/ .. _SinglePass: SinglePassIterator.html               ]
 | |
| [/                                                       ]
 | |
| [/ .. |Forward| replace:: *Forward Traversal*            ]
 | |
| [/ .. _Forward: ForwardTraversal.html                    ]
 | |
| [/                                                       ]
 | |
| [/ .. |Bidir| replace:: *Bidirectional Traversal*        ]
 | |
| [/ .. _Bidir: BidirectionalTraversal.html                ]
 | |
| [/                                                       ]
 | |
| [/ .. |Random| replace:: *Random Access Traversal*       ]
 | |
| [/ .. _Random: RandomAccessTraversal.html                ]
 | |
| 
 | |
| 
 | |
| 
 | |
| [h3 `iterator_concepts.hpp` Synopsis]
 | |
| 
 | |
|     namespace boost_concepts {
 | |
| 
 | |
|         // Iterator Access Concepts
 | |
| 
 | |
|         template <typename Iterator>
 | |
|         class ReadableIteratorConcept;
 | |
| 
 | |
|         template <
 | |
|             typename Iterator
 | |
|           , typename ValueType = std::iterator_traits<Iterator>::value_type
 | |
|         >
 | |
|         class WritableIteratorConcept;
 | |
| 
 | |
|         template <typename Iterator>
 | |
|         class SwappableIteratorConcept;
 | |
| 
 | |
|         template <typename Iterator>
 | |
|         class LvalueIteratorConcept;
 | |
| 
 | |
|         // Iterator Traversal Concepts
 | |
| 
 | |
|         template <typename Iterator>
 | |
|         class IncrementableIteratorConcept;
 | |
| 
 | |
|         template <typename Iterator>
 | |
|         class SinglePassIteratorConcept;
 | |
| 
 | |
|         template <typename Iterator>
 | |
|         class ForwardTraversalConcept;
 | |
| 
 | |
|         template <typename Iterator>
 | |
|         class BidirectionalTraversalConcept;
 | |
| 
 | |
|         template <typename Iterator>
 | |
|         class RandomAccessTraversalConcept;
 | |
| 
 | |
|         // Interoperability
 | |
| 
 | |
|         template <typename Iterator, typename ConstIterator>
 | |
|         class InteroperableIteratorConcept;
 | |
| 
 | |
|     }
 | |
| 
 | |
| [endsect]
 | |
| 
 | |
| [endsect]
 |