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