| <?xml version="1.0" ?> |
| <concept name="ObjectTransform" category="utility"> |
| <!-- |
| Copyright 2008 Eric Niebler |
| |
| 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) |
| --> |
| <param name="Obj" role="object-type" /> |
| <param name="Tn" role="transform-type" /> |
| <param name="Expr" role="expression-type" /> |
| <param name="State" role="state-type" /> |
| <param name="Data" role="data-type" /> |
| |
| <models-sentence> |
| The type <arg num="1" /> must be a model of <conceptname name="Regular"/>, or |
| else it is a template specialization representing a lamda expression that, |
| subsequent to type substitution, is a type that models <conceptname name="Regular"/>. |
| The type <arg num="2" /> must be a model of <conceptname name="Transform"/>. |
| </models-sentence> |
| |
| <description> |
| <para> |
| An ObjectTransform is a function type or a function |
| pointer type where the return type Obj is a |
| an object type and the arguments are |
| Transforms. is_callable< Obj >::value |
| must be false. The ObjectTransform, when applied, |
| has the effect of constructing an object of type |
| Obj' (see below), passing as construction parameters |
| the result(s) of applying transform(s) Tn. |
| </para> |
| <para> |
| The type Obj may be a template specialization representing |
| a compile-time lambda expression. For instance, if Obj is |
| std::pair< proto::_value, int >, the result type of the |
| ObjectTransform is computed by replacing the type proto::_value |
| with the result of applying the proto::_value transform. For |
| given types Obj, Expr, State and Data, we can say that the |
| type Obj' represents the type Obj after all nested transforms |
| have been replaced with the results of applying the transforms |
| with Expr, State and Data as transform arguments. |
| </para> |
| <para> |
| If the type Obj is not a template specialization representing |
| a compile-time lambda expression, then the result type Obj' is |
| the same as Obj. |
| </para> |
| </description> |
| |
| <notation variables="expr"> |
| <sample-value> |
| <type name="Expr" /> |
| </sample-value> |
| </notation> |
| |
| <notation variables="state"> |
| <sample-value> |
| <type name="State" /> |
| </sample-value> |
| </notation> |
| |
| <notation variables="data"> |
| <sample-value> |
| <type name="Data" /> |
| </sample-value> |
| </notation> |
| |
| <valid-expression name="Apply Transform"> |
| <apply-function name="when< _, Obj(Tn...)>()"> |
| <sample-value> |
| <type name="Expr" /> |
| </sample-value> |
| <sample-value> |
| <type name="State" /> |
| </sample-value> |
| <sample-value> |
| <type name="Data" /> |
| </sample-value> |
| </apply-function> |
| <return-type> |
| <require-same-type testable="yes"> |
| <type name="Obj'"/> |
| </require-same-type> |
| </return-type> |
| <semantics>Applies the transform.</semantics> |
| </valid-expression> |
| |
| <example-model> |
| <type name="std::pair< boost::proto::_value, int >(boost::proto::_value, int())" /> |
| </example-model> |
| |
| </concept> |