forked from boostorg/concept_check
added the Adaptable functor concepts
also updated the SGI STL URL's [SVN r11963]
This commit is contained in:
@@ -205,7 +205,7 @@ stl_algo.h:1377: no match for `_List_iterator<int,int &,int *> & -
|
||||
|
||||
In this case, the fundamental error is that
|
||||
<tt>std:list::iterator</tt> does not model the concept of <a
|
||||
href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a>. The list iterator is only bidirectional, not
|
||||
fully random access (as would be a vector iterator). Unfortunately,
|
||||
there is nothing in the error message to indicate this to the user.
|
||||
@@ -222,7 +222,7 @@ reasons why this message would be hard to understand.
|
||||
<LI> There is no textual correlation between the error message and the
|
||||
documented requirements for <tt>std::stable_sort()</tt> and for
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a>.
|
||||
<LI> The error message is overly long, listing functions internal
|
||||
to the STL that the user does not (and should not!) know or care
|
||||
@@ -256,7 +256,7 @@ error messages.
|
||||
specified in the error message.
|
||||
<LI> The message refers explicitly to concepts that the user can look
|
||||
up in the STL documentation (<a
|
||||
href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a>).
|
||||
<LI> The error message is now much shorter and does not reveal
|
||||
internal STL functions.
|
||||
|
@@ -24,7 +24,7 @@
|
||||
|
||||
As an example of how to create a concept checking class, we look
|
||||
at how to create the corresponding checks for the
|
||||
<a href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">
|
||||
<a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a> concept. First, as a convention we name the
|
||||
concept checking class after the concept, and add the suffix
|
||||
``<tt>Concept</tt>''. Next we must define a member function named
|
||||
@@ -36,11 +36,11 @@ non-const member function with no parameters.
|
||||
<p>
|
||||
The first part of the <tt>constraints()</tt> function includes
|
||||
the requirements that correspond to the <i>refinement</i> relationship
|
||||
between <a href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">
|
||||
between <a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a> and the concepts which it builds upon:
|
||||
<a href="http://www.sgi.com/Technology/STL/BidirectionalIterator.html">
|
||||
<a href="http://www.sgi.com/tech/stl/BidirectionalIterator.html">
|
||||
BidirectionalIterator</a> and
|
||||
<a href="http://www.sgi.com/Technology/STL/LessThanComparable.html">
|
||||
<a href="http://www.sgi.com/tech/stl/LessThanComparable.html">
|
||||
LessThanComparable</a>. We could have instead used
|
||||
<tt>BOOST_CLASS_REQUIRES</tt> and placed these requirements in the class
|
||||
body, however <tt>BOOST_CLASS_REQUIRES</tt> uses C++ language features that
|
||||
@@ -51,7 +51,7 @@ Next we check that the <tt>iterator_category</tt> of the iterator is
|
||||
either <tt>std::random_access_iterator_tag</tt> or a derived class.
|
||||
After that we write out some code that corresponds to the valid
|
||||
expressions of the <a
|
||||
href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a> concept. Typedefs can also be added to
|
||||
enforce the associated types of the concept.
|
||||
|
||||
|
@@ -98,7 +98,7 @@ function named <tt>function_requires()</tt>. The following code
|
||||
snippet shows how to use <tt>function_requires()</tt> to make sure
|
||||
that the iterator is a
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a>.
|
||||
|
||||
<pre>
|
||||
|
@@ -62,7 +62,7 @@ in the concept.
|
||||
For example, the
|
||||
<tt>std::stable_sort()</tt> function requires that the value type of
|
||||
the iterator be <a
|
||||
href="http://www.sgi.com/Technology/STL/LessThanComparable.html">
|
||||
href="http://www.sgi.com/tech/stl/LessThanComparable.html">
|
||||
LessThanComparable</a>, which not only
|
||||
includes <tt>operator<()</tt>, but also <tt>operator>()</tt>,
|
||||
<tt>operator<=()</tt>, and <tt>operator>=()</tt>.
|
||||
@@ -70,19 +70,19 @@ It turns out that <tt>std::stable_sort()</tt> only uses
|
||||
<tt>operator<()</tt>. The question then arises: should
|
||||
<tt>std::stable_sort()</tt> be specified in terms of the concept
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/LessThanComparable.html">
|
||||
href="http://www.sgi.com/tech/stl/LessThanComparable.html">
|
||||
LessThanComparable</a> or in terms of a concept that only
|
||||
requires <tt>operator<()</tt>?
|
||||
|
||||
<p>
|
||||
We remark first that the use of <a
|
||||
href="http://www.sgi.com/Technology/STL/LessThanComparable.html">
|
||||
href="http://www.sgi.com/tech/stl/LessThanComparable.html">
|
||||
LessThanComparable</a> does not really violate the requirement
|
||||
minimization principle because all of the other operators can be
|
||||
trivially implemented in terms of <tt>operator<()</tt>. By
|
||||
``trivial'' we mean one line of code and a constant run-time cost.
|
||||
More fundamentally, however, the use of <a
|
||||
href="http://www.sgi.com/Technology/STL/LessThanComparable.html">
|
||||
href="http://www.sgi.com/tech/stl/LessThanComparable.html">
|
||||
LessThanComparable</a> does not violate the requirement minimization
|
||||
principle because all of the comparison operators (<tt><</tt>,
|
||||
<tt>></tt>, <tt><=</tt>, <tt>>=</tt>) are conceptually equivalent (in
|
||||
@@ -100,7 +100,7 @@ implementation in places to use <tt>operator>()</tt> instead of
|
||||
requirements are part of the public interface, such a change could
|
||||
potentially break client code. If instead
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/LessThanComparable.html">
|
||||
href="http://www.sgi.com/tech/stl/LessThanComparable.html">
|
||||
LessThanComparable</a> is given as the requirement for
|
||||
<tt>std::stable_sort()</tt>, then the maintainer is given a reasonable
|
||||
amount of flexibility within which to work.
|
||||
@@ -113,10 +113,10 @@ semantics of the problem domain being represented. In the problem
|
||||
domain of basic containers, requiring traversal in a single direction
|
||||
is a smaller requirement than requiring traversal in both directions
|
||||
(hence the distinction between <a
|
||||
href="http://www.sgi.com/Technology/STL/ForwardIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/ForwardIterator.html">
|
||||
ForwardIterator</a> and
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/BidirectionalIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/BidirectionalIterator.html">
|
||||
BidirectionalIterator</a>). The semantic difference can be easily seen
|
||||
in the difference between the set of concrete data structures that
|
||||
have forward iterators versus the set that has bidirectional
|
||||
|
@@ -72,54 +72,54 @@
|
||||
struct <a href="../utility/Assignable.html">Assignable</a>Concept; // Standard ref 23.1
|
||||
|
||||
template <class T>
|
||||
struct SGI<a href="http://www.sgi.com/Technology/STL/Assignable.html">Assignable</a>Concept;
|
||||
struct SGI<a href="http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>Concept;
|
||||
|
||||
template <class T>
|
||||
struct <a
|
||||
href="http://www.sgi.com/Technology/STL/DefaultConstructible.html">DefaultConstructible</a>Concept;
|
||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>Concept;
|
||||
|
||||
template <class T>
|
||||
struct <a href="../utility/CopyConstructible.html">CopyConstructible</a>Concept; // Standard ref 20.1.3
|
||||
|
||||
template <class T>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/EqualityComparable.html">EqualityComparable</a>Concept; // Standard ref 20.1.1
|
||||
struct <a href="http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</a>Concept; // Standard ref 20.1.1
|
||||
|
||||
template <class T>
|
||||
struct <a href="../utility/LessThanComparable.html">LessThanComparable</a>Concept; // Standard ref 20.1.2
|
||||
|
||||
template <class T>
|
||||
struct ComparableConcept; // The SGI STL <a href="http://www.sgi.com/Technology/STL/LessThanComparable.html">LessThanComparable</a> concept
|
||||
struct ComparableConcept; // The SGI STL <a href="http://www.sgi.com/tech/stl/LessThanComparable.html">LessThanComparable</a> concept
|
||||
</pre>
|
||||
|
||||
<h3><a name="iterator-concepts">Iterator Concept Checking Classes</a></h3>
|
||||
|
||||
<pre>
|
||||
template <class Iter>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/trivial.html">TrivialIterator</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/trivial.html">TrivialIterator</a>Concept;
|
||||
|
||||
template <class Iter>
|
||||
struct Mutable_TrivialIteratorConcept;
|
||||
|
||||
template <class Iter>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/InputIterator.html">InputIterator</a>Concept; // Standard ref 24.1.1 Table 72
|
||||
struct <a href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>Concept; // Standard ref 24.1.1 Table 72
|
||||
|
||||
template <class Iter, class T>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/OutputIterator.html">OutputIterator</a>Concept; // Standard ref 24.1.2 Table 73
|
||||
struct <a href="http://www.sgi.com/tech/stl/OutputIterator.html">OutputIterator</a>Concept; // Standard ref 24.1.2 Table 73
|
||||
|
||||
template <class Iter>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/ForwardIterator.html">ForwardIterator</a>Concept; // Standard ref 24.1.3 Table 74
|
||||
struct <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>Concept; // Standard ref 24.1.3 Table 74
|
||||
|
||||
template <class Iter>
|
||||
struct Mutable_ForwardIteratorConcept;
|
||||
|
||||
template <class Iter>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/BidirectionalIterator.html">BidirectionalIterator</a>Concept; // Standard ref 24.1.4 Table 75
|
||||
struct <a href="http://www.sgi.com/tech/stl/BidirectionalIterator.html">BidirectionalIterator</a>Concept; // Standard ref 24.1.4 Table 75
|
||||
|
||||
template <class Iter>
|
||||
struct Mutable_BidirectionalIteratorConcept;
|
||||
|
||||
template <class Iter>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">RandomAccessIterator</a>Concept; // Standard ref 24.1.5 Table 76
|
||||
struct <a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">RandomAccessIterator</a>Concept; // Standard ref 24.1.5 Table 76
|
||||
|
||||
template <class Iter>
|
||||
struct Mutable_RandomAccessIteratorConcept;
|
||||
@@ -129,77 +129,93 @@
|
||||
|
||||
<pre>
|
||||
template <class Func, class Return>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/Generator.html">Generator</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/Generator.html">Generator</a>Concept;
|
||||
|
||||
template <class Func, class Return, class Arg>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/UnaryFunction.html">UnaryFunction</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/UnaryFunction.html">UnaryFunction</a>Concept;
|
||||
|
||||
template <class Func, class Return, class First, class Second>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/BinaryFunction.html">BinaryFunction</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/BinaryFunction.html">BinaryFunction</a>Concept;
|
||||
|
||||
template <class Func, class Arg>
|
||||
struct Unary<a href="http://www.sgi.com/Technology/STL/Predicate.html">Predicate</a>Concept;
|
||||
struct Unary<a href="http://www.sgi.com/tech/stl/Predicate.html">Predicate</a>Concept;
|
||||
|
||||
template <class Func, class First, class Second>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/BinaryPredicate.html">BinaryPredicate</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>Concept;
|
||||
|
||||
template <class Func, class First, class Second>
|
||||
struct Const_BinaryPredicateConcept;
|
||||
|
||||
template <class Func, class Return>
|
||||
struct <a href="http://www.sgi.com/tech/stl/AdaptableGenerator.html">AdaptableGenerator</a>Concept;
|
||||
|
||||
template <class Func, class Return, class Arg>
|
||||
struct <a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html">AdaptableUnaryFunction</a>Concept;
|
||||
|
||||
template <class Func, class First, class Second>
|
||||
struct <a href="http://www.sgi.com/tech/stl/AdaptableBinaryFunction.html">AdaptableBinaryFunction</a>Concept;
|
||||
|
||||
template <class Func, class Arg>
|
||||
struct <a href="http://www.sgi.com/tech/stl/AdaptablePredicate.html">AdaptablePredicate</a>Concept;
|
||||
|
||||
template <class Func, class First, class Second>
|
||||
struct <a href="http://www.sgi.com/tech/stl/AdaptableBinaryPredicate.html">AdaptableBinaryPredicate</a>Concept;
|
||||
|
||||
</pre>
|
||||
|
||||
<h3><a name="container-concepts">Container Concept Checking Classes</a></h3>
|
||||
|
||||
<pre>
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/Container.html">Container</a>Concept; // Standard ref 23.1 Table 65
|
||||
struct <a href="http://www.sgi.com/tech/stl/Container.html">Container</a>Concept; // Standard ref 23.1 Table 65
|
||||
|
||||
template <class C>
|
||||
struct Mutable_ContainerConcept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/ForwardContainer.html">ForwardContainer</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/ForwardContainer.html">ForwardContainer</a>Concept;
|
||||
|
||||
template <class C>
|
||||
struct Mutable_ForwardContainerConcept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/ReversibleContainer.html">ReversibleContainer</a>Concept; // Standard ref 23.1 Table 66
|
||||
struct <a href="http://www.sgi.com/tech/stl/ReversibleContainer.html">ReversibleContainer</a>Concept; // Standard ref 23.1 Table 66
|
||||
|
||||
template <class C>
|
||||
struct Mutable_ReversibleContainerConcept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/RandomAccessContainer.html">RandomAccessContainer</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">RandomAccessContainer</a>Concept;
|
||||
|
||||
template <class C>
|
||||
struct Mutable_RandomAccessContainerConcept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/SequenceContainer.html">Sequence</a>Concept; // Standard ref 23.1.1
|
||||
struct <a href="http://www.sgi.com/tech/stl/SequenceContainer.html">Sequence</a>Concept; // Standard ref 23.1.1
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/FrontInsertionSequence.html">FrontInsertionSequence</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/FrontInsertionSequence.html">FrontInsertionSequence</a>Concept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/BackInsertionSequence.html">BackInsertionSequence</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/BackInsertionSequence.html">BackInsertionSequence</a>Concept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/Associative.html">AssociativeContainer</a>Concept; // Standard ref 23.1.2 Table 69
|
||||
struct <a href="http://www.sgi.com/tech/stl/Associative.html">AssociativeContainer</a>Concept; // Standard ref 23.1.2 Table 69
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/UniqueAssociativeContainer.html">UniqueAssociativeContainer</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html">UniqueAssociativeContainer</a>Concept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/MultipleAssociativeContainer.html">MultipleAssociativeContainer</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/MultipleAssociativeContainer.html">MultipleAssociativeContainer</a>Concept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/SimpleAssociativeContainer.html">SimpleAssociativeContainer</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/SimpleAssociativeContainer.html">SimpleAssociativeContainer</a>Concept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/PairAssociativeContainer.html">PairAssociativeContainer</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/PairAssociativeContainer.html">PairAssociativeContainer</a>Concept;
|
||||
|
||||
template <class C>
|
||||
struct <a href="http://www.sgi.com/Technology/STL/SortedAssociativeContainer.html">SortedAssociativeContainer</a>Concept;
|
||||
struct <a href="http://www.sgi.com/tech/stl/SortedAssociativeContainer.html">SortedAssociativeContainer</a>Concept;
|
||||
</pre>
|
||||
|
||||
|
||||
|
@@ -43,7 +43,7 @@ An example of a concept checking class from the BCCL is the
|
||||
<tt>EqualityComparableConcept</tt> class. The class corresponds to the
|
||||
EqualityComparable requirements described in 20.1.1 of the C++
|
||||
Standard, and to the <a
|
||||
href="http://www.sgi.com/Technology/STL/EqualityComparable.html">EqualityComparable</a>
|
||||
href="http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</a>
|
||||
concept documented in the SGI STL.
|
||||
|
||||
<pre>
|
||||
@@ -132,10 +132,10 @@ href="./concept_check.htm#motivating-example">motivating example</a>,
|
||||
one good applicatino of concept checks would be to insert
|
||||
<tt>function_requires()</tt> at the top of <tt>std::stable_sort()</tt>
|
||||
to make sure the template parameter type models <a
|
||||
href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a>. In addition, <tt>std::stable_sort()</tt>
|
||||
requires that the <tt>value_type</tt> of the iterators be
|
||||
<a href="http://www.sgi.com/Technology/STL/LessThanComparable.html">
|
||||
<a href="http://www.sgi.com/tech/stl/LessThanComparable.html">
|
||||
LessThanComparable</a>, so we also use <tt>function_requires()</tt> to
|
||||
check this.
|
||||
|
||||
@@ -182,7 +182,7 @@ type for the map.
|
||||
As an example of using <tt>BOOST_CLASS_REQUIRES</tt> we look at a concept
|
||||
check that could be added to <tt>std::vector</tt>. One requirement
|
||||
that is placed on the element type is that it must be <a
|
||||
href="http://www.sgi.com/Technology/STL/Assignable.html">Assignable</a>.
|
||||
href="http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>.
|
||||
We can check this by inserting
|
||||
<tt>class_requires<AssignableConcept<T> ></tt> at the top
|
||||
of the definition for <tt>std::vector</tt>.
|
||||
|
Reference in New Issue
Block a user