File: pycomp.hpp

package info (click to toggle)
libdnf 0.75.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,468 kB
  • sloc: cpp: 48,297; xml: 1,638; python: 1,537; ansic: 1,223; sql: 227; sh: 54; makefile: 39
file content (77 lines) | stat: -rw-r--r-- 2,579 bytes parent folder | download | duplicates (4)
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
/*
 * Copyright (C) 2012-2013 Red Hat, Inc.
 *
 * Licensed under the GNU Lesser General Public License Version 2.1
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/* module for Python 2/3 C API compatibility */

#ifndef PYCOMP_H
#define PYCOMP_H

// Python 3 and newer types compatibility
#if PY_MAJOR_VERSION >= 3
    #define PyInt_Check PyLong_Check
    #define PyString_FromString PyUnicode_FromString
    #define PyString_FromFormat PyUnicode_FromFormat
    #define PyString_Check PyBytes_Check
    #define Py_TPFLAGS_HAVE_ITER 0
#endif

// uniform way to define Python 2 and Python 3 modules
#if PY_MAJOR_VERSION >= 3
    #define PYCOMP_MOD_ERROR_VAL NULL
    #define PYCOMP_MOD_SUCCESS_VAL(val) val
    #define PYCOMP_MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
    #define PYCOMP_MOD_DEF(ob, name, methods) \
          static struct PyModuleDef moduledef = { \
            PyModuleDef_HEAD_INIT, name, NULL, -1, methods, }; \
          ob = PyModule_Create(&moduledef);
#else
    #define PYCOMP_MOD_ERROR_VAL
    #define PYCOMP_MOD_SUCCESS_VAL(val)
    #define PYCOMP_MOD_INIT(name) extern "C" void init##name(void)
    #define PYCOMP_MOD_DEF(ob, name, methods) \
          ob = Py_InitModule(name, methods);
#endif


// Python 2.5 and older compatibility
#ifndef PyVarObject_HEAD_INIT
    #define PyVarObject_HEAD_INIT(type, size) \
        PyObject_HEAD_INIT(type) size,
#endif

#include <string>

/**
* @brief bytes, basic string or unicode string in Python 2/3 to c string converter
*/
class PycompString {
public:
    PycompString() = default;
    explicit PycompString(PyObject * str);
    const std::string & getString() const noexcept { return cppString; }
    const char * getCString() const noexcept { return isNull ? nullptr : cppString.c_str(); }
private:
    bool isNull{true};
    std::string cppString;
};

PYCOMP_MOD_INIT(_hawkey);

#endif // PYCOMP_H