From a6d44949dba6f873c7257a784033eb926eb38ce5 Mon Sep 17 00:00:00 2001 From: "Brent Pedersen (brentp)" Date: Wed, 20 Apr 2011 08:24:36 -0600 Subject: [PATCH] add libcpp.string + tests. --- Cython/Includes/libcpp/string.pxd | 114 ++++++++++++++++++++ tests/run/cpp_stl_string.pyx | 173 ++++++++++++++++++++++++++++++ 2 files changed, 287 insertions(+) create mode 100644 Cython/Includes/libcpp/string.pxd create mode 100644 tests/run/cpp_stl_string.pyx diff --git a/Cython/Includes/libcpp/string.pxd b/Cython/Includes/libcpp/string.pxd new file mode 100644 index 00000000..2fefe574 --- /dev/null +++ b/Cython/Includes/libcpp/string.pxd @@ -0,0 +1,114 @@ + +cdef extern from "" namespace "std": + + size_t npos = -1 + + cdef cppclass string: + string() + string(char *) + string(char *, size_t) + string(string&) + # as a string formed by a repetition of character c, n times. + string(size_t, char) + + char* c_str() + size_t size() + size_t max_size() + size_t length() + void resize(size_t) + void resize(size_t, char c) + size_t capacity() + void reserve(size_t) + void clear() + bint empty() + + char at(size_t) + char operator[](size_t) + int compare(string&) + + string& append(string&) + string& append(string&, size_t, size_t) + string& append(char *) + string& append(char *, size_t) + string& append(size_t, char) + + void push_back(char c) + + string& assign (string&) + string& assign (string&, size_t, size_t) + string& assign (char *, size_t) + string& assign (char *) + string& assign (size_t n, char c) + + string& insert(size_t, string&) + string& insert(size_t, string&, size_t, size_t) + string& insert(size_t, char* s, size_t) + + + string& insert(size_t, char* s) + string& insert(size_t, size_t, char c) + + size_t copy(char *, size_t, size_t) + + size_t find(string&) + size_t find(string&, size_t) + size_t find(char*, size_t pos, size_t) + size_t find(char*, size_t pos) + size_t find(char, size_t pos) + + size_t rfind(string&, size_t) + size_t rfind(char* s, size_t, size_t) + size_t rfind(char*, size_t pos) + size_t rfind(char c, size_t) + size_t rfind(char c) + + size_t find_first_of(string&, size_t) + size_t find_first_of(char* s, size_t, size_t) + size_t find_first_of(char*, size_t pos) + size_t find_first_of(char c, size_t) + size_t find_first_of(char c) + + size_t find_first_not_of(string&, size_t) + size_t find_first_not_of(char* s, size_t, size_t) + size_t find_first_not_of(char*, size_t pos) + size_t find_first_not_of(char c, size_t) + size_t find_first_not_of(char c) + + size_t find_last_of(string&, size_t) + size_t find_last_of(char* s, size_t, size_t) + size_t find_last_of(char*, size_t pos) + size_t find_last_of(char c, size_t) + size_t find_last_of(char c) + + size_t find_last_not_of(string&, size_t) + size_t find_last_not_of(char* s, size_t, size_t) + size_t find_last_not_of(char*, size_t pos) + + string substr(size_t, size_t) + string substr() + string substr(size_t) + + size_t find_last_not_of(char c, size_t) + size_t find_last_not_of(char c) + + #string& operator= (string&) + #string& operator= (char*) + #string& operator= (char) + + bint operator==(string&) + bint operator==(char*) + + bint operator!= (string& rhs ) + bint operator!= (char* ) + + bint operator< (string&) + bint operator< (char*) + + bint operator> (string&) + bint operator> (char*) + + bint operator<= (string&) + bint operator<= (char*) + + bint operator>= (string&) + bint operator>= (char*) diff --git a/tests/run/cpp_stl_string.pyx b/tests/run/cpp_stl_string.pyx new file mode 100644 index 00000000..37b95ee0 --- /dev/null +++ b/tests/run/cpp_stl_string.pyx @@ -0,0 +1,173 @@ +# tag: cpp + +from libcpp.string cimport string + +def test_indexing(char *py_str): + """ + >>> test_indexing("asdf") + ('s', 's') + """ + cdef string s + s = string(py_str) + return chr(s[1]), chr(s.at(1)) + +def test_size(char *py_str): + """ + >>> test_size("asdf") + (4, 4) + """ + cdef string s + s = string(py_str) + return s.size(), s.length() + +def test_compare(char *a, char *b): + """ + >>> test_compare("aa", "aa") + 0 + + >>> test_compare("aa", "ab") < 0 + True + """ + cdef string s = string(a) + cdef string t = string(b) + return s.compare(t) + +def test_empty(): + """ + >>> test_empty() + (True, False) + """ + cdef string a = string("") + cdef string b = string("aa") + return a.empty(), b.empty() + +def test_push_back(char *a): + """ + >>> test_push_back("asdf") + 'asdfZ' + """ + cdef string s = string(a) + s.push_back(ord('Z')) + return s.c_str() + +def test_insert(char *a, char *b, int i): + """ + >>> test_insert("AAAA", "BBBB", 2) + 'AABBBBAA' + """ + cdef string s = string(a) + cdef string t = string(b) + cdef string u = s.insert(i, t) + return u.c_str() + +def test_copy(char *a): + """ + >>> test_copy("asdf") + 'sdf' + """ + cdef string t = string(a) + cdef char buffer[6] + cdef size_t length = t.copy(buffer, 4, 1) + buffer[length] = c'\0' + return buffer + +def test_find(char *a, char *b): + """ + >>> test_find("asdf", "df") + 2 + """ + cdef string s = string(a) + cdef string t = string(b) + cdef size_t i = s.find(t) + return i + +def test_clear(): + """ + >>> test_clear() + '' + """ + cdef string s = string("asdf") + s.clear() + return s.c_str() + +def test_assign(char *a): + """ + >>> test_assign("asdf") + 'ggg' + """ + cdef string s = string(a) + s.assign("ggg") + return s.c_str() + + +def test_substr(char *a): + """ + >>> test_substr("ABCDEFGH") + ('BCDEFGH', 'BCDE', 'ABCDEFGH') + """ + cdef string s = string(a) + cdef string x, y, z + x = s.substr(1) + y = s.substr(1, 4) + z = s.substr() + return x.c_str(), y.c_str(), z.c_str() + +def test_append(char *a, char *b): + """ + >>> test_append("asdf", "1234") + 'asdf1234' + """ + cdef string s = string(a) + cdef string t = string(b) + cdef string j = s.append(t) + return j.c_str() + +def test_char_compare(py_str): + """ + >>> test_char_compare("asdf") + True + """ + cdef char *a = py_str + cdef string b = string(a) + return b.compare(b) == 0 + +def test_cstr(char *a): + """ + >>> test_cstr("asdf") + 'asdf' + """ + cdef string b = string(a) + return b.c_str() + +def test_equals_operator(char *a, char *b): + """ + >>> test_equals_operator("asdf", "asdf") + (True, False) + """ + cdef string s = string(a) + cdef string t = string(b) + return t == s, t != "asdf" + +def test_less_than(char *a, char *b): + """ + >>> test_less_than("asd", "asdf") + (True, True, True) + + >>> test_less_than("asd", "asd") + (False, False, True) + """ + cdef string s = string(a) + cdef string t = string(b) + return (s < t, s < b, s <= b) + +def test_greater_than(char *a, char *b): + """ + >>> test_greater_than("asd", "asdf") + (False, False, False) + + >>> test_greater_than("asd", "asd") + (False, False, True) + """ + cdef string s = string(a) + cdef string t = string(b) + return (s > t, s > b, s >= b) -- 2.26.2