| <?xml version="1.0" ?> |
| <concept name="Domain" category="utility"> |
| <!-- |
| Copyright 2010 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="Domain" role="domain-type" /> |
| <param name="Expr" role="expression-type" /> |
| <param name="Object" role="object-type" /> |
| |
| <models-sentence> |
| The type <arg num="1" /> must be a model of <self/>. It also |
| models Unary Polymorphic Function. |
| </models-sentence> |
| |
| <models-sentence> |
| The type <arg num="2" /> must be a model of <conceptname>Expr</conceptname> |
| </models-sentence> |
| |
| <description> |
| <para> |
| A Domain creates an association between expressions and a so-called |
| generator, which is a function that maps an expression in the default |
| domain to an equivalent expression in this Domain. It also associates |
| an expression with a grammar, to which all expressions within this |
| Domain must conform. |
| </para> |
| </description> |
| |
| <notation variables="d"> |
| <sample-value> |
| <type name="Domain" /> |
| </sample-value> |
| </notation> |
| |
| <notation variables="e"> |
| <sample-value> |
| <type name="Expr" /> |
| </sample-value> |
| </notation> |
| |
| <notation variables="o"> |
| <sample-value> |
| <type name="Object" /> |
| </sample-value> |
| </notation> |
| |
| <associated-type name="proto_grammar"> |
| <get-member-type name="proto_grammar"> |
| <type name="Domain"/> |
| </get-member-type> |
| <description> |
| <simpara>The grammar to which every expression in this Domain |
| must conform.</simpara> |
| </description> |
| </associated-type> |
| |
| <associated-type name="proto_generator"> |
| <get-member-type name="proto_generator"> |
| <type name="Domain"/> |
| </get-member-type> |
| <description> |
| <simpara> |
| A Unary Polymorphic Function that accepts expressions in the |
| default domain and emits expressions in this Domain. |
| </simpara> |
| </description> |
| </associated-type> |
| |
| <associated-type name="proto_super_domain"> |
| <get-member-type name="proto_super_domain"> |
| <type name="Domain"/> |
| </get-member-type> |
| <description> |
| <simpara> |
| The Domain that is a super-domain of this domain, if |
| any such domain exists. If not, it is some unspecified |
| type. |
| </simpara> |
| </description> |
| </associated-type> |
| |
| <associated-type name="result_type"> |
| <get-member-type name="type"> |
| <apply-template name="boost::result_of"> |
| <type name="Domain(Expr)"/> |
| </apply-template> |
| </get-member-type> |
| <description> |
| <simpara> |
| The type of the result of applying |
| <computeroutput>proto_generator</computeroutput> to |
| the specified expression type. The result is required to |
| model <conceptname>Expr</conceptname>. The domain type |
| associated with <computeroutput>result_type</computeroutput> |
| (<computeroutput>result_type::proto_domain</computeroutput>) |
| is required to be the same type as this Domain. |
| </simpara> |
| </description> |
| </associated-type> |
| |
| <associated-type name="as_expr_result_type"> |
| <get-member-type name="result_type"> |
| <apply-template name="Domain::as_expr"> |
| <type name="Object"/> |
| </apply-template> |
| </get-member-type> |
| <description> |
| <simpara> |
| The result of converting some type to a Proto expression |
| type in this domain. This is used, for instance, when |
| calculating the type of a variable to hold a Proto |
| expression. |
| <computeroutput>as_expr_result_type</computeroutput> |
| models |
| <computeroutput><conceptname>Expr</conceptname></computeroutput>. |
| </simpara> |
| </description> |
| </associated-type> |
| |
| <associated-type name="as_child_result_type"> |
| <get-member-type name="result_type"> |
| <apply-template name="Domain::as_child"> |
| <type name="Object"/> |
| </apply-template> |
| </get-member-type> |
| <description> |
| <simpara> |
| The result of converting some type to a Proto expression |
| type in this domain. This is used, for instance, to |
| compute the type of an object suitable for storage |
| as a child in an expression tree. |
| <computeroutput>as_child_result_type</computeroutput> |
| models |
| <computeroutput><conceptname>Expr</conceptname></computeroutput>. |
| </simpara> |
| </description> |
| </associated-type> |
| |
| <valid-expression name="Apply Generator"> |
| <apply-function name="d"> |
| <sample-value> |
| <type name="Expr"/> |
| </sample-value> |
| </apply-function> |
| <return-type> |
| <require-same-type testable="yes"> |
| <type name="result_type"/> |
| </require-same-type> |
| </return-type> |
| <semantics> |
| The result of applying <computeroutput>proto_generator</computeroutput> |
| to the specified expression. |
| </semantics> |
| </valid-expression> |
| |
| <valid-expression name="As Expression"> |
| <apply-function name="Domain::as_expr< Object >()"> |
| <sample-value> |
| <type name="Object"/> |
| </sample-value> |
| </apply-function> |
| <return-type> |
| <require-same-type testable="yes"> |
| <type name="as_expr_result_type"/> |
| </require-same-type> |
| </return-type> |
| <semantics> |
| The result of converting some object to a Proto expression |
| in this domain. It returns a Proto expression object that |
| is suitable for storage in a variable. It should return a |
| new object, which may be a copy of the object passed in. |
| </semantics> |
| </valid-expression> |
| |
| <valid-expression name="As Child"> |
| <apply-function name="Domain::as_child< Object >()"> |
| <sample-value> |
| <type name="Object"/> |
| </sample-value> |
| </apply-function> |
| <return-type> |
| <require-same-type testable="yes"> |
| <type name="as_child_result_type"/> |
| </require-same-type> |
| </return-type> |
| <semantics> |
| The result of converting some object to a Proto expression |
| in this domain. It returns an object suitable for storage |
| as a child in an expression tree, which may simply be a |
| reference to the object passed in. |
| </semantics> |
| </valid-expression> |
| |
| <example-model> |
| <type name="boost::proto::default_domain" /> |
| </example-model> |
| |
| </concept> |