1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10 11// <string_view> 12 13// constexpr int compare(size_type pos1, size_type n1, basic_string_view str) const; 14 15#include <experimental/string_view> 16#include <cassert> 17 18#include "constexpr_char_traits.hpp" 19 20int sign ( int x ) { return x > 0 ? 1 : ( x < 0 ? -1 : 0 ); } 21 22template<typename CharT> 23void test1 ( std::experimental::basic_string_view<CharT> sv1, size_t pos1, size_t n1, 24 std::experimental::basic_string_view<CharT> sv2, int expected ) { 25 26 try 27 { 28 assert ( sign( sv1.compare(pos1, n1, sv2)) == sign(expected)); 29 assert(pos1 <= sv1.size()); 30 } 31 catch (const std::out_of_range&) { assert(pos1 > sv1.size()); } 32} 33 34 35template<typename CharT> 36void test ( const CharT *s1, size_t pos1, size_t n1, const CharT *s2, int expected ) { 37 typedef std::experimental::basic_string_view<CharT> string_view_t; 38 39 string_view_t sv1 ( s1 ); 40 string_view_t sv2 ( s2 ); 41 test1(sv1, pos1, n1, sv2, expected); 42} 43 44void test0() 45{ 46 test("", 0, 0, "", 0); 47 test("", 0, 0, "abcde", -5); 48 test("", 0, 0, "abcdefghij", -10); 49 test("", 0, 0, "abcdefghijklmnopqrst", -20); 50 test("", 0, 1, "", 0); 51 test("", 0, 1, "abcde", -5); 52 test("", 0, 1, "abcdefghij", -10); 53 test("", 0, 1, "abcdefghijklmnopqrst", -20); 54 test("", 1, 0, "", 0); 55 test("", 1, 0, "abcde", 0); 56 test("", 1, 0, "abcdefghij", 0); 57 test("", 1, 0, "abcdefghijklmnopqrst", 0); 58 test("abcde", 0, 0, "", 0); 59 test("abcde", 0, 0, "abcde", -5); 60 test("abcde", 0, 0, "abcdefghij", -10); 61 test("abcde", 0, 0, "abcdefghijklmnopqrst", -20); 62 test("abcde", 0, 1, "", 1); 63 test("abcde", 0, 1, "abcde", -4); 64 test("abcde", 0, 1, "abcdefghij", -9); 65 test("abcde", 0, 1, "abcdefghijklmnopqrst", -19); 66 test("abcde", 0, 2, "", 2); 67 test("abcde", 0, 2, "abcde", -3); 68 test("abcde", 0, 2, "abcdefghij", -8); 69 test("abcde", 0, 2, "abcdefghijklmnopqrst", -18); 70 test("abcde", 0, 4, "", 4); 71 test("abcde", 0, 4, "abcde", -1); 72 test("abcde", 0, 4, "abcdefghij", -6); 73 test("abcde", 0, 4, "abcdefghijklmnopqrst", -16); 74 test("abcde", 0, 5, "", 5); 75 test("abcde", 0, 5, "abcde", 0); 76 test("abcde", 0, 5, "abcdefghij", -5); 77 test("abcde", 0, 5, "abcdefghijklmnopqrst", -15); 78 test("abcde", 0, 6, "", 5); 79 test("abcde", 0, 6, "abcde", 0); 80 test("abcde", 0, 6, "abcdefghij", -5); 81 test("abcde", 0, 6, "abcdefghijklmnopqrst", -15); 82 test("abcde", 1, 0, "", 0); 83 test("abcde", 1, 0, "abcde", -5); 84 test("abcde", 1, 0, "abcdefghij", -10); 85 test("abcde", 1, 0, "abcdefghijklmnopqrst", -20); 86 test("abcde", 1, 1, "", 1); 87 test("abcde", 1, 1, "abcde", 1); 88 test("abcde", 1, 1, "abcdefghij", 1); 89 test("abcde", 1, 1, "abcdefghijklmnopqrst", 1); 90 test("abcde", 1, 2, "", 2); 91 test("abcde", 1, 2, "abcde", 1); 92 test("abcde", 1, 2, "abcdefghij", 1); 93 test("abcde", 1, 2, "abcdefghijklmnopqrst", 1); 94 test("abcde", 1, 3, "", 3); 95 test("abcde", 1, 3, "abcde", 1); 96 test("abcde", 1, 3, "abcdefghij", 1); 97 test("abcde", 1, 3, "abcdefghijklmnopqrst", 1); 98 test("abcde", 1, 4, "", 4); 99 test("abcde", 1, 4, "abcde", 1); 100 test("abcde", 1, 4, "abcdefghij", 1); 101 test("abcde", 1, 4, "abcdefghijklmnopqrst", 1); 102 test("abcde", 1, 5, "", 4); 103 test("abcde", 1, 5, "abcde", 1); 104 test("abcde", 1, 5, "abcdefghij", 1); 105 test("abcde", 1, 5, "abcdefghijklmnopqrst", 1); 106 test("abcde", 2, 0, "", 0); 107 test("abcde", 2, 0, "abcde", -5); 108 test("abcde", 2, 0, "abcdefghij", -10); 109 test("abcde", 2, 0, "abcdefghijklmnopqrst", -20); 110 test("abcde", 2, 1, "", 1); 111 test("abcde", 2, 1, "abcde", 2); 112 test("abcde", 2, 1, "abcdefghij", 2); 113 test("abcde", 2, 1, "abcdefghijklmnopqrst", 2); 114 test("abcde", 2, 2, "", 2); 115 test("abcde", 2, 2, "abcde", 2); 116 test("abcde", 2, 2, "abcdefghij", 2); 117 test("abcde", 2, 2, "abcdefghijklmnopqrst", 2); 118 test("abcde", 2, 3, "", 3); 119 test("abcde", 2, 3, "abcde", 2); 120 test("abcde", 2, 3, "abcdefghij", 2); 121 test("abcde", 2, 3, "abcdefghijklmnopqrst", 2); 122 test("abcde", 2, 4, "", 3); 123 test("abcde", 2, 4, "abcde", 2); 124 test("abcde", 2, 4, "abcdefghij", 2); 125 test("abcde", 2, 4, "abcdefghijklmnopqrst", 2); 126 test("abcde", 4, 0, "", 0); 127 test("abcde", 4, 0, "abcde", -5); 128 test("abcde", 4, 0, "abcdefghij", -10); 129 test("abcde", 4, 0, "abcdefghijklmnopqrst", -20); 130 test("abcde", 4, 1, "", 1); 131 test("abcde", 4, 1, "abcde", 4); 132 test("abcde", 4, 1, "abcdefghij", 4); 133 test("abcde", 4, 1, "abcdefghijklmnopqrst", 4); 134 test("abcde", 4, 2, "", 1); 135 test("abcde", 4, 2, "abcde", 4); 136 test("abcde", 4, 2, "abcdefghij", 4); 137 test("abcde", 4, 2, "abcdefghijklmnopqrst", 4); 138 test("abcde", 5, 0, "", 0); 139 test("abcde", 5, 0, "abcde", -5); 140 test("abcde", 5, 0, "abcdefghij", -10); 141 test("abcde", 5, 0, "abcdefghijklmnopqrst", -20); 142 test("abcde", 5, 1, "", 0); 143 test("abcde", 5, 1, "abcde", -5); 144 test("abcde", 5, 1, "abcdefghij", -10); 145 test("abcde", 5, 1, "abcdefghijklmnopqrst", -20); 146} 147 148void test1() 149{ 150 test("abcde", 6, 0, "", 0); 151 test("abcde", 6, 0, "abcde", 0); 152 test("abcde", 6, 0, "abcdefghij", 0); 153 test("abcde", 6, 0, "abcdefghijklmnopqrst", 0); 154 test("abcdefghij", 0, 0, "", 0); 155 test("abcdefghij", 0, 0, "abcde", -5); 156 test("abcdefghij", 0, 0, "abcdefghij", -10); 157 test("abcdefghij", 0, 0, "abcdefghijklmnopqrst", -20); 158 test("abcdefghij", 0, 1, "", 1); 159 test("abcdefghij", 0, 1, "abcde", -4); 160 test("abcdefghij", 0, 1, "abcdefghij", -9); 161 test("abcdefghij", 0, 1, "abcdefghijklmnopqrst", -19); 162 test("abcdefghij", 0, 5, "", 5); 163 test("abcdefghij", 0, 5, "abcde", 0); 164 test("abcdefghij", 0, 5, "abcdefghij", -5); 165 test("abcdefghij", 0, 5, "abcdefghijklmnopqrst", -15); 166 test("abcdefghij", 0, 9, "", 9); 167 test("abcdefghij", 0, 9, "abcde", 4); 168 test("abcdefghij", 0, 9, "abcdefghij", -1); 169 test("abcdefghij", 0, 9, "abcdefghijklmnopqrst", -11); 170 test("abcdefghij", 0, 10, "", 10); 171 test("abcdefghij", 0, 10, "abcde", 5); 172 test("abcdefghij", 0, 10, "abcdefghij", 0); 173 test("abcdefghij", 0, 10, "abcdefghijklmnopqrst", -10); 174 test("abcdefghij", 0, 11, "", 10); 175 test("abcdefghij", 0, 11, "abcde", 5); 176 test("abcdefghij", 0, 11, "abcdefghij", 0); 177 test("abcdefghij", 0, 11, "abcdefghijklmnopqrst", -10); 178 test("abcdefghij", 1, 0, "", 0); 179 test("abcdefghij", 1, 0, "abcde", -5); 180 test("abcdefghij", 1, 0, "abcdefghij", -10); 181 test("abcdefghij", 1, 0, "abcdefghijklmnopqrst", -20); 182 test("abcdefghij", 1, 1, "", 1); 183 test("abcdefghij", 1, 1, "abcde", 1); 184 test("abcdefghij", 1, 1, "abcdefghij", 1); 185 test("abcdefghij", 1, 1, "abcdefghijklmnopqrst", 1); 186 test("abcdefghij", 1, 4, "", 4); 187 test("abcdefghij", 1, 4, "abcde", 1); 188 test("abcdefghij", 1, 4, "abcdefghij", 1); 189 test("abcdefghij", 1, 4, "abcdefghijklmnopqrst", 1); 190 test("abcdefghij", 1, 8, "", 8); 191 test("abcdefghij", 1, 8, "abcde", 1); 192 test("abcdefghij", 1, 8, "abcdefghij", 1); 193 test("abcdefghij", 1, 8, "abcdefghijklmnopqrst", 1); 194 test("abcdefghij", 1, 9, "", 9); 195 test("abcdefghij", 1, 9, "abcde", 1); 196 test("abcdefghij", 1, 9, "abcdefghij", 1); 197 test("abcdefghij", 1, 9, "abcdefghijklmnopqrst", 1); 198 test("abcdefghij", 1, 10, "", 9); 199 test("abcdefghij", 1, 10, "abcde", 1); 200 test("abcdefghij", 1, 10, "abcdefghij", 1); 201 test("abcdefghij", 1, 10, "abcdefghijklmnopqrst", 1); 202 test("abcdefghij", 5, 0, "", 0); 203 test("abcdefghij", 5, 0, "abcde", -5); 204 test("abcdefghij", 5, 0, "abcdefghij", -10); 205 test("abcdefghij", 5, 0, "abcdefghijklmnopqrst", -20); 206 test("abcdefghij", 5, 1, "", 1); 207 test("abcdefghij", 5, 1, "abcde", 5); 208 test("abcdefghij", 5, 1, "abcdefghij", 5); 209 test("abcdefghij", 5, 1, "abcdefghijklmnopqrst", 5); 210 test("abcdefghij", 5, 2, "", 2); 211 test("abcdefghij", 5, 2, "abcde", 5); 212 test("abcdefghij", 5, 2, "abcdefghij", 5); 213 test("abcdefghij", 5, 2, "abcdefghijklmnopqrst", 5); 214 test("abcdefghij", 5, 4, "", 4); 215 test("abcdefghij", 5, 4, "abcde", 5); 216 test("abcdefghij", 5, 4, "abcdefghij", 5); 217 test("abcdefghij", 5, 4, "abcdefghijklmnopqrst", 5); 218 test("abcdefghij", 5, 5, "", 5); 219 test("abcdefghij", 5, 5, "abcde", 5); 220 test("abcdefghij", 5, 5, "abcdefghij", 5); 221 test("abcdefghij", 5, 5, "abcdefghijklmnopqrst", 5); 222 test("abcdefghij", 5, 6, "", 5); 223 test("abcdefghij", 5, 6, "abcde", 5); 224 test("abcdefghij", 5, 6, "abcdefghij", 5); 225 test("abcdefghij", 5, 6, "abcdefghijklmnopqrst", 5); 226 test("abcdefghij", 9, 0, "", 0); 227 test("abcdefghij", 9, 0, "abcde", -5); 228 test("abcdefghij", 9, 0, "abcdefghij", -10); 229 test("abcdefghij", 9, 0, "abcdefghijklmnopqrst", -20); 230 test("abcdefghij", 9, 1, "", 1); 231 test("abcdefghij", 9, 1, "abcde", 9); 232 test("abcdefghij", 9, 1, "abcdefghij", 9); 233 test("abcdefghij", 9, 1, "abcdefghijklmnopqrst", 9); 234 test("abcdefghij", 9, 2, "", 1); 235 test("abcdefghij", 9, 2, "abcde", 9); 236 test("abcdefghij", 9, 2, "abcdefghij", 9); 237 test("abcdefghij", 9, 2, "abcdefghijklmnopqrst", 9); 238 test("abcdefghij", 10, 0, "", 0); 239 test("abcdefghij", 10, 0, "abcde", -5); 240 test("abcdefghij", 10, 0, "abcdefghij", -10); 241 test("abcdefghij", 10, 0, "abcdefghijklmnopqrst", -20); 242 test("abcdefghij", 10, 1, "", 0); 243 test("abcdefghij", 10, 1, "abcde", -5); 244 test("abcdefghij", 10, 1, "abcdefghij", -10); 245 test("abcdefghij", 10, 1, "abcdefghijklmnopqrst", -20); 246 test("abcdefghij", 11, 0, "", 0); 247 test("abcdefghij", 11, 0, "abcde", 0); 248 test("abcdefghij", 11, 0, "abcdefghij", 0); 249 test("abcdefghij", 11, 0, "abcdefghijklmnopqrst", 0); 250} 251 252void test2() 253{ 254 test("abcdefghijklmnopqrst", 0, 0, "", 0); 255 test("abcdefghijklmnopqrst", 0, 0, "abcde", -5); 256 test("abcdefghijklmnopqrst", 0, 0, "abcdefghij", -10); 257 test("abcdefghijklmnopqrst", 0, 0, "abcdefghijklmnopqrst", -20); 258 test("abcdefghijklmnopqrst", 0, 1, "", 1); 259 test("abcdefghijklmnopqrst", 0, 1, "abcde", -4); 260 test("abcdefghijklmnopqrst", 0, 1, "abcdefghij", -9); 261 test("abcdefghijklmnopqrst", 0, 1, "abcdefghijklmnopqrst", -19); 262 test("abcdefghijklmnopqrst", 0, 10, "", 10); 263 test("abcdefghijklmnopqrst", 0, 10, "abcde", 5); 264 test("abcdefghijklmnopqrst", 0, 10, "abcdefghij", 0); 265 test("abcdefghijklmnopqrst", 0, 10, "abcdefghijklmnopqrst", -10); 266 test("abcdefghijklmnopqrst", 0, 19, "", 19); 267 test("abcdefghijklmnopqrst", 0, 19, "abcde", 14); 268 test("abcdefghijklmnopqrst", 0, 19, "abcdefghij", 9); 269 test("abcdefghijklmnopqrst", 0, 19, "abcdefghijklmnopqrst", -1); 270 test("abcdefghijklmnopqrst", 0, 20, "", 20); 271 test("abcdefghijklmnopqrst", 0, 20, "abcde", 15); 272 test("abcdefghijklmnopqrst", 0, 20, "abcdefghij", 10); 273 test("abcdefghijklmnopqrst", 0, 20, "abcdefghijklmnopqrst", 0); 274 test("abcdefghijklmnopqrst", 0, 21, "", 20); 275 test("abcdefghijklmnopqrst", 0, 21, "abcde", 15); 276 test("abcdefghijklmnopqrst", 0, 21, "abcdefghij", 10); 277 test("abcdefghijklmnopqrst", 0, 21, "abcdefghijklmnopqrst", 0); 278 test("abcdefghijklmnopqrst", 1, 0, "", 0); 279 test("abcdefghijklmnopqrst", 1, 0, "abcde", -5); 280 test("abcdefghijklmnopqrst", 1, 0, "abcdefghij", -10); 281 test("abcdefghijklmnopqrst", 1, 0, "abcdefghijklmnopqrst", -20); 282 test("abcdefghijklmnopqrst", 1, 1, "", 1); 283 test("abcdefghijklmnopqrst", 1, 1, "abcde", 1); 284 test("abcdefghijklmnopqrst", 1, 1, "abcdefghij", 1); 285 test("abcdefghijklmnopqrst", 1, 1, "abcdefghijklmnopqrst", 1); 286 test("abcdefghijklmnopqrst", 1, 9, "", 9); 287 test("abcdefghijklmnopqrst", 1, 9, "abcde", 1); 288 test("abcdefghijklmnopqrst", 1, 9, "abcdefghij", 1); 289 test("abcdefghijklmnopqrst", 1, 9, "abcdefghijklmnopqrst", 1); 290 test("abcdefghijklmnopqrst", 1, 18, "", 18); 291 test("abcdefghijklmnopqrst", 1, 18, "abcde", 1); 292 test("abcdefghijklmnopqrst", 1, 18, "abcdefghij", 1); 293 test("abcdefghijklmnopqrst", 1, 18, "abcdefghijklmnopqrst", 1); 294 test("abcdefghijklmnopqrst", 1, 19, "", 19); 295 test("abcdefghijklmnopqrst", 1, 19, "abcde", 1); 296 test("abcdefghijklmnopqrst", 1, 19, "abcdefghij", 1); 297 test("abcdefghijklmnopqrst", 1, 19, "abcdefghijklmnopqrst", 1); 298 test("abcdefghijklmnopqrst", 1, 20, "", 19); 299 test("abcdefghijklmnopqrst", 1, 20, "abcde", 1); 300 test("abcdefghijklmnopqrst", 1, 20, "abcdefghij", 1); 301 test("abcdefghijklmnopqrst", 1, 20, "abcdefghijklmnopqrst", 1); 302 test("abcdefghijklmnopqrst", 10, 0, "", 0); 303 test("abcdefghijklmnopqrst", 10, 0, "abcde", -5); 304 test("abcdefghijklmnopqrst", 10, 0, "abcdefghij", -10); 305 test("abcdefghijklmnopqrst", 10, 0, "abcdefghijklmnopqrst", -20); 306 test("abcdefghijklmnopqrst", 10, 1, "", 1); 307 test("abcdefghijklmnopqrst", 10, 1, "abcde", 10); 308 test("abcdefghijklmnopqrst", 10, 1, "abcdefghij", 10); 309 test("abcdefghijklmnopqrst", 10, 1, "abcdefghijklmnopqrst", 10); 310 test("abcdefghijklmnopqrst", 10, 5, "", 5); 311 test("abcdefghijklmnopqrst", 10, 5, "abcde", 10); 312 test("abcdefghijklmnopqrst", 10, 5, "abcdefghij", 10); 313 test("abcdefghijklmnopqrst", 10, 5, "abcdefghijklmnopqrst", 10); 314 test("abcdefghijklmnopqrst", 10, 9, "", 9); 315 test("abcdefghijklmnopqrst", 10, 9, "abcde", 10); 316 test("abcdefghijklmnopqrst", 10, 9, "abcdefghij", 10); 317 test("abcdefghijklmnopqrst", 10, 9, "abcdefghijklmnopqrst", 10); 318 test("abcdefghijklmnopqrst", 10, 10, "", 10); 319 test("abcdefghijklmnopqrst", 10, 10, "abcde", 10); 320 test("abcdefghijklmnopqrst", 10, 10, "abcdefghij", 10); 321 test("abcdefghijklmnopqrst", 10, 10, "abcdefghijklmnopqrst", 10); 322 test("abcdefghijklmnopqrst", 10, 11, "", 10); 323 test("abcdefghijklmnopqrst", 10, 11, "abcde", 10); 324 test("abcdefghijklmnopqrst", 10, 11, "abcdefghij", 10); 325 test("abcdefghijklmnopqrst", 10, 11, "abcdefghijklmnopqrst", 10); 326 test("abcdefghijklmnopqrst", 19, 0, "", 0); 327 test("abcdefghijklmnopqrst", 19, 0, "abcde", -5); 328 test("abcdefghijklmnopqrst", 19, 0, "abcdefghij", -10); 329 test("abcdefghijklmnopqrst", 19, 0, "abcdefghijklmnopqrst", -20); 330 test("abcdefghijklmnopqrst", 19, 1, "", 1); 331 test("abcdefghijklmnopqrst", 19, 1, "abcde", 19); 332 test("abcdefghijklmnopqrst", 19, 1, "abcdefghij", 19); 333 test("abcdefghijklmnopqrst", 19, 1, "abcdefghijklmnopqrst", 19); 334 test("abcdefghijklmnopqrst", 19, 2, "", 1); 335 test("abcdefghijklmnopqrst", 19, 2, "abcde", 19); 336 test("abcdefghijklmnopqrst", 19, 2, "abcdefghij", 19); 337 test("abcdefghijklmnopqrst", 19, 2, "abcdefghijklmnopqrst", 19); 338 test("abcdefghijklmnopqrst", 20, 0, "", 0); 339 test("abcdefghijklmnopqrst", 20, 0, "abcde", -5); 340 test("abcdefghijklmnopqrst", 20, 0, "abcdefghij", -10); 341 test("abcdefghijklmnopqrst", 20, 0, "abcdefghijklmnopqrst", -20); 342 test("abcdefghijklmnopqrst", 20, 1, "", 0); 343 test("abcdefghijklmnopqrst", 20, 1, "abcde", -5); 344 test("abcdefghijklmnopqrst", 20, 1, "abcdefghij", -10); 345 test("abcdefghijklmnopqrst", 20, 1, "abcdefghijklmnopqrst", -20); 346 test("abcdefghijklmnopqrst", 21, 0, "", 0); 347 test("abcdefghijklmnopqrst", 21, 0, "abcde", 0); 348 test("abcdefghijklmnopqrst", 21, 0, "abcdefghij", 0); 349 test("abcdefghijklmnopqrst", 21, 0, "abcdefghijklmnopqrst", 0); 350} 351 352 353int main () { 354 test0(); 355 test1(); 356 test2(); 357 358 { 359 test("abcde", 5, 1, "", 0); 360 test("abcde", 2, 4, "", 3); 361 test("abcde", 2, 4, "abcde", 2); 362 test("ABCde", 2, 4, "abcde", -1); 363 } 364 365 { 366 test(L"abcde", 5, 1, L"", 0); 367 test(L"abcde", 2, 4, L"", 3); 368 test(L"abcde", 2, 4, L"abcde", 2); 369 test(L"ABCde", 2, 4, L"abcde", -1); 370 } 371 372#if __cplusplus >= 201103L 373 { 374 test(u"abcde", 5, 1, u"", 0); 375 test(u"abcde", 2, 4, u"", 3); 376 test(u"abcde", 2, 4, u"abcde", 2); 377 test(u"ABCde", 2, 4, u"abcde", -1); 378 } 379 380 { 381 test(U"abcde", 5, 1, U"", 0); 382 test(U"abcde", 2, 4, U"", 3); 383 test(U"abcde", 2, 4, U"abcde", 2); 384 test(U"ABCde", 2, 4, U"abcde", -1); 385 } 386#endif 387 388#if _LIBCPP_STD_VER > 11 389 { 390 typedef std::experimental::basic_string_view<char, constexpr_char_traits<char>> SV; 391 constexpr SV sv1 { "abcde", 5 }; 392 constexpr SV sv2 { "abcde", 0 }; 393 static_assert ( sv1.compare(5, 1, sv2) == 0, "" ); 394 static_assert ( sv1.compare(2, 4, sv2) == 1, "" ); 395 } 396#endif 397} 398