File size: 6,550 Bytes
9823a7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from libcpp.string cimport string

cdef extern from "<string_view>" namespace "std::string_view" nogil:
    const size_t npos

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

    cdef cppclass string_view:
        ctypedef char value_type
        ctypedef size_t size_type
        ctypedef ptrdiff_t difference_type

        bint operator==(string_view)
        bint operator!= (string_view)
        bint operator< (string_view)
        bint operator> (string_view)
        bint operator<= (string_view)
        bint operator>= (string_view)

        cppclass const_iterator:
            const_iterator()
            const_iterator(const_iterator&)
            operator=(const_iterator&)
            const value_type& operator*()
            const_iterator operator++()
            const_iterator operator--()
            const_iterator operator++(int)
            const_iterator operator--(int)
            const_iterator operator+(size_type)
            const_iterator operator-(size_type)
            difference_type operator-(const_iterator)
            bint operator==(const_iterator)
            bint operator!=(const_iterator)
            bint operator<(const_iterator)
            bint operator>(const_iterator)
            bint operator<=(const_iterator)
            bint operator>=(const_iterator)

        ctypedef const_iterator iterator

        cppclass const_reverse_iterator:
            const_reverse_iterator()
            const_reverse_iterator(const_reverse_iterator&)
            operator=(const_reverse_iterator&)
            const value_type& operator*()
            const_reverse_iterator operator++()
            const_reverse_iterator operator--()
            const_reverse_iterator operator++(int)
            const_reverse_iterator operator--(int)
            const_reverse_iterator operator+(size_type)
            const_reverse_iterator operator-(size_type)
            difference_type operator-(const_reverse_iterator)
            bint operator==(const_reverse_iterator)
            bint operator!=(const_reverse_iterator)
            bint operator<(const_reverse_iterator)
            bint operator>(const_reverse_iterator)
            bint operator<=(const_reverse_iterator)
            bint operator>=(const_reverse_iterator)

        ctypedef const_reverse_iterator reverse_iterator

        # Constructors
        string_view()  # (1)
        string_view(string_view s)  # (2)
        string_view(const char* s, size_t n)  # (3)
        string_view(const char* s)  # (4)
        string_view& string_view[InputIt](InputIt, InputIt)  # (5)

        # This should be `operator string_view()` on std::string, but
        # Cython doesn't yet allow declaring it.
        string_view(const string&)

        # Assignment
        string_view& operator=(string_view)

        # Iterators
        const_iterator begin()
        const_iterator end()
        const_iterator cbegin()
        const_iterator cend()

        const_reverse_iterator rbegin()
        const_reverse_iterator rend()
        const_reverse_iterator crbegin()
        const_reverse_iterator crend()

        # Capacity
        size_t size()
        size_t length()
        size_t max_size()
        bint empty()

        # Element access
        const char& operator[](size_t pos)
        const char& at(size_t pos) except +
        const char& front()
        const char& back()

        const char* data()

        # Modifiers
        void remove_prefix(size_t n)
        void remove_suffix(size_t n)
        void swap(string_view& other)

        # Operations
        size_t copy(char* dest, size_t count, size_t pos)
        size_t copy(char* dest, size_t count)

        size_t find(string_view s, size_t pos)
        size_t find(string_view s)
        size_t find(const char* s, size_t pos, size_t n)
        size_t find(const char* s, size_t pos)
        size_t find(const char* s)
        size_t find(char c, size_t pos)
        size_t find(char c)

        size_t rfind(string_view, size_t pos)
        size_t rfind(string_view)
        size_t rfind(const char* s, size_t pos, size_t n)
        size_t rfind(const char* s, size_t pos)
        size_t rfind(const char* s)
        size_t rfind(char c, size_t pos)
        size_t rfind(char c)

        size_t find_first_of(string_view, size_t pos)
        size_t find_first_of(string_view)
        size_t find_first_of(const char* s, size_t pos, size_t n)
        size_t find_first_of(const char* s, size_t pos)
        size_t find_first_of(const char* s)
        size_t find_first_of(char c, size_t pos)
        size_t find_first_of(char c)

        size_t find_first_not_of(string_view s, size_t pos)
        size_t find_first_not_of(string_view s)
        size_t find_first_not_of(const char* s, size_t pos, size_t n)
        size_t find_first_not_of(const char* s, size_t pos)
        size_t find_first_not_of(const char*)
        size_t find_first_not_of(char c, size_t pos)
        size_t find_first_not_of(char c)

        size_t find_last_of(string_view s, size_t pos)
        size_t find_last_of(string_view s)
        size_t find_last_of(const char* s, size_t pos, size_t n)
        size_t find_last_of(const char* s, size_t pos)
        size_t find_last_of(const char* s)
        size_t find_last_of(char c, size_t pos)
        size_t find_last_of(char c)

        size_t find_last_not_of(string_view s, size_t pos)
        size_t find_last_not_of(string_view s)
        size_t find_last_not_of(const char* s, size_t pos, size_t n)
        size_t find_last_not_of(const char* s, size_t pos)
        size_t find_last_not_of(const char* s)
        size_t find_last_not_of(char c, size_t pos)
        size_t find_last_not_of(char c)

        string_view substr(size_t pos, size_t len) except +
        string_view substr(size_t pos) except +
        string_view substr()

        int compare(string_view s)
        int compare(size_t pos, size_t len, string_view s)
        int compare(size_t pos, size_t len, string_view s, size_t subpos, size_t sublen)
        int compare(const char* s)
        int compare(size_t pos, size_t len, const char* s)
        int compare(size_t pos, size_t len, const char* s , size_t n)

        # C++20
        bint starts_with(string_view s)
        bint starts_with(char c)
        bint starts_with(const char* s)

        bint ends_with(string_view s)
        bint ends_with(char c)
        bint ends_with(const char* s)

        # C++23
        bint contains(string_view s)
        bint contains(char c)
        bint contains(const char* s)