<?xml version="1.0" encoding="UTF-8"?>
<typesystem package="minimal">
    <primitive-type name="bool"/>
    <primitive-type name="int"/>

    <primitive-type name="MinBool" target-lang-api-name="PyBool" default-constructor="MinBool(false)">
        <include file-name="minbool.h" location="global"/>
        <conversion-rule>
            <native-to-target>
            return PyBool_FromLong(%in.value());
            </native-to-target>
            <target-to-native>
                <add-conversion type="PyBool" check="PyBool_Check(%in)">
                %out = %OUTTYPE(%in == Py_True);
                </add-conversion>
            </target-to-native>
        </conversion-rule>
    </primitive-type>

    <container-type name="std::list" type="list">
        <include file-name="list" location="global"/>
        <conversion-rule>
            <native-to-target>
            PyObject* %out = PyList_New((int) %in.size());
            %INTYPE::const_iterator it = %in.begin();
            for (int idx = 0; it != %in.end(); ++it, ++idx) {
                %INTYPE_0 cppItem(*it);
                PyList_SET_ITEM(%out, idx, %CONVERTTOPYTHON[%INTYPE_0](cppItem));
            }
            return %out;
            </native-to-target>
            <target-to-native>
                <add-conversion type="PySequence">
                Shiboken::AutoDecRef seq(PySequence_Fast(%in, 0));
                for (int i = 0; i &lt; PySequence_Fast_GET_SIZE(seq.object()); i++) {
                    PyObject* pyItem = PySequence_Fast_GET_ITEM(seq.object(), i);
                    %OUTTYPE_0 cppItem = %CONVERTTOCPP[%OUTTYPE_0](pyItem);
                    %out.push_back(cppItem);
                }
                </add-conversion>
            </target-to-native>
        </conversion-rule>
    </container-type>

    <object-type name="Obj"/>
    <value-type name="Val">
        <enum-type name="ValEnum"/>
    </value-type>
    <value-type name="ListUser"/>
    <value-type name="MinBoolUser"/>

    <container-type name="std::vector" type="vector">
        <include file-name="vector" location="global"/>
        <conversion-rule>
            <native-to-target>
            %INTYPE::size_type vectorSize = %in.size();
            PyObject* %out = PyList_New((int) vectorSize);
            for (%INTYPE::size_type idx = 0; idx &lt; vectorSize; ++idx) {
                %INTYPE_0 cppItem(%in[idx]);
                PyList_SET_ITEM(%out, idx, %CONVERTTOPYTHON[%INTYPE_0](cppItem));
            }
            return %out;
            </native-to-target>
            <target-to-native>
                <add-conversion type="PySequence">
                Shiboken::AutoDecRef seq(PySequence_Fast(%in, 0));
                int vectorSize = PySequence_Fast_GET_SIZE(seq.object());
                %out.reserve(vectorSize);
                for (int idx = 0; idx &lt; vectorSize; ++idx ) {
                    PyObject* pyItem = PySequence_Fast_GET_ITEM(seq.object(), idx);
                    %OUTTYPE_0 cppItem = %CONVERTTOCPP[%OUTTYPE_0](pyItem);
                    %out.push_back(cppItem);
                }
                </add-conversion>
            </target-to-native>
        </conversion-rule>
    </container-type>
    <!-- Test wrapping of a typedef -->
    <function signature="arrayFuncInt(std::vector&lt;int&gt;)" />
    <!-- Note manual expansion of the typedef -->
    <function signature="arrayFuncIntTypedef(std::vector&lt;int&gt;)" />

    <function signature="arrayFuncIntReturn(int)" />
    <function signature="arrayFuncIntReturnTypedef(int)" />

    <!-- Test wrapping of a typedef of a typedef -->
    <function signature="arrayFunc(std::vector&lt;int&gt;)" />
    <!-- Note manual expansion of the typedef  -->
    <function signature="arrayFuncTypedef(std::vector&lt;int&gt;)" />

    <function signature="arrayFuncReturn(int)" />
    <function signature="arrayFuncReturnTypedef(int)" />
</typesystem>
