# deprecated cimport for backwards compatibility:
from libc.string cimport const_char


cdef extern from "<string>" namespace "std" nogil:

    size_t npos = -1

    cdef cppclass string:
        string() except +
        string(char *) except +
        string(char *, size_t) except +
        string(string&) except +
        # as a string formed by a repetition of character c, n times.
        string(size_t, char) except +

        cppclass iterator:
            iterator()
            char& operator*()
            iterator(iterator &)
            iterator operator++()
            iterator operator--()
            bint operator==(iterator)
            bint operator!=(iterator)
        cppclass reverse_iterator:
            char& operator*()
            iterator operator++()
            iterator operator--()
            iterator operator+(size_t)
            iterator operator-(size_t)
            bint operator==(reverse_iterator)
            bint operator!=(reverse_iterator)
            bint operator<(reverse_iterator)
            bint operator>(reverse_iterator)
            bint operator<=(reverse_iterator)
            bint operator>=(reverse_iterator)
        cppclass const_iterator(iterator):
            pass
        cppclass const_reverse_iterator(reverse_iterator):
            pass

        iterator begin()
        const_iterator const_begin "begin"()
        iterator end()
        const_iterator const_end "end"()
        reverse_iterator rbegin()
        const_reverse_iterator const_rbegin "rbegin"()
        reverse_iterator rend()
        const_reverse_iterator const_rend "rend"()

        const char* c_str()
        const char* data()
        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)

        string operator+ (string& rhs)
        string operator+ (char* rhs)

        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*)