0381c5fc54
Some documentation links currently point to pages that HP retired along with the rest of the SGI STL website. These links now point to the Boost mirror site.
126 lines
5.8 KiB
HTML
126 lines
5.8 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<!-- Copyright (c) Jeremy Siek and Andrew Lumsdaine 2000 -->
|
|
<!-- 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) -->
|
|
|
|
<head>
|
|
<meta name="generator" content=
|
|
"HTML Tidy for Linux/x86 (vers 1 September 2005), see www.w3.org" />
|
|
|
|
<title>Concept Covering and Archetypes</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<link rel="stylesheet" href="../../rst.css" type="text/css" />
|
|
</head>
|
|
|
|
<body bgcolor="#FFFFFF" link="#0000EE" text="#000000" vlink="#551A8B" alink=
|
|
"#FF0000">
|
|
<img src="../../boost.png" alt="C++ Boost" width="277" height=
|
|
"86" /><br clear="none" />
|
|
|
|
<h2><a name="concept-covering" id="concept-covering">Concept Covering and
|
|
Archetypes</a></h2>
|
|
|
|
<p>We have discussed how it is important to select the minimal requirements
|
|
(concepts) for the inputs to a component, but it is equally important to
|
|
verify that the chosen concepts <i>cover</i> the algorithm. That is, any
|
|
possible user error should be caught by the concept checks and not let slip
|
|
through. Concept coverage can be verified through the use of <i>archetype
|
|
classes</i>. An archetype class is an exact implementation of the interface
|
|
associated with a particular concept. The run-time behavior of the
|
|
archetype class is not important, the functions can be left empty. A simple
|
|
test program can then be compiled with the archetype classes as the inputs
|
|
to the component. If the program compiles then one can be sure that the
|
|
concepts cover the component. The following code shows the archetype class
|
|
for the <a href="http://www.boost.org/sgi/stl/InputIterator.html">Input
|
|
Iterator</a> concept. Some care must be taken to ensure that the archetype
|
|
is an exact match to the concept. For example, the concept states that the
|
|
return type of <tt>operator*()</tt> must be convertible to the value type.
|
|
It does not state the more stringent requirement that the return type be
|
|
<tt>T&</tt> or <tt>const T&</tt>. That means it would be a mistake
|
|
to use <tt>T&</tt> or <tt>const T&</tt> for the return type of the
|
|
archetype class. The correct approach is to create an artificial return
|
|
type that is convertible to <tt>T</tt>, as we have done here with
|
|
<tt>reference</tt>. The validity of the archetype class test is completely
|
|
dependent on it being an exact match with the concept, which must be
|
|
verified by careful (manual) inspection.</p>
|
|
<pre>
|
|
template <class T>
|
|
class input_iterator_archetype
|
|
{
|
|
private:
|
|
typedef input_iterator_archetype self;
|
|
public:
|
|
typedef std::input_iterator_tag iterator_category;
|
|
typedef T value_type;
|
|
struct reference {
|
|
operator const value_type&() const { return static_object<T>::get(); }
|
|
};
|
|
typedef const T* pointer;
|
|
typedef std::ptrdiff_t difference_type;
|
|
self& operator=(const self&) { return *this; }
|
|
bool operator==(const self&) const { return true; }
|
|
bool operator!=(const self&) const { return true; }
|
|
reference operator*() const { return reference(); }
|
|
self& operator++() { return *this; }
|
|
self operator++(int) { return *this; }
|
|
};
|
|
</pre>
|
|
|
|
<p>Generic algorithms are often tested by being instantiated with a number
|
|
of common input types. For example, one might apply
|
|
<tt>std::stable_sort()</tt> with basic pointer types as the iterators.
|
|
Though appropriate for testing the run-time behavior of the algorithm, this
|
|
is not helpful for ensuring concept coverage because C++ types never match
|
|
particular concepts exactly. Instead, they often provide more than the
|
|
minimal functionality required by any one concept. Even though the function
|
|
template has concept checks, and compiles with a given type, the checks may
|
|
still fall short of covering all the functionality that is actually used.
|
|
This is why it is important to compile with archetype classes in addition
|
|
to testing with common input types.</p>
|
|
|
|
<p>The following is an excerpt from <a href=
|
|
"./stl_concept_covering.cpp"><tt>stl_concept_covering.cpp</tt></a> that
|
|
shows how archetypes can be used to check the requirement documentation for
|
|
<a href=
|
|
"http://www.boost.org/sgi/stl/stable_sort.html"><tt>std::stable_sort()</tt></a>.
|
|
In this case, it looks like the <a href=
|
|
"../utility/CopyConstructible.html">CopyConstructible</a> and <a href=
|
|
"../utility/Assignable.html">Assignable</a> requirements were forgotten in
|
|
the SGI STL documentation (try removing those archetypes). The Boost
|
|
archetype classes have been designed so that they can be layered. In this
|
|
example the value type of the iterator is composed out of three archetypes.
|
|
In the <a href="reference.htm#basic-archetype">archetype class
|
|
reference</a>, template parameters named <tt>Base</tt> indicate where the
|
|
layered archetype paradigm can be used.</p>
|
|
<pre>
|
|
{
|
|
typedef less_than_comparable_archetype<
|
|
sgi_assignable_archetype<> > ValueType;
|
|
random_access_iterator_archetype<ValueType> ri;
|
|
std::stable_sort(ri, ri);
|
|
}
|
|
</pre>
|
|
|
|
<p><a href="./prog_with_concepts.htm">Next: Programming with
|
|
Concepts</a><br />
|
|
<a href="./creating_concepts.htm">Prev: Creating Concept Checking
|
|
Classes</a><br />
|
|
<hr />
|
|
|
|
<table>
|
|
<tr valign="top">
|
|
<td nowrap="nowrap">Copyright © 2000</td>
|
|
|
|
<td><a href="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</a>(<a href=
|
|
"mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>) Andrew
|
|
Lumsdaine(<a href="mailto:lums@osl.iu.edu">lums@osl.iu.edu</a>),
|
|
2007 <a href="mailto:dave@boost-consulting.com">David Abrahams</a>.
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|