//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // template // basic_string(const _Tp& __t, size_type __pos, size_type __n, // const allocator_type& __a = allocator_type()); // // Mostly we're testing string_view here #include #include #include #include #include #include "test_macros.h" #include "test_allocator.h" #include "min_allocator.h" template void test(SV sv, std::size_t pos, std::size_t n) { typedef typename S::traits_type T; typedef typename S::allocator_type A; typedef typename S::size_type Size; if (pos <= sv.size()) { S s2(sv, static_cast(pos), static_cast(n)); LIBCPP_ASSERT(s2.__invariants()); assert(pos <= sv.size()); std::size_t rlen = std::min(sv.size() - pos, n); assert(s2.size() == rlen); assert(T::compare(s2.data(), sv.data() + pos, rlen) == 0); assert(s2.get_allocator() == A()); assert(s2.capacity() >= s2.size()); } #ifndef TEST_HAS_NO_EXCEPTIONS else { try { S s2(sv, static_cast(pos), static_cast(n)); assert(false); } catch (std::out_of_range&) { assert(pos > sv.size()); } } #endif } template void test(SV sv, std::size_t pos, std::size_t n, const typename S::allocator_type& a) { typedef typename S::traits_type T; typedef typename S::size_type Size; if (pos <= sv.size()) { S s2(sv, static_cast(pos), static_cast(n), a); LIBCPP_ASSERT(s2.__invariants()); assert(pos <= sv.size()); std::size_t rlen = std::min(sv.size() - pos, n); assert(s2.size() == rlen); assert(T::compare(s2.data(), sv.data() + pos, rlen) == 0); assert(s2.get_allocator() == a); assert(s2.capacity() >= s2.size()); } #ifndef TEST_HAS_NO_EXCEPTIONS else { try { S s2(sv, static_cast(pos), static_cast(n), a); assert(false); } catch (std::out_of_range&) { assert(pos > sv.size()); } } #endif } int main(int, char**) { { typedef test_allocator A; typedef std::basic_string_view > SV; typedef std::basic_string , A> S; test(SV(), 0, 0); test(SV(), 0, 1); test(SV(), 1, 0); test(SV(), 1, 1); test(SV(), 1, 2); test(SV("1"), 0, 0); test(SV("1"), 0, 1); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 0); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 1); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 10); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 100); test(SV(), 0, 0, A(4)); test(SV(), 0, 1, A(4)); test(SV(), 1, 0, A(4)); test(SV(), 1, 1, A(4)); test(SV(), 1, 2, A(4)); test(SV("1"), 0, 0, A(6)); test(SV("1"), 0, 1, A(6)); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 0, A(8)); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 1, A(8)); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 10, A(8)); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 100, A(8)); } #if TEST_STD_VER >= 11 { typedef min_allocator A; typedef std::basic_string_view > SV; typedef std::basic_string , A> S; test(SV(), 0, 0); test(SV(), 0, 1); test(SV(), 1, 0); test(SV(), 1, 1); test(SV(), 1, 2); test(SV("1"), 0, 0); test(SV("1"), 0, 1); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 0); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 1); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 10); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 100); test(SV(), 0, 0, A()); test(SV(), 0, 1, A()); test(SV(), 1, 0, A()); test(SV(), 1, 1, A()); test(SV(), 1, 2, A()); test(SV("1"), 0, 0, A()); test(SV("1"), 0, 1, A()); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 0, A()); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 1, A()); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 10, A()); test(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 100, A()); } #endif { typedef std::string S; typedef std::string_view SV; S s = "ABCD"; SV sv = "EFGH"; char arr[] = "IJKL"; S s1("CDEF", 4); // calls ctor(const char *, len) assert(s1 == "CDEF"); S s2("QRST", 0, 3); // calls ctor(string("QRST", pos, len) assert(s2 == "QRS"); S s3(sv, 0, std::string::npos); // calls ctor(T, pos, npos) assert(s3 == sv); S s4(sv, 0, 3); // calls ctor(T, pos, len) assert(s4 == "EFG"); S s5(arr, 0, 2); // calls ctor(const char *, len) assert(s5 == "IJ"); S s6(arr, 0); // calls ctor(const char *, len) assert(s6 == ""); S s7(s.data(), 2); // calls ctor(const char *, len) assert(s7 == "AB"); } return 0; }