2 // Copyright (c) 2019-2020 Krystian Stasiowski (sdkrystian at gmail dot com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // Official repository: https://github.com/boostorg/static_string
10 #include <boost/static_string/static_string.hpp>
15 namespace static_strings {
17 // char_traits aren't fully constexpr until c++20
18 #ifdef BOOST_STATIC_STRING_CPP14
19 struct cxper_char_traits
21 using char_type = char;
23 using state_type = std::mbstate_t;
25 static constexpr void assign(char_type& a, const char_type& b) noexcept { a = b; }
26 static constexpr bool eq(char_type a, char_type b) noexcept { return a == b; }
27 static constexpr bool lt(char_type a, char_type b) noexcept { return a < b; }
29 static constexpr int compare(const char_type*, const char_type*, std::size_t) { return 0; }
30 static constexpr std::size_t length(const char_type* s)
36 static constexpr const char_type* find(const char_type*, std::size_t, const char_type&){ return 0; }
37 static constexpr char_type* move(char_type* dest, const char_type* src, std::size_t n)
39 const auto temp = dest;
44 static constexpr char_type* copy(char_type* dest, const char_type* src, std::size_t n)
46 const auto temp = dest;
51 static constexpr char_type* assign(char_type* dest, std::size_t n, char_type ch)
53 const auto temp = dest;
60 using cxper_char_traits = std::char_traits<char>;
62 using cstatic_string = basic_static_string<50, char, cxper_char_traits>;
67 testConstantEvaluation()
69 #ifdef BOOST_STATIC_STRING_CPP20
70 // c++20 constexpr tests
72 cstatic_string b(1, 'a');
74 cstatic_string(b, 0, 1);
75 cstatic_string("a", 1);
78 cstatic_string({'a'});
91 a.assign(b.begin(), b.end());
102 static_cast<void>(j);
106 static_cast<void>(j);
110 static_cast<void>(j);
126 cstatic_string().size();
127 // this is potentially marked nodiscard
128 static_cast<void>(cstatic_string().empty());
129 cstatic_string().length();
130 cstatic_string().max_size();
131 cstatic_string().capacity();
137 a.insert(a.begin(), 1, 'a');
138 a.insert(0, a.begin());
139 a.insert(0, a.begin(), 1);
140 a.insert(a.begin(), 'a');
141 a.insert(a.begin(), {'a'});
146 a.erase(a.begin(), a.end());
156 a.append(a.begin(), a.end());
167 a.compare(0, 1, b, 0, 1);
169 a.compare(0, 1, "a");
170 a.compare(0, 1, "a", 1);
190 a.replace(0, 1, a, 0, 1);
191 a.replace(0, 1, a.data(), 1);
192 a.replace(0, 1, a.data());
193 a.replace(0, 1, 1, 'a');
194 a.replace(a.begin(), a.end(), a);
195 a.replace(a.begin(), a.end(), a.data(), 1);
196 a.replace(a.begin(), a.end(), a.data());
197 a.replace(a.begin(), a.end(), 1, 'a');
198 a.replace(a.begin(), a.end(), a.begin(), a.end());
199 a.replace(a.begin(), a.end(), {'a'});
201 #ifdef BOOST_STATIC_STRING_IS_CONST_EVAL
203 a.replace(a.begin(), a.end(), "a");
204 a.replace(a.begin(), a.end(), "a", 1);
221 a.find_first_of("a", 0, 1);
222 a.find_first_of("a", 0);
223 a.find_first_of('a', 0);
226 a.find_first_not_of(a);
227 a.find_first_not_of("a", 0, 1);
228 a.find_first_not_of("a", 0);
229 a.find_first_not_of('a', 0);
240 #elif defined(BOOST_STATIC_STRING_CPP17)
241 //c++17 constexpr tests
245 cstatic_string b(1, 'a');
246 cstatic_string(b, 0);
247 cstatic_string(b, 0, 1);
248 cstatic_string("a", 1);
251 cstatic_string({'a'});
264 a.assign(b.begin(), b.end());
271 static_cast<void>(j);
275 static_cast<void>(j);
279 static_cast<void>(j);
283 static_cast<void>(j);
294 // auto j = a.rbegin();
297 // auto j = a.crbegin();
300 // auto j = a.rend();
303 // auto j = a.crend();
307 cstatic_string().size();
308 // this is potentially marked nodiscard
309 static_cast<void>(cstatic_string().empty());
310 cstatic_string().length();
311 cstatic_string().max_size();
312 cstatic_string().capacity();
318 a.insert(a.begin(), 1, 'a');
319 a.insert(0, a.begin());
320 a.insert(0, a.begin(), 1);
321 a.insert(a.begin(), 'a');
322 a.insert(a.begin(), {'a'});
327 a.erase(a.begin(), a.end());
337 a.append(a.begin(), a.end());
348 a.compare(0, 1, b, 0, 1);
350 a.compare(0, 1, "a");
351 a.compare(0, 1, "a", 1);
354 // in gcc 5, a constexpr non-static member function returning the class
355 // is a member of causes an ICE
356 #ifndef BOOST_STATIC_STRING_GCC5_BAD_CONSTEXPR
376 a.replace(0, 1, a, 0, 1);
377 a.replace(0, 1, a.data(), 1);
378 a.replace(0, 1, a.data());
379 a.replace(0, 1, 1, 'a');
380 a.replace(a.begin(), a.end(), a);
381 a.replace(a.begin(), a.end(), a.data(), 1);
382 a.replace(a.begin(), a.end(), a.data());
383 a.replace(a.begin(), a.end(), 1, 'a');
384 a.replace(a.begin(), a.end(), a.begin(), a.end());
385 a.replace(a.begin(), a.end(), {'a'});
387 #ifdef BOOST_STATIC_STRING_IS_CONST_EVAL
389 a.replace(a.begin(), a.end(), "a");
390 a.replace(a.begin(), a.end(), "a", 1);
407 a.find_first_of("a", 0, 1);
408 a.find_first_of("a", 0);
409 a.find_first_of('a', 0);
412 a.find_first_not_of(a);
413 a.find_first_not_of("a", 0, 1);
414 a.find_first_not_of("a", 0);
415 a.find_first_not_of('a', 0);
426 #elif defined(BOOST_STATIC_STRING_CPP14)
427 // c++14 constexpr tests
431 cstatic_string b(1, 'a');
432 cstatic_string(b, 0);
433 cstatic_string(b, 0, 1);
434 cstatic_string("a", 1);
437 cstatic_string({'a'});
450 a.assign(b.begin(), b.end());
457 static_cast<void>(j);
461 static_cast<void>(j);
465 static_cast<void>(j);
469 static_cast<void>(j);
479 cstatic_string().size();
480 // this is potentially marked nodiscard
481 static_cast<void>(cstatic_string().empty());
482 cstatic_string().length();
483 cstatic_string().max_size();
484 cstatic_string().capacity();
490 a.insert(a.begin(), 1, 'a');
491 a.insert(0, a.begin());
492 a.insert(0, a.begin(), 1);
493 a.insert(a.begin(), 'a');
494 a.insert(a.begin(), {'a'});
499 a.erase(a.begin(), a.end());
509 a.append(a.begin(), a.end());
520 a.compare(0, 1, b, 0, 1);
522 a.compare(0, 1, "a");
523 a.compare(0, 1, "a", 1);
526 // in gcc 5, a constexpr non-static member function returning the class
527 // is a member of causes an ICE
528 #ifndef BOOST_STATIC_STRING_GCC5_BAD_CONSTEXPR
548 a.replace(0, 1, a, 0, 1);
549 a.replace(0, 1, a.data(), 1);
550 a.replace(0, 1, a.data());
551 a.replace(0, 1, 1, 'a');
552 a.replace(a.begin(), a.end(), a);
553 a.replace(a.begin(), a.end(), a.data(), 1);
554 a.replace(a.begin(), a.end(), a.data());
555 a.replace(a.begin(), a.end(), 1, 'a');
556 a.replace(a.begin(), a.end(), a.begin(), a.end());
557 a.replace(a.begin(), a.end(), {'a'});
559 #ifdef BOOST_STATIC_STRING_IS_CONST_EVAL
561 a.replace(a.begin(), a.end(), "a");
562 a.replace(a.begin(), a.end(), "a", 1);
579 a.find_first_of("a", 0, 1);
580 a.find_first_of("a", 0);
581 a.find_first_of('a', 0);
584 a.find_first_not_of(a);
585 a.find_first_not_of("a", 0, 1);
586 a.find_first_not_of("a", 0);
587 a.find_first_not_of('a', 0);
597 #elif defined(BOOST_STATIC_STRING_CPP11)
598 // c++11 constexpr tests
599 return (cstatic_string().size() +
600 cstatic_string().length() +
601 cstatic_string().max_size() +
602 cstatic_string().capacity()) != 0 &&
603 cstatic_string().empty();