mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-05-25 02:42:28 -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]
|