aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/python/lib/core/strings.i
blob: c88e426a54c0b305deb3da7ba52941b591f5af02 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Wrapper functions to provide a scripting-language-friendly interface
// to our string libraries.
//
// NOTE: as of 2005-01-13, this SWIG file is not used to generate a pywrap
//       library for manipulation of various string-related types or access
//       to the special string functions (Python has plenty). This SWIG file
//       should be %import'd so that other SWIG wrappers have proper access
//       to the types in //strings (such as the StringPiece object). We may
//       generate a pywrap at some point in the future.
//
// NOTE: (Dan Ardelean) as of 2005-11-15 added typemaps to convert Java String
//       arguments to C++ StringPiece& objects. This is required because a
//       StringPiece class does not make sense - the code SWIG generates for a
//       StringPiece class is useless, because it releases the buffer set in
//       StringPiece after creating the object. C++ StringPiece objects rely on
//       the buffer holding the data being allocated externally.

// NOTE: for now, we'll just start with what is needed, and add stuff
//       as it comes up.

%{
#include "tensorflow/core/lib/core/stringpiece.h"
%}

%typemap(typecheck) tensorflow::StringPiece = char *;
%typemap(typecheck) const tensorflow::StringPiece & = char *;

// "tensorflow::StringPiece" arguments can be provided by a simple Python 'str' string
// or a 'unicode' object. If 'unicode', it's translated using the default
// encoding, i.e., sys.getdefaultencoding(). If passed None, a tensorflow::StringPiece
// of zero length with a NULL pointer is provided.
%typemap(in) tensorflow::StringPiece {
  if ($input != Py_None) {
    char * buf;
    Py_ssize_t len;
%#if PY_VERSION_HEX >= 0x03030000
    /* Do unicode handling as PyBytes_AsStringAndSize doesn't in Python 3. */
    if (PyUnicode_Check($input)) {
      buf = PyUnicode_AsUTF8AndSize($input, &len);
      if (buf == NULL)
        SWIG_fail;
    } else {
%#elif PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 3
%#  error "Unsupported Python 3.x C API version (3.3 or later required)."
%#endif
      if (PyBytes_AsStringAndSize($input, &buf, &len) == -1) {
        // Python has raised an error (likely TypeError or UnicodeEncodeError).
        SWIG_fail;
      }
%#if PY_VERSION_HEX >= 0x03030000
    }
%#endif
    $1.set(buf, len);
  }
}

// "const tensorflow::StringPiece&" arguments can be provided the same as
// "tensorflow::StringPiece", whose typemap is defined above.
%typemap(in) const tensorflow::StringPiece & (tensorflow::StringPiece temp) {
  if ($input != Py_None) {
    char * buf;
    Py_ssize_t len;
%#if PY_VERSION_HEX >= 0x03030000
    /* Do unicode handling as PyBytes_AsStringAndSize doesn't in Python 3. */
    if (PyUnicode_Check($input)) {
      buf = PyUnicode_AsUTF8AndSize($input, &len);
      if (buf == NULL)
        SWIG_fail;
    } else {
%#elif PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 3
%#  error "Unsupported Python 3.x C API version (3.3 or later required)."
%#endif
      if (PyBytes_AsStringAndSize($input, &buf, &len) == -1) {
        // Python has raised an error (likely TypeError or UnicodeEncodeError).
        SWIG_fail;
      }
%#if PY_VERSION_HEX >= 0x03030000
    }
%#endif
    temp.set(buf, len);
  }
  $1 = &temp;
}

// C++ functions returning tensorflow::StringPiece will simply return bytes in Python,
// or None if the StringPiece contained a NULL pointer.
%typemap(out) tensorflow::StringPiece {
  if ($1.data()) {
    $result = PyString_FromStringAndSize($1.data(), $1.size());
  } else {
    Py_INCREF(Py_None);
    $result = Py_None;
  }
}