1# mode: run
2# tag: cpp, cpp11
3
4# cython: language_level=3
5
6from libcpp.set cimport set
7from libcpp.unordered_set cimport unordered_set
8from libcpp.utility cimport pair
9
10def test_set_insert(vals):
11    """
12    >>> test_set_insert([1,2,2,3, -1])
13    [-1, 1, 2, 3]
14    """
15    cdef set[int] s = set[int]()
16    cdef pair[set[int].iterator, bint] ret
17    for v in vals:
18        ret = s.insert(v)
19    return [item for item in s]
20
21def test_set_insert_it(vals):
22    """
23    >>> test_set_insert_it([1,2,2,3, -1])
24    [-1, 1, 2, 3]
25    """
26    cdef unordered_set[int] us = unordered_set[int]()
27    cdef set[int] s = set[int]()
28    for v in vals:
29        us.insert(v)
30    s.insert(us.begin(), us.end())
31    return [item for item in s]
32
33def test_set_count(vals, to_find):
34    """
35    >>> test_set_count([1,2,2,3, -1], 1)
36    1
37    >>> test_set_count([1,2,2,3, -1], 2)
38    1
39    """
40    cdef set[int] s = set[int]()
41    for v in vals:
42        s.insert(v)
43    return s.count(to_find)
44
45def test_set_erase(vals, int to_remove):
46    """
47    >>> test_set_erase([1,2,2,3, -1], 1)
48    [-1, 2, 3]
49    >>> test_set_erase([1,2,2,3, -1], 2)
50    [-1, 1, 3]
51    """
52    cdef set[int] s = set[int]()
53    cdef size_t ret
54    for v in vals:
55        s.insert(v)
56    ret = s.erase(to_remove)
57    return [item for item in s]
58
59def test_set_find_erase(vals, to_remove):
60    """
61    >>> test_set_find_erase([1,2,2,3, -1], 1)
62    [-1, 2, 3]
63    >>> test_set_find_erase([1,2,2,3, -1], 2)
64    [-1, 1, 3]
65    """
66    cdef set[int] s = set[int]()
67    cdef set[int].iterator it
68    for v in vals:
69        s.insert(v)
70    it = s.find(to_remove)
71    it = s.erase(it)
72    return [item for item in s]
73
74
75def test_unordered_set_insert(vals):
76    """
77    >>> test_unordered_set_insert([1,2,2,3, -1])
78    [-1, 1, 2, 3]
79    """
80    cdef unordered_set[int] us = unordered_set[int]()
81    cdef pair[unordered_set[int].iterator, bint] ret
82    for v in vals:
83        ret = us.insert(v)
84    return sorted([item for item in us])
85
86def test_unordered_set_insert_it(vals):
87    """
88    >>> test_unordered_set_insert_it([1,2,2,3, -1])
89    [-1, 1, 2, 3]
90    """
91    cdef set[int] s = set[int]()
92    cdef unordered_set[int] us = unordered_set[int]()
93    for v in vals:
94        s.insert(v)
95    us.insert(s.begin(), s.end())
96    return sorted([item for item in us])
97
98def test_unordered_set_count(vals, to_find):
99    """
100    >>> test_unordered_set_count([1,2,2,3, -1], 1)
101    1
102    >>> test_unordered_set_count([1,2,2,3, -1], 2)
103    1
104    """
105    cdef unordered_set[int] us = unordered_set[int]()
106    for v in vals:
107        us.insert(v)
108    return us.count(to_find)
109
110def test_unordered_set_erase(vals, int to_remove):
111    """
112    >>> test_unordered_set_erase([1,2,2,3, -1], 1)
113    [-1, 2, 3]
114    >>> test_unordered_set_erase([1,2,2,3, -1], 2)
115    [-1, 1, 3]
116    """
117    cdef unordered_set[int] us = unordered_set[int]()
118    cdef size_t ret
119    for v in vals:
120        us.insert(v)
121    ret = us.erase(to_remove)
122    return sorted([item for item in us])
123
124def test_unordered_set_find_erase(vals, to_remove):
125    """
126    >>> test_unordered_set_find_erase([1,2,2,3, -1], 1)
127    [-1, 2, 3]
128    >>> test_unordered_set_find_erase([1,2,2,3, -1], 2)
129    [-1, 1, 3]
130    """
131    cdef unordered_set[int] us = unordered_set[int]()
132    cdef unordered_set[int].iterator it
133    for v in vals:
134        us.insert(v)
135    it = us.find(to_remove)
136    it = us.erase(it)
137    return sorted([item for item in us])
138