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 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
|
# mode: run
# tag: cpp, werror, cpp11, no-cpp-locals
from __future__ import print_function
from cython.operator cimport dereference as deref
from cython.operator cimport preincrement, postincrement
from libcpp cimport bool
from libcpp.algorithm cimport copy, copy_if, copy_n, copy_backward, move, move_backward, fill, fill_n, transform
from libcpp.algorithm cimport generate, generate_n, remove, remove_if, remove_copy, remove_copy_if, replace, replace_if
from libcpp.algorithm cimport replace_copy, replace_copy_if, swap, swap_ranges, iter_swap, reverse, reverse_copy
from libcpp.algorithm cimport rotate, rotate_copy, unique, unique_copy
from libcpp.algorithm cimport sort, upper_bound, min_element, max_element
from libcpp.iterator cimport back_inserter
from libcpp.string cimport string
from libcpp.vector cimport vector
def copy_int(vector[int] values):
"""
Test copy.
>>> copy_int(range(5))
[0, 1, 2, 3, 4]
"""
cdef vector[int] out
copy(values.begin(), values.end(), back_inserter(out))
return out
cdef bool is_odd(int i):
return i % 2
def copy_int_if_odd(vector[int] values):
"""
Test copy_if.
>>> copy_int_if_odd(range(5))
[1, 3]
"""
cdef vector[int] out
copy_if(values.begin(), values.end(), back_inserter(out), is_odd)
return out
def copy_int_n(vector[int] values, int count):
"""
Test copy_n.
>>> copy_int_n(range(5), 2)
[0, 1]
"""
cdef vector[int] out
copy_n(values.begin(), count, back_inserter(out))
return out
def copy_int_backward(vector[int] values):
"""
Test copy_backward.
>>> copy_int_backward(range(5))
[0, 0, 0, 0, 1, 2, 3, 4]
"""
out = vector[int](values.size() + 3)
copy_backward(values.begin(), values.end(), out.end())
return out
def move_int(vector[int] values):
"""
Test move.
>>> move_int(range(5))
[0, 1, 2, 3, 4]
"""
cdef vector[int] out
move(values.begin(), values.end(), back_inserter(out))
return out
def move_int_backward(vector[int] values):
"""
Test move_backward.
>>> move_int_backward(range(5))
[0, 0, 0, 0, 1, 2, 3, 4]
"""
out = vector[int](values.size() + 3)
move_backward(values.begin(), values.end(), out.end())
return out
def fill_int(vector[int] array, int value):
"""
Test fill.
>>> fill_int(range(5), -1)
[-1, -1, -1, -1, -1]
"""
fill(array.begin(), array.end(), value)
return array
def fill_int_n(vector[int] array, int count, int value):
"""
Test fill_n.
>>> fill_int_n(range(5), 3, -1)
[-1, -1, -1, 3, 4]
"""
fill_n(array.begin(), count, value)
return array
cdef int to_ord(unsigned char c):
return c
def string_to_ord(string s):
"""
Test transform (unary version).
>> string_to_ord(b"HELLO")
[72, 69, 76, 76, 79]
"""
cdef vector[int] ordinals
transform(s.begin(), s.end(), back_inserter(ordinals), to_ord)
return ordinals
cdef int add_ints(int lhs, int rhs):
return lhs + rhs
def add_int_vectors(vector[int] lhs, vector[int] rhs):
"""
Test transform (binary version).
>>> add_int_vectors([1, 2, 3], [4, 5, 6])
[5, 7, 9]
"""
transform(lhs.begin(), lhs.end(), rhs.begin(), lhs.begin(), add_ints)
return lhs
cdef int i = 0
cdef int generator():
return postincrement(i)
def generate_ints(int count):
"""
Test generate.
>> generate_ints(5)
[0, 1, 2, 3, 4]
"""
out = vector[int](count)
generate(out.begin(), out.end(), generator)
return out
cdef int j = 0
cdef int generator2():
return postincrement(j)
def generate_n_ints(int count):
"""
Test generate_n.
>> generate_n_ints(5)
[0, 1, 2, 3, 4, 0, 0, 0]
"""
out = vector[int](count + 3)
generate_n(out.begin(), count, generator2)
return out
def remove_spaces(string s):
"""
Test remove.
>>> print(remove_spaces(b"Text with some spaces").decode("ascii"))
Textwithsomespaces
"""
s.erase(remove(s.begin(), s.end(), ord(" ")), s.end())
return s
cdef bool is_whitespace(unsigned char c) except -1:
# std::isspace from <cctype>
return chr(c) in " \f\n\r\t\v"
def remove_whitespace(string s):
r"""
Test remove_if.
>>> print(remove_whitespace(b"Text\n with\tsome \t whitespaces\n\n").decode("ascii"))
Textwithsomewhitespaces
"""
s.erase(remove_if(s.begin(), s.end(), &is_whitespace), s.end())
return s
def remove_spaces2(string s):
"""
Test remove_copy.
>>> print(remove_spaces2(b"Text with some spaces").decode("ascii"))
Textwithsomespaces
"""
cdef string out
remove_copy(s.begin(), s.end(), back_inserter(out), ord(" "))
return out
def remove_whitespace2(string s):
r"""
Test remove_copy_if.
>>> print(remove_whitespace2(b"Text\n with\tsome \t whitespaces\n\n").decode("ascii"))
Textwithsomewhitespaces
"""
cdef string out
remove_copy_if(s.begin(), s.end(), back_inserter(out), &is_whitespace)
return out
def replace_ints(vector[int] values, int old, int new):
"""
Test replace.
>>> replace_ints([5, 7, 4, 2, 8, 6, 1, 9, 0, 3], 8, 88)
[5, 7, 4, 2, 88, 6, 1, 9, 0, 3]
"""
replace(values.begin(), values.end(), old, new)
return values
cdef bool less_than_five(int i):
return i < 5
def replace_ints_less_than_five(vector[int] values, int new):
"""
Test replace_if (using cppreference example that doesn't translate well).
>>> replace_ints_less_than_five([5, 7, 4, 2, 88, 6, 1, 9, 0, 3], 55)
[5, 7, 55, 55, 88, 6, 55, 9, 55, 55]
"""
replace_if(values.begin(), values.end(), less_than_five, new)
return values
def replace_ints2(vector[int] values, int old, int new):
"""
Test replace_copy.
>>> replace_ints2([5, 7, 4, 2, 8, 6, 1, 9, 0, 3], 8, 88)
[5, 7, 4, 2, 88, 6, 1, 9, 0, 3]
"""
cdef vector[int] out
replace_copy(values.begin(), values.end(), back_inserter(out), old, new)
return out
def replace_ints_less_than_five2(vector[int] values, int new):
"""
Test replace_copy_if (using cppreference example that doesn't translate well).
>>> replace_ints_less_than_five2([5, 7, 4, 2, 88, 6, 1, 9, 0, 3], 55)
[5, 7, 55, 55, 88, 6, 55, 9, 55, 55]
"""
cdef vector[int] out
replace_copy_if(values.begin(), values.end(), back_inserter(out), less_than_five, new)
return out
def test_swap_ints():
"""
>>> test_swap_ints()
5 3
3 5
"""
cdef int a = 5, b = 3
print(a, b)
swap(a, b)
print(a, b)
def test_swap_vectors():
"""
>>> test_swap_vectors()
[1, 2, 3] [4, 5, 6]
[4, 5, 6] [1, 2, 3]
"""
cdef vector[int] a = [1, 2, 3], b = [4, 5, 6]
print(a, b)
swap(a, b)
print(a, b)
def test_swap_ranges():
"""
>>> test_swap_ranges()
[1, 2, 3] [4, 5, 6]
[4, 5, 6] [1, 2, 3]
"""
cdef vector[int] a = [1, 2, 3], b = [4, 5, 6]
print(a, b)
swap_ranges(a.begin(), a.end(), b.begin())
print(a, b)
def selection_sort(vector[int] values, reversed=False):
"""
Test iter_swap using cppreference example. Extra "reversed argument tests max_element
>>> selection_sort([-7, 6, 2, 4, -1, 6, -9, -1, 2, -5, 10, -9, -5, -3, -5, -3, 6, 6, 1, 8])
[-9, -9, -7, -5, -5, -5, -3, -3, -1, -1, 1, 2, 2, 4, 6, 6, 6, 6, 8, 10]
>>> selection_sort([-7, 6, 2, 4, -1, 6, -9, -1, 2, -5, 10, -9, -5, -3, -5, -3, 6, 6, 1, 8], reversed=True)
[10, 8, 6, 6, 6, 6, 4, 2, 2, 1, -1, -1, -3, -3, -5, -5, -5, -7, -9, -9]
"""
i = values.begin()
end = values.end()
while i < end:
iter_swap(i, min_element(i, end) if not reversed else max_element(i,end))
preincrement(i)
return values
def reverse_ints(vector[int] values):
"""
Test reverse.
>>> reverse_ints([1, 2, 3])
[3, 2, 1]
"""
reverse(values.begin(), values.end())
return values
def reverse_ints2(vector[int] values):
"""
Test reverse_copy.
>>> reverse_ints2([1, 2, 3])
[3, 2, 1]
"""
cdef vector[int] out
reverse_copy(values.begin(), values.end(), back_inserter(out))
return out
def insertion_sort(vector[int] values):
"""
Test rotate using cppreference example.
>>> insertion_sort([2, 4, 2, 0, 5, 10, 7, 3, 7, 1])
[0, 1, 2, 2, 3, 4, 5, 7, 7, 10]
"""
i = values.begin()
while i < values.end():
rotate(upper_bound(values.begin(), i, deref(i)), i, i + 1)
preincrement(i)
return values
def rotate_ints_about_middle(vector[int] values):
"""
Test rotate_copy.
>>> rotate_ints_about_middle([1, 2, 3, 4, 5])
[3, 4, 5, 1, 2]
"""
cdef vector[int] out
cdef vector[int].iterator pivot = values.begin() + values.size()/2
rotate_copy(values.begin(), pivot, values.end(), back_inserter(out))
return out
def unique_ints(vector[int] values):
"""
Test unique.
>>> unique_ints([1, 2, 3, 1, 2, 3, 3, 4, 5, 4, 5, 6, 7])
[1, 2, 3, 4, 5, 6, 7]
"""
sort(values.begin(), values.end())
values.erase(unique(values.begin(), values.end()), values.end())
return values
cdef bool both_space(unsigned char lhs, unsigned char rhs):
return lhs == rhs == ord(' ')
def collapse_spaces(string text):
"""
Test unique (predicate version) using cppreference example for unique_copy.
>>> print(collapse_spaces(b"The string with many spaces!").decode("ascii"))
The string with many spaces!
"""
last = unique(text.begin(), text.end(), &both_space)
text.erase(last, text.end())
return text
def unique_ints2(vector[int] values):
"""
Test unique_copy.
>>> unique_ints2([1, 2, 3, 1, 2, 3, 3, 4, 5, 4, 5, 6, 7])
[1, 2, 3, 4, 5, 6, 7]
"""
cdef vector[int] out
sort(values.begin(), values.end())
unique_copy(values.begin(), values.end(), back_inserter(out))
return out
def collapse_spaces2(string text):
"""
Test unique_copy (predicate version) using cppreference example.
>>> print(collapse_spaces2(b"The string with many spaces!").decode("ascii"))
The string with many spaces!
"""
cdef string out
unique_copy(text.begin(), text.end(), back_inserter(out), &both_space)
return out
|