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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
# tag: cpp, no-cpp-locals
import cython
cimport libcpp
# cimport libcpp.atomic
cimport libcpp.deque
cimport libcpp.list
cimport libcpp.map
cimport libcpp.pair
cimport libcpp.queue
cimport libcpp.set
cimport libcpp.stack
cimport libcpp.vector
cimport libcpp.complex
cimport libcpp.limits
# from libcpp.atomic cimport *
from libcpp.deque cimport *
from libcpp.list cimport *
from libcpp.map cimport *
from libcpp.pair cimport *
from libcpp.queue cimport *
from libcpp.set cimport *
from libcpp.stack cimport *
from libcpp.vector cimport *
from libcpp.complex cimport *
from libcpp.limits cimport *
# cdef libcpp.atomic.atomc[int] a1 = atomic[int]()
cdef libcpp.deque.deque[int] d1 = deque[int]()
cdef libcpp.list.list[int] l1 = list[int]()
cdef libcpp.map.map[int,int] m1 = map[int,int]()
cdef libcpp.pair.pair[int,int] p1 = pair[int,int](1,2)
cdef libcpp.queue.queue[int] q1 = queue[int]()
cdef libcpp.set.set[int] s1 = set[int]()
cdef libcpp.stack.stack[int] t1 = stack[int]()
cdef libcpp.vector.vector[int] v1 = vector[int]()
cdef deque[int].iterator id1 = d1.begin()
cdef deque[int].iterator id2 = d1.end()
cdef deque[int].reverse_iterator rid1 = d1.rbegin()
cdef deque[int].reverse_iterator rid2 = d1.rend()
cdef list[int].iterator il1 = l1.begin()
cdef list[int].iterator il2 = l1.end()
cdef list[int].reverse_iterator ril1 = l1.rbegin()
cdef list[int].reverse_iterator ril2 = l1.rend()
cdef map[int,int].iterator im1 = m1.begin()
cdef map[int,int].iterator im2 = m1.end()
cdef map[int,int].reverse_iterator rim1 = m1.rbegin()
cdef map[int,int].reverse_iterator rim2 = m1.rend()
cdef pair[map[int,int].iterator, bint] pimb = m1.insert(p1)
cdef set[int].iterator is1 = s1.begin()
cdef set[int].iterator is2 = s1.end()
cdef set[int].reverse_iterator ris1 = s1.rbegin()
cdef set[int].reverse_iterator ris2 = s1.rend()
cdef pair[set[int].iterator, bint] pisb = s1.insert(4)
cdef vector[int].iterator iv1 = v1.begin()
cdef vector[int].iterator iv2 = v1.end()
cdef vector[int].reverse_iterator riv1 = v1.rbegin()
cdef vector[int].reverse_iterator riv2 = v1.rend()
def test_vector_coercion(*args):
"""
>>> test_vector_coercion(1.75)
[1.75]
>>> test_vector_coercion(1, 10, 100)
[1.0, 10.0, 100.0]
"""
v = new vector[double]()
for a in args:
v.push_back(a)
return [v[0][i] for i in range(v.size())]
def test_const_vector(*args):
"""
>>> test_const_vector(1.75)
[1.75]
>>> test_const_vector(1, 10, 100)
[1.0, 10.0, 100.0]
"""
cdef vector[double] v
for a in args:
v.push_back(a)
return const_vector_to_list(v)
cdef const_vector_to_list(const vector[double]& cv):
cdef vector[double].const_iterator iter = cv.const_begin()
cdef lst = []
while iter != cv.const_end():
lst.append(cython.operator.dereference(iter))
cython.operator.preincrement(iter)
return lst
cdef double dmax = numeric_limits[double].max()
cdef double dmin = numeric_limits[double].min()
cdef double deps = numeric_limits[double].epsilon()
cdef double dqnan = numeric_limits[double].quiet_NaN()
cdef double dsnan = numeric_limits[double].signaling_NaN()
cdef double dinf = numeric_limits[double].infinity()
cdef int imax = numeric_limits[int].max()
cdef int imin = numeric_limits[int].min()
cdef int ieps = numeric_limits[int].epsilon()
cdef int iqnan = numeric_limits[int].quiet_NaN()
cdef int isnan = numeric_limits[int].signaling_NaN()
cdef int iinf = numeric_limits[int].infinity()
#API checks for containers with std::allocator declared
from libcpp.memory cimport allocator
cdef libcpp.vector.vector[int,allocator[int]] vec_alloc_int = libcpp.vector.vector[int,allocator[int]](10,1)
assert vec_alloc_int.size() == 10
cdef libcpp.list.list[int,allocator[int]] list_alloc_int = libcpp.list.list[int,allocator[int]](10,1)
assert list_alloc_int.size() == 10
##Something about the default params breaks the auto-conversion...
def convert_to_vector(I):
"""
>>> convert_to_vector([1,2,3,4])
"""
cdef vector[int] x = I
def complex_operators():
"""
>>> complex_operators()
[-1.0, 0.0, 0.0, 2.0, 0.0, 2.0]
"""
cdef libcpp.complex.complex[double] a = libcpp.complex.complex[double](0.0,1.0)
cdef libcpp.complex.complex[double] r1=a*a
cdef libcpp.complex.complex[double] r2=a*2.0
cdef libcpp.complex.complex[double] r3=2.0*a
return [r1.real(), r1.imag(), r2.real(), r2.imag(), r3.real(), r3.imag()]
def pair_comparison():
"""
>>> pair_comparison()
[False, True, False, True, False]
"""
cdef pair[double, double] p1 = pair[double, double](1.0,2.0)
cdef pair[double, double] p2 = pair[double, double](2.0,2.0)
return [p1==p2,p1==p1,p1>p2,p1<p2,p2>p2]
|