cython

Форк
0
/
cpp_scoped_enums.pyx 
136 строк · 2.2 Кб
1
# mode: run
2
# tag: cpp, cpp11
3

4
from libcpp.limits cimport numeric_limits
5

6
cdef extern from *:
7
    """
8
    enum class Enum1 {
9
        Item1,
10
        Item2
11
    };
12
    """
13
    cdef enum class Enum1:
14
        Item1
15
        Item2
16

17

18
cdef extern from * namespace "Namespace1":
19
    """
20
    namespace Namespace1 {
21
        enum class Enum2 {
22
            Item1,
23
            Item2
24
        };
25
    }
26
    """
27
    cdef enum class Enum2:
28
        Item1
29
        Item2
30

31

32
cdef enum class Enum3(int):
33
    a = 1
34
    b = 2
35

36

37
cdef extern from *:
38
    """
39
    enum class sorted
40
    {
41
        a = 1,
42
        b = 0
43
    };
44
    """
45
    cdef enum class Enum4 "sorted":
46
        a
47
        b
48

49

50
cdef extern from *:
51
    """
52
    #include <limits>
53

54
    enum class LongIntEnum : long int {
55
        val = std::numeric_limits<long int>::max(),
56
    };
57
    """
58
    enum class LongIntEnum(long int):
59
        val
60

61

62
def test_compare_enums():
63
    """
64
    >>> test_compare_enums()
65
    (True, True, False, False)
66
    """
67
    cdef Enum1 x, y
68
    x = Enum1.Item1
69
    y = Enum1.Item2
70

71
    return (
72
        x == Enum1.Item1,
73
        y == Enum1.Item2,
74
        x == Enum1.Item2,
75
        y == Enum1.Item1
76
    )
77

78
        
79
def test_compare_namespace_enums():
80
    """
81
    >>> test_compare_enums()
82
    (True, True, False, False)
83
    """
84
    cdef Enum2 z, w
85
    
86
    z = Enum2.Item1
87
    w = Enum2.Item2
88

89
    return (
90
        z == Enum2.Item1,
91
        w == Enum2.Item2,
92
        z == Enum2.Item2,
93
        w == Enum2.Item1
94
    )
95

96

97
def test_coerce_to_from_py_value(object i):
98
    """
99
    >>> test_coerce_to_from_py_value(1)
100
    (True, False)
101

102
    >>> test_coerce_to_from_py_value(2)
103
    (False, True)
104

105
    >>> test_coerce_to_from_py_value(3)
106
    (False, False)
107

108
    >>> test_coerce_to_from_py_value(11111111111111111111111111111111111111111111)
109
    Traceback (most recent call last):
110
    OverflowError: Python int too large to convert to C long
111
    """
112
    cdef Enum3 x = i
113
    y = Enum3.b
114

115
    return (
116
        x == Enum3.a,
117
        y == int(i)
118
    )
119

120

121
def test_reserved_cname():
122
    """
123
    >>> test_reserved_cname()
124
    True
125
    """
126
    cdef Enum4 x = Enum4.a
127
    return Enum4.a == int(1)
128

129

130
def test_large_enum():
131
    """
132
    >>> test_large_enum()
133
    True
134
    """
135
    long_max = int(numeric_limits[long].max())
136
    return LongIntEnum.val == long_max
137

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.