--- /dev/null
+
+cdef extern from "<string>" 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*)
--- /dev/null
+# 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(<char *>"")
+ cdef string b = string(<char *>"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(<char>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(<char *>"asdf")
+ s.clear()
+ return s.c_str()
+
+def test_assign(char *a):
+ """
+ >>> test_assign("asdf")
+ 'ggg'
+ """
+ cdef string s = string(a)
+ s.assign(<char *>"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 != <char *>"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)