15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <string>
105a83710eSEric Fiselier
11*425620ccSNikolas Klauser // const charT* data() const; // constexpr since C++20
12*425620ccSNikolas Klauser // charT* data(); // C++17, constexpr since C++20
135a83710eSEric Fiselier
145a83710eSEric Fiselier #include <string>
155a83710eSEric Fiselier #include <cassert>
165a83710eSEric Fiselier
17dd1729feSMarshall Clow #include "test_macros.h"
185a83710eSEric Fiselier #include "min_allocator.h"
195a83710eSEric Fiselier
205a83710eSEric Fiselier template <class S>
21ccc74035SNikolas Klauser TEST_CONSTEXPR_CXX20 void
test_const(const S & s)22dd1729feSMarshall Clow test_const(const S& s)
235a83710eSEric Fiselier {
245a83710eSEric Fiselier typedef typename S::traits_type T;
255a83710eSEric Fiselier const typename S::value_type* str = s.data();
265a83710eSEric Fiselier if (s.size() > 0)
275a83710eSEric Fiselier {
285a83710eSEric Fiselier assert(T::compare(str, &s[0], s.size()) == 0);
295a83710eSEric Fiselier assert(T::eq(str[s.size()], typename S::value_type()));
305a83710eSEric Fiselier }
315a83710eSEric Fiselier else
325a83710eSEric Fiselier assert(T::eq(str[0], typename S::value_type()));
335a83710eSEric Fiselier }
345a83710eSEric Fiselier
35dd1729feSMarshall Clow template <class S>
36ccc74035SNikolas Klauser TEST_CONSTEXPR_CXX20 void
test_nonconst(S & s)37dd1729feSMarshall Clow test_nonconst(S& s)
38dd1729feSMarshall Clow {
39dd1729feSMarshall Clow typedef typename S::traits_type T;
40dd1729feSMarshall Clow typename S::value_type* str = s.data();
41dd1729feSMarshall Clow if (s.size() > 0)
42dd1729feSMarshall Clow {
43dd1729feSMarshall Clow assert(T::compare(str, &s[0], s.size()) == 0);
44dd1729feSMarshall Clow assert(T::eq(str[s.size()], typename S::value_type()));
45dd1729feSMarshall Clow }
46dd1729feSMarshall Clow else
47dd1729feSMarshall Clow assert(T::eq(str[0], typename S::value_type()));
48dd1729feSMarshall Clow }
49dd1729feSMarshall Clow
test()50*425620ccSNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() {
515a83710eSEric Fiselier {
525a83710eSEric Fiselier typedef std::string S;
53dd1729feSMarshall Clow test_const(S(""));
54dd1729feSMarshall Clow test_const(S("abcde"));
55dd1729feSMarshall Clow test_const(S("abcdefghij"));
56dd1729feSMarshall Clow test_const(S("abcdefghijklmnopqrst"));
575a83710eSEric Fiselier }
58dd1729feSMarshall Clow #if TEST_STD_VER >= 11
595a83710eSEric Fiselier {
605a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
61dd1729feSMarshall Clow test_const(S(""));
62dd1729feSMarshall Clow test_const(S("abcde"));
63dd1729feSMarshall Clow test_const(S("abcdefghij"));
64dd1729feSMarshall Clow test_const(S("abcdefghijklmnopqrst"));
65dd1729feSMarshall Clow }
66dd1729feSMarshall Clow #endif
67dd1729feSMarshall Clow #if TEST_STD_VER > 14
68dd1729feSMarshall Clow {
69dd1729feSMarshall Clow typedef std::string S;
70dd1729feSMarshall Clow S s1(""); test_nonconst(s1);
71dd1729feSMarshall Clow S s2("abcde"); test_nonconst(s2);
72dd1729feSMarshall Clow S s3("abcdefghij"); test_nonconst(s3);
73dd1729feSMarshall Clow S s4("abcdefghijklmnopqrst"); test_nonconst(s4);
745a83710eSEric Fiselier }
755a83710eSEric Fiselier #endif
762df59c50SJF Bastien
77ccc74035SNikolas Klauser return true;
78ccc74035SNikolas Klauser }
79ccc74035SNikolas Klauser
main(int,char **)80ccc74035SNikolas Klauser int main(int, char**)
81ccc74035SNikolas Klauser {
82ccc74035SNikolas Klauser test();
83ccc74035SNikolas Klauser #if TEST_STD_VER > 17
84*425620ccSNikolas Klauser static_assert(test());
85ccc74035SNikolas Klauser #endif
86ccc74035SNikolas Klauser
872df59c50SJF Bastien return 0;
885a83710eSEric Fiselier }
89