summaryrefslogtreecommitdiff
path: root/tests/run/cpp_stl_algo_nonmodifying_sequence_ops.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run/cpp_stl_algo_nonmodifying_sequence_ops.pyx')
-rw-r--r--tests/run/cpp_stl_algo_nonmodifying_sequence_ops.pyx307
1 files changed, 307 insertions, 0 deletions
diff --git a/tests/run/cpp_stl_algo_nonmodifying_sequence_ops.pyx b/tests/run/cpp_stl_algo_nonmodifying_sequence_ops.pyx
new file mode 100644
index 000000000..2b001b5f2
--- /dev/null
+++ b/tests/run/cpp_stl_algo_nonmodifying_sequence_ops.pyx
@@ -0,0 +1,307 @@
+# mode: run
+# tag: cpp, werror, cpp11
+
+from cython.operator cimport dereference as deref
+
+from libcpp cimport bool
+from libcpp.algorithm cimport all_of, any_of, none_of, for_each, count, count_if, mismatch, find, find_if, find_if_not
+from libcpp.algorithm cimport find_end, find_first_of, adjacent_find, search, search_n
+from libcpp.iterator cimport distance
+from libcpp.string cimport string
+from libcpp.vector cimport vector
+
+
+cdef bool is_odd(int i):
+ return i % 2
+
+
+def all_odd(vector[int] values):
+ """
+ Test all_of with is_odd predicate.
+
+ >>> all_odd([3, 5, 7, 11, 13, 17, 19, 23])
+ True
+ >>> all_odd([3, 4])
+ False
+ """
+ return all_of(values.begin(), values.end(), is_odd)
+
+
+def any_odd(vector[int] values):
+ """
+ Test any_of with is_odd predicate.
+
+ >>> any_odd([1, 2, 3, 4])
+ True
+ >>> any_odd([2, 4, 6, 8])
+ False
+ """
+ return any_of(values.begin(), values.end(), is_odd)
+
+
+def none_odd(vector[int] values):
+ """
+ Test none_of with is_odd predicate.
+
+ >>> none_odd([2, 4, 6, 8])
+ True
+ >>> none_odd([1, 2, 3, 4])
+ False
+ """
+ return none_of(values.begin(), values.end(), is_odd)
+
+
+def count_ones(vector[int] values):
+ """
+ Test count.
+
+ >>> count_ones([1, 2, 1, 2])
+ 2
+ """
+ return count(values.begin(), values.end(), 1)
+
+
+cdef void add_one(int &i):
+ # https://github.com/cython/cython/issues/1863
+ (&i)[0] += 1
+
+
+def increment_ints(vector[int] values):
+ """
+ Test for_each.
+
+ >>> increment_ints([3, 4, 2, 8, 15, 267])
+ [4, 5, 3, 9, 16, 268]
+ """
+ for_each(values.begin(), values.end(), &add_one)
+ return values
+
+
+def count_odd(vector[int] values):
+ """
+ Test count_if with is_odd predicate.
+
+ >>> count_odd([1, 2, 3, 4])
+ 2
+ >>> count_odd([2, 4, 6, 8])
+ 0
+ """
+ return count_if(values.begin(), values.end(), is_odd)
+
+
+def mirror_ends(string data):
+ """
+ Test mismatch using cppreference example.
+
+ This program determines the longest substring that is simultaneously found at the very beginning of the given string
+ and at the very end of it, in reverse order (possibly overlapping).
+
+ >>> print(mirror_ends(b'abXYZba').decode('ascii'))
+ ab
+ >>> print(mirror_ends(b'abca').decode('ascii'))
+ a
+ >>> print(mirror_ends(b'aba').decode('ascii'))
+ aba
+ """
+ return string(data.begin(), mismatch(data.begin(), data.end(), data.rbegin()).first)
+
+
+def mismatch_ints(vector[int] values1, vector[int] values2):
+ """
+ Test mismatch(first1, last1, first2).
+
+ >>> mismatch_ints([1, 2, 3], [1, 2, 3])
+ >>> mismatch_ints([1, 2], [1, 2, 3])
+ >>> mismatch_ints([1, 3], [1, 2, 3])
+ (3, 2)
+ """
+ result = mismatch(values1.begin(), values1.end(), values2.begin())
+ if result.first == values1.end():
+ return
+ return deref(result.first), deref(result.second)
+
+
+def is_int_in(vector[int] values, int target):
+ """
+ Test find.
+
+ >>> is_int_in(range(5), 3)
+ True
+ >>> is_int_in(range(5), 10)
+ False
+ """
+ return find(values.begin(), values.end(), target) != values.end()
+
+
+def find_odd(vector[int] values):
+ """
+ Test find_if using is_odd predicate.
+
+ >>> find_odd([2, 3, 4])
+ 3
+ >>> find_odd([2, 4, 6])
+ """
+ result = find_if(values.begin(), values.end(), is_odd)
+ if result != values.end():
+ return deref(result)
+ else:
+ return None
+
+
+def find_even(vector[int] values):
+ """
+ Test find_if_not using is_odd predicate.
+
+ >>> find_even([3, 4, 5])
+ 4
+ >>> find_even([1, 3, 5])
+ """
+ result = find_if_not(values.begin(), values.end(), is_odd)
+ if result != values.end():
+ return deref(result)
+ else:
+ return None
+
+
+def find_last_int_sequence(vector[int] values, vector[int] target):
+ """
+ Test find_end.
+
+ >>> find_last_int_sequence([1, 2, 3, 1, 2, 3], [2, 3])
+ 4
+ >>> find_last_int_sequence([1, 2, 3], [4, 5])
+ """
+ result = find_end(values.begin(), values.end(), target.begin(), target.end())
+ if result != values.end():
+ return distance(values.begin(), result)
+ else:
+ return None
+
+
+cdef bool is_equal(int lhs, int rhs):
+ return lhs == rhs
+
+
+def find_last_int_sequence2(vector[int] values, vector[int] target):
+ """
+ Test find_end (using is_equal predicate).
+
+ >>> find_last_int_sequence2([1, 2, 3, 1, 2, 3], [2, 3])
+ 4
+ >>> find_last_int_sequence2([1, 2, 3], [4, 5])
+ """
+ result = find_end(values.begin(), values.end(), target.begin(), target.end(), &is_equal)
+ if result != values.end():
+ return distance(values.begin(), result)
+ else:
+ return None
+
+
+def find_first_int_in_set(values, target):
+ """
+ Test find_first_of.
+
+ >>> find_first_int_in_set([1, 2, 3, 4, 5], [3, 5])
+ 2
+ >>> find_first_int_in_set([1, 2, 3], [4, 5])
+ """
+ cdef vector[int] v = values
+ cdef vector[int] t = target
+ result = find_first_of(v.begin(), v.end(), t.begin(), t.end())
+ if result != v.end():
+ return distance(v.begin(), result)
+ else:
+ return None
+
+
+def find_first_int_in_set2(vector[int] values, vector[int] target):
+ """
+ Test find_first_of with is_equal predicate.
+
+ >>> find_first_int_in_set2([1, 2, 3, 4, 5], [3, 5])
+ 2
+ >>> find_first_int_in_set2([1, 2, 3], [4, 5])
+ """
+ result = find_first_of(values.begin(), values.end(), target.begin(), target.end(), is_equal)
+ if result != values.end():
+ return distance(values.begin(), result)
+ else:
+ return None
+
+
+def find_adjacent_int(vector[int] values):
+ """
+ Test adjacent_find.
+
+ >>> find_adjacent_int([0, 1, 2, 3, 40, 40, 41, 41, 5])
+ 4
+ >>> find_adjacent_int(range(5))
+ """
+ result = adjacent_find(values.begin(), values.end())
+ if result != values.end():
+ return distance(values.begin(), result)
+ else:
+ return None
+
+
+def find_adjacent_int2(vector[int] values):
+ """
+ Test find_adjacent with is_equal predicate.
+
+ >>> find_adjacent_int2([0, 1, 2, 3, 40, 40, 41, 41, 5])
+ 4
+ >>> find_adjacent_int2(range(5))
+ """
+ result = adjacent_find(values.begin(), values.end(), is_equal)
+ if result != values.end():
+ return distance(values.begin(), result)
+ else:
+ return None
+
+
+def in_quote(string quote, string word):
+ """
+ Test search using cppreference example.
+
+ >>> in_quote(b"why waste time learning, when ignorance is instantaneous?", b"learning")
+ True
+ >>> in_quote(b"why waste time learning, when ignorance is instantaneous?", b"lemming")
+ False
+ """
+ return search(quote.begin(), quote.end(), word.begin(), word.end()) != quote.end()
+
+
+def in_quote2(string quote, string word):
+ """
+ Test search using cppreference example (with is_equal predicate).
+
+ >>> in_quote2(b"why waste time learning, when ignorance is instantaneous?", b"learning")
+ True
+ >>> in_quote2(b"why waste time learning, when ignorance is instantaneous?", b"lemming")
+ False
+ """
+ return search(quote.begin(), quote.end(), word.begin(), word.end(), &is_equal) != quote.end()
+
+
+def consecutive_values(string c, int count, char v):
+ """
+ Test search_n using cppreference example (without std::begin and std::end).
+
+ >>> consecutive_values(b"1001010100010101001010101", 4, ord("0"))
+ False
+ >>> consecutive_values(b"1001010100010101001010101", 3, ord("0"))
+ True
+ """
+ return search_n(c.begin(), c.end(), count, v) != c.end()
+
+
+def consecutive_values2(string c, int count, char v):
+ """
+ Test search_n using cppreference example (with is_equal predicate).
+
+ >>> consecutive_values2(b"1001010100010101001010101", 4, ord("0"))
+ False
+ >>> consecutive_values2(b"1001010100010101001010101", 3, ord("0"))
+ True
+ """
+ return search_n(c.begin(), c.end(), count, v, &is_equal) != c.end()