|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r83371 - in sandbox/type_erasure/libs/type_erasure: doc example
From: steven_at_[hidden]
Date: 2013-03-09 14:03:09
Author: steven_watanabe
Date: 2013-03-09 14:03:08 EST (Sat, 09 Mar 2013)
New Revision: 83371
URL: http://svn.boost.org/trac/boost/changeset/83371
Log:
Doc restructuring.
Text files modified:
sandbox/type_erasure/libs/type_erasure/doc/type_erasure.qbk | 61 ++++++++++++++++++++++++++++-----------
sandbox/type_erasure/libs/type_erasure/example/basic.cpp | 45 +++++++++++++---------------
sandbox/type_erasure/libs/type_erasure/example/compose.cpp | 6 ---
sandbox/type_erasure/libs/type_erasure/example/construction.cpp | 27 +----------------
sandbox/type_erasure/libs/type_erasure/example/multi.cpp | 39 +++++++++++++++++--------
5 files changed, 93 insertions(+), 85 deletions(-)
Modified: sandbox/type_erasure/libs/type_erasure/doc/type_erasure.qbk
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/doc/type_erasure.qbk (original)
+++ sandbox/type_erasure/libs/type_erasure/doc/type_erasure.qbk 2013-03-09 14:03:08 EST (Sat, 09 Mar 2013)
@@ -141,20 +141,18 @@
[endsect]
[section:basic Basic Usage]
-
[import ../example/basic.cpp]
[basic]
+[endsect]
[section Composing Concepts]
[import ../example/compose.cpp]
[compose]
[endsect]
-[section Conversions]
-[import ../example/convert.cpp]
-[convert]
-[endsect]
-
+[section:multi Functions with Multiple Arguments]
+[import ../example/multi.cpp]
+[multi]
[endsect]
[section:concept Concepts in Depth]
@@ -169,29 +167,56 @@
[overload]
[endsect]
-[section:references Using References]
-[import ../example/references.cpp]
-[references]
+[section:concept_map Concept Maps]
+[import ../example/concept_map.cpp]
+[concept_map]
+[endsect]
+
+[section:overload Associated Types]
+[import ../example/associated.cpp]
+[associated]
[endsect]
-[section:multi Functions with Multiple Arguments]
-[import ../example/multi.cpp]
-[multi]
[endsect]
+[section:any Using Any]
+
[section:construction Construction]
[import ../example/construction.cpp]
[construction]
[endsect]
-[section:concept_map Concept Maps]
-[import ../example/concept_map.cpp]
-[concept_map]
+[section Conversions]
+[import ../example/convert.cpp]
+[convert]
[endsect]
-[section:overload Associated Types]
-[import ../example/associated.cpp]
-[associated]
+[section:references References]
+[import ../example/references.cpp]
+[references]
+[endsect]
+
+[section:limit Syntax Limitations]
+
+In most cases using an any has the same
+syntax as using the underlying object.
+However, there are a few cases where
+this is not possible to implement.
+An __any reference is proxy and cannot
+be used in contexts where a real
+reference is required. In particular,
+__forward_iterator does not create
+a conforming ForwardIterator (unless
+the value_type is fixed.) Another
+difference is that all operations
+which do not take at least one __any
+argument have to be passed the type
+information explicitly. Static member
+functions and constructors can fall in
+this category. All this means that generic
+algorithms might not work when applied to
+__any arguments.
+
[endsect]
[endsect]
Modified: sandbox/type_erasure/libs/type_erasure/example/basic.cpp
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/example/basic.cpp (original)
+++ sandbox/type_erasure/libs/type_erasure/example/basic.cpp 2013-03-09 14:03:08 EST (Sat, 09 Mar 2013)
@@ -123,34 +123,31 @@
For free functions, we can use the macro __BOOST_TYPE_ERASURE_FREE.
*/
-BOOST_TYPE_ERASURE_FREE((has_swap), swap, 2);
-template<class T = _self>
-struct swappable : mpl::vector<has_swap<void(T&, T&)> > {};
+BOOST_TYPE_ERASURE_FREE((has_getline), getline, 2)
+std::vector<std::string> read_lines(any<has_getline<bool(_self&, std::string&)>, _self&> stream)
+{
+ std::vector<std::string> result;
+ std::string tmp;
+ while(getline(stream, tmp))
+ result.push_back(tmp);
+ return result;
+}
/*`
- The use of `has_swap` is essentially similar to `has_push_back`.
- We have to pass it the function signature. In this case, however,
- the signature has one extra twist. We use the __placeholder `_self`
- to indicate which arguments of `swap` should be __any's.
-
- Now, swap should always have the same signature. It should
- always look like `has_swap<void(_self&, _self&)>`, since `swap`
- takes two arguments of the same type by reference. Thus,
- we define `swappable<>` as a convenient short-cut.
-
- [note We could define `swappable` to be a typedef of
- `has_swap<void(_self&, _self&)>`, but `_self` is not the only
- __placeholder. We can use another __placeholder instead. The
- library doesn't care what placeholder we use as long as we're consistent.
- So, if we wanted to use `_a`, we'd have to write `any<swappable<_a>, _a&>`.
- Neither `any<swappable<_self>, _a&>` nor `any<swappable<_a>, _self&>`
- would work.]
-
- [warning Do not try to make one concept inherit directly from
- another. The use of `mpl::vector` is necessary for the library
- to understand the relationship between the two concepts.]
+ The use of `has_getline` is very similar to `has_push_back` above.
+ The difference is that the placeholder `_self` is passed in
+ the function signature instead of as a separate argument.
+
+ The __placeholder doesn't have to be the first argument.
+ We could just as easily make it the second argument.
*/
+
+void read_line(any<has_getline<bool(std::istream&, _self&)>, _self&> str)
+{
+ getline(std::cin, str);
+}
+
//]
//[basic
Modified: sandbox/type_erasure/libs/type_erasure/example/compose.cpp
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/example/compose.cpp (original)
+++ sandbox/type_erasure/libs/type_erasure/example/compose.cpp 2013-03-09 14:03:08 EST (Sat, 09 Mar 2013)
@@ -17,11 +17,7 @@
//[compose1
/*`
- The use of `mpl::vector` for concept inheritence
- can be generalized to define a concept that
- is composed of multiple other concepts. The
- MPL sequence can contain as many concepts as
- we need.
+ Multiple concepts can be composed using an MPL sequence.
*/
template<class T = _self>
struct arithmetic :
Modified: sandbox/type_erasure/libs/type_erasure/example/construction.cpp
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/example/construction.cpp (original)
+++ sandbox/type_erasure/libs/type_erasure/example/construction.cpp 2013-03-09 14:03:08 EST (Sat, 09 Mar 2013)
@@ -34,29 +34,6 @@
constructible<_a(const _b&, const _c&)>
> construct;
- std::vector<double> vec;
- int i = 10;
- double d = 2.5;
- tuple<construct, _a&, _b, _c> t(vec, i, d);
- any<construct, _a> v(get<1>(t), get<2>(t));
- // v holds std::vector<double>(10, 2.5);
- //]
-}
-
-void construction2() {
- typedef mpl::vector<
- copy_constructible<_a>,
- copy_constructible<_b>,
- copy_constructible<_c>,
- constructible<_a(const _b&, const _c&)>
- > construct;
- //[construction2
- /*`
- This requires us to create a vector to deduce
- its type, even though the object is never used.
- Instead, we can explicitly specify the types
- that the placeholders should be bound to.
- */
typedef mpl::map<
mpl::pair<_a, std::vector<double> >,
mpl::pair<_b, std::size_t>,
@@ -66,6 +43,7 @@
any<construct, _b> size(std::size_t(10), make_binding<types>());
any<construct, _c> val(2.5, make_binding<types>());
any<construct, _a> v(size, val);
+ // v holds std::vector<double>(10, 2.5);
//]
}
@@ -85,7 +63,7 @@
> construct;
any<construct> x(std::string("Test"));
- any<construct> y(binding_of(x));
+ any<construct> y(binding_of(x)); // y == ""
//]
}
@@ -110,7 +88,6 @@
//` (For the source of the examples in this section see
//` [@boost:/libs/type_erasure/example/construction.cpp construction.cpp])
//` [construction1]
-//` [construction2]
//` [construction3]
//` [construction4]
//]
Modified: sandbox/type_erasure/libs/type_erasure/example/multi.cpp
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/example/multi.cpp (original)
+++ sandbox/type_erasure/libs/type_erasure/example/multi.cpp 2013-03-09 14:03:08 EST (Sat, 09 Mar 2013)
@@ -38,8 +38,13 @@
any_type z(x + y);
std::cout << z << std::endl; // prints 17
/*`
- The underlying types of the arguments of `+` must match or the
- behavior is undefined.
+ This is /not/ a multimethod. The underlying types of the
+ arguments of `+` must be the same or the behavior is undefined.
+ This example is correct because the arguments both hold
+ `int`'s.
+
+ [note Adding __relaxed leads an exception rather than undefined
+ behavior if the argument types are wrong.]
*/
//]
}
@@ -47,11 +52,15 @@
void multi2() {
//[multi2
/*`
- __addable`<>` requires the types of the arguments to be
- the same. We can also capture relationships among several types.
- To do this we'll need to identify each type with a
- __placeholder.
+ __addable`<>` requires the types of the arguments to be exactly
+ the same. This doesn't cover all uses of addition though. For
+ example, pointer arithmetic takes a pointer and an integer and
+ returns a pointer. We can capture this kind of relationship among
+ several types by identifying each type involved with a placeholder.
+ We'll let the placeholder `_a` represent the pointer and the
+ placeholder `_b` represent the integer.
*/
+
int array[5];
typedef mpl::vector<
@@ -62,6 +71,9 @@
> requirements;
/*`
+ Our new concept, `addable<_a, _b, _a>` captures the
+ rules of pointer addition: `_a + _b -> _a`.
+
Also, we can no longer capture the variables
independently.
``
@@ -75,19 +87,20 @@
*/
typedef mpl::map<mpl::pair<_a, int*>, mpl::pair<_b, int> > types;
- any<requirements, _a> ptr(&array[0], static_binding<types>());
- any<requirements, _b> idx(2, static_binding<types>());
+ any<requirements, _a> ptr(&array[0], make_binding<types>());
+ any<requirements, _b> idx(2, make_binding<types>());
any<requirements, _a> x(ptr + idx);
// x now holds array + 2
/*`
- Here the arguments of `+` are no longer the same.
- What we require is that the dynamic bindings of
- the two arguments to `+` must map the placeholders
- `_a` and `_b` to the same types.
+ Now that the arguments of `+` aren't the same type,
+ we require that both arguments agree that `_a` maps
+ to `int*` and that `_b` maps to `int`.
We can also use __tuple to avoid having to
- write out the map out explicitly.
+ write out the map out explicitly. __tuple is
+ just a convienience class that combines the
+ placeholder bindings it gets from all its arguments.
*/
tuple<requirements, _a, _b> t(&array[0], 2);
any<requirements, _a> y(get<0>(t) + get<1>(t));
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk