aboutsummaryrefslogtreecommitdiff
path: root/python/pyarmnn/src/pyarmnn/swig/typemaps/network_optimize.i
blob: 05df82bdd1df63ff6a858eb9c15523362881e81c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
%define %optimize_typemap_out
    %typemap(out) (std::pair<armnn::IOptimizedNetwork*, std::vector<std::string>>) {
        PyObject * network = SWIG_NewPointerObj(SWIG_as_voidptr($1.first), SWIGTYPE_p_armnn__IOptimizedNetwork, SWIG_POINTER_OWN);
        $result = PyTuple_New(2);

        // Convert vector to fixed-size tuple
        std::vector<std::string> strings = $1.second;
        Py_ssize_t size = strings.size();

        // New reference. Need to Py_DECREF
        PyObject* errMsgTuple = PyTuple_New(size);

        if (!errMsgTuple) {
            Py_XDECREF(errMsgTuple);
            return PyErr_NoMemory();
        }

        for (Py_ssize_t i = 0; i < size; i++) {
            // New reference. Need to Py_DECREF
            PyObject *string = PyString_FromString(strings[i].c_str());

            if (!string) {
                Py_XDECREF(string);
                return PyErr_NoMemory();
            }
            PyTuple_SetItem(errMsgTuple, i, string);
        }

        // Create result tuple
        PyTuple_SetItem($result, 0, network);
        PyTuple_SetItem($result, 1, errMsgTuple);
    }
%enddef

%define %clear_optimize_typemap_out
    %typemap(out) (std::pair<armnn::IOptimizedNetwork*, std::vector<std::string>>)
%enddef