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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
# mode: run
# tag: cpp, cpp11
# cython: language_level=3
from libcpp.map cimport map
from libcpp.unordered_map cimport unordered_map
from libcpp.utility cimport pair
def test_map_insert(vals):
"""
>>> test_map_insert([(1,1),(2,2),(2,2),(3,3),(-1,-1)])
[(-1, -1), (1, 1), (2, 2), (3, 3)]
"""
cdef map[int,int] m = map[int, int]()
cdef pair[map[int, int].iterator, bint] ret
for v in vals:
ret = m.insert(v)
return [ (item.first, item.second) for item in m ]
def test_map_insert_it(vals):
"""
>>> test_map_insert_it([(1,1),(2,2),(2,2),(3,3),(-1,-1)])
[(-1, -1), (1, 1), (2, 2), (3, 3)]
"""
cdef unordered_map[int,int] um = unordered_map[int,int]()
cdef map[int,int] m = map[int,int]()
for k, v in vals:
um.insert(pair[int,int](k, v))
m.insert(um.begin(), um.end())
return [ (item.first, item.second) for item in m ]
def test_const_map_insert_it(vals):
"""
>>> test_const_map_insert_it([(1,1),(2,2),(2,2),(3,3),(-1,-1)])
[(-1, -1), (1, 1), (2, 2), (3, 3)]
"""
cdef unordered_map[int,int] um = unordered_map[int,int]()
cdef map[int,int] m = map[int,int]()
for k, v in vals:
um.insert(pair[int,int](k, v))
m.insert(um.cbegin(), um.cend())
return [ (item.first, item.second) for item in m ]
def test_map_count(vals, to_find):
"""
>>> test_map_count([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 1)
1
>>> test_map_count([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 2)
1
"""
cdef map[int,int] m = map[int,int]()
for v in vals:
m.insert(v)
return m.count(to_find)
def test_map_erase(vals, int to_remove):
"""
>>> test_map_erase([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 1)
[(-1, -1), (2, 2), (3, 3)]
>>> test_map_erase([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 2)
[(-1, -1), (1, 1), (3, 3)]
"""
cdef map[int,int] m = map[int,int]()
cdef size_t ret
for v in vals:
m.insert(v)
ret = m.erase(to_remove)
return [ (item.first, item.second) for item in m ]
def test_map_find_erase(vals, to_remove):
"""
>>> test_map_find_erase([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 1)
[(-1, -1), (2, 2), (3, 3)]
>>> test_map_find_erase([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 2)
[(-1, -1), (1, 1), (3, 3)]
"""
cdef map[int,int] m = map[int,int]()
cdef map[int,int].iterator it
for v in vals:
m.insert(v)
it = m.find(to_remove)
it = m.erase(it)
return [ (item.first, item.second) for item in m ]
def test_unordered_map_insert(vals):
"""
>>> test_unordered_map_insert([(1,1),(2,2),(2,2),(3,3),(-1,-1)])
[(-1, -1), (1, 1), (2, 2), (3, 3)]
"""
cdef unordered_map[int,int] um = unordered_map[int,int]()
cdef pair[unordered_map[int,int].iterator, bint] ret
for v in vals:
ret = um.insert(v)
return sorted([ (item.first, item.second) for item in um ])
def test_unordered_map_insert_it(vals):
"""
>>> test_unordered_map_insert_it([(1,1),(2,2),(2,2),(3,3),(-1,-1)])
[(-1, -1), (1, 1), (2, 2), (3, 3)]
"""
cdef map[int,int] m = map[int,int]()
cdef unordered_map[int,int] um = unordered_map[int,int]()
for v in vals:
m.insert(v)
um.insert(m.begin(), m.end())
return sorted([ (item.first, item.second) for item in um ])
def test_const_unordered_map_insert_it(vals):
"""
>>> test_const_unordered_map_insert_it([(1,1),(2,2),(2,2),(3,3),(-1,-1)])
[(-1, -1), (1, 1), (2, 2), (3, 3)]
"""
cdef map[int,int] m = map[int,int]()
cdef unordered_map[int,int] um = unordered_map[int,int]()
for v in vals:
m.insert(v)
um.insert(m.cbegin(), m.cend())
return sorted([ (item.first, item.second) for item in um ])
def test_unordered_map_count(vals, to_find):
"""
>>> test_unordered_map_count([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 1)
1
>>> test_unordered_map_count([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 2)
1
"""
cdef unordered_map[int,int] um = unordered_map[int,int]()
for v in vals:
um.insert(v)
return um.count(to_find)
def test_unordered_map_erase(vals, int to_remove):
"""
>>> test_unordered_map_erase([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 1)
[(-1, -1), (2, 2), (3, 3)]
>>> test_unordered_map_erase([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 2)
[(-1, -1), (1, 1), (3, 3)]
"""
cdef unordered_map[int,int] um = unordered_map[int,int]()
cdef size_t ret
for v in vals:
um.insert(v)
ret = um.erase(to_remove)
return sorted([ (item.first, item.second) for item in um ])
def test_unordered_map_find_erase(vals, to_remove):
"""
>>> test_unordered_map_find_erase([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 1)
[(-1, -1), (2, 2), (3, 3)]
>>> test_unordered_map_find_erase([(1,1),(2,2),(2,2),(3,3),(-1,-1)], 2)
[(-1, -1), (1, 1), (3, 3)]
"""
cdef unordered_map[int,int] um = unordered_map[int,int]()
cdef unordered_map[int,int].iterator it
for v in vals:
um.insert(v)
it = um.find(to_remove)
it = um.erase(it)
return sorted([ item for item in um ])
def test_iterator_stack_allocated():
"""
https://github.com/cython/cython/issues/4657 - mainly a compile test showing
that const iterators can be stack allocated
>>> test_iterator_stack_allocated()
"""
cdef map[int,int] mymap = map[int,int]()
cdef unordered_map[int,int] myumap = unordered_map[int,int]()
cdef int ckey = 5
it = mymap.const_find(ckey)
assert it == mymap.const_end()
uit = myumap.const_find(ckey)
assert uit == myumap.const_end()
|