Conversion Rule Tag

conversion-rule

The conversion-rule tag specifies how a primitive-type, a container-type, or a value-type may be converted to and from the native C++ language types to the target language types (see also User Defined Type Conversion).

It is a child of the container-type, primitive-type or value-type and may contain native-to-target or native-to-target child nodes.

<value-type>
    <conversion-rule>
        <native-to-target>
        // Code to convert a native value to a target language object.
        </native-to-target>
        <target-to-native>
            <add-conversion type='TARGETTYPEA' check='TARGETTYPEA_CHECK(%in)'>
            // Code to convert target language type object of type TARGETTYPEA
            // to the C++ native type represented by the value/primitive/container-type.
            </add-conversion>
            <add-conversion type='TARGETTYPEB' check='TARGETTYPEB_CHECK(%in)'>
            // Code to convert target language type object of type TARGETTYPEB
            // to the C++ native type represented by the value/primitive/container-type.
            </add-conversion>
        </target-to-native>
    </conversion-rule>
</value-type>

The code can be inserted directly, via add-conversion (providing snippet functionality) or via insert-template (XML template, see Using Code Templates).

The example above show the structure of a complete conversion rule. Each of the child tags comprising the conversion rule are described in their own sections below.

Note

You can also use the conversion-rule node to specify customized code to convert a function argument between the target language and C++ (see conversion-rule).

native-to-target

The native-to-target tag tells how to convert a native C++ value to its target language equivalent. It is a child of the conversion-rule node. The text inside the tag is a C++ code the takes an input value an does what’s needed to convert it to the output value. insert-template tags may be used to insert commonly repeating code.

<conversion-rule>
    <native-to-target>
    // Code to convert a native value to a target language object.
    </native-to-target>
</conversion-rule>

Use the replace node to modify the template code. Notice that the generator must provide type system variables for the input and output values and types, namely %in, %out, %INTYPE and %OUTTYPE. In the case of container types, %INTYPE refers to the full container type (e.g. “list<int>”) and %INTYPE_0, %INTYPE_1, %INTYPE_#, should be replaced by the types used in the container template (e.g. %INTYPE_0 correspondes to “int” for “list<int>”).

The file and snippet attributes are also supported (see inject-code nodes).

target-to-native

The target-to-native tag encloses at least one, but usually many, conversions from target language values to C++ native values. It is a child of the conversion-rule node and may have one or several add-conversion child nodes. The optional attribute replace tells if the target language to C++ conversions will be added to, or if they will replace the implicit conversions collected by ApiExtractor. The default value for it is yes.

<conversion-rule>
    <target-to-native replace='yes|no'>\
    // List of target to native conversions meant to replace or expand
    // the already existing implicit conversions.
    </target-to-native>
</conversion-rule>

add-conversion

Each add-conversion tag adds a rule for conversion of a target language type, indicated by the type attribute, to the C++ native type represented by the primitive-type, a container-type, or value-type, to which the parent conversion-rule belongs. It is a child of the target-to-native node.

<target-to-native>
    <add-conversion type='TARGETTYPE' check='TARGETTYPECHECK(%in)'>
    // Code to convert target language type object of type TARGETTYPE_A
    // to the C++ native type represented by the value/primitive/container-type.
    </add-conversion>
<target-to-native>

The check attribute tells how a target value should be checked to see if it belongs to the type expected. This attribute is optional, for it can be derived from the type attribute, but it isn’t unusual that some special check is needed. The variables %in, %out, %INTYPE, %INTYPE_#, and %OUTTYPE, must be provided by the generator as in the native-to-target tag.

The file and snippet attributes are also supported (see inject-code nodes).