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 // iterator insert(const_iterator p, charT c); // constexpr since C++20
125a83710eSEric Fiselier
135a83710eSEric Fiselier #include <string>
145a83710eSEric Fiselier #include <stdexcept>
155a83710eSEric Fiselier #include <cassert>
165a83710eSEric Fiselier
171f4231f8SEric Fiselier #include "test_macros.h"
185a83710eSEric Fiselier #include "min_allocator.h"
195a83710eSEric Fiselier
205a83710eSEric Fiselier template <class S>
21dcffa7d3SNikolas Klauser TEST_CONSTEXPR_CXX20 void
test(S & s,typename S::const_iterator p,typename S::value_type c,S expected)225a83710eSEric Fiselier test(S& s, typename S::const_iterator p, typename S::value_type c, S expected)
235a83710eSEric Fiselier {
245a83710eSEric Fiselier bool sufficient_cap = s.size() < s.capacity();
255a83710eSEric Fiselier typename S::difference_type pos = p - s.begin();
265a83710eSEric Fiselier typename S::iterator i = s.insert(p, c);
271f4231f8SEric Fiselier LIBCPP_ASSERT(s.__invariants());
285a83710eSEric Fiselier assert(s == expected);
295a83710eSEric Fiselier assert(i - s.begin() == pos);
305a83710eSEric Fiselier assert(*i == c);
315a83710eSEric Fiselier if (sufficient_cap)
325a83710eSEric Fiselier assert(i == p);
335a83710eSEric Fiselier }
345a83710eSEric Fiselier
test()35*425620ccSNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() {
365a83710eSEric Fiselier {
375a83710eSEric Fiselier typedef std::string S;
385a83710eSEric Fiselier S s;
395a83710eSEric Fiselier test(s, s.begin(), '1', S("1"));
405a83710eSEric Fiselier test(s, s.begin(), 'a', S("a1"));
415a83710eSEric Fiselier test(s, s.end(), 'b', S("a1b"));
425a83710eSEric Fiselier test(s, s.end()-1, 'c', S("a1cb"));
435a83710eSEric Fiselier test(s, s.end()-2, 'd', S("a1dcb"));
445a83710eSEric Fiselier test(s, s.end()-3, '2', S("a12dcb"));
455a83710eSEric Fiselier test(s, s.end()-4, '3', S("a132dcb"));
465a83710eSEric Fiselier test(s, s.end()-5, '4', S("a1432dcb"));
475a83710eSEric Fiselier test(s, s.begin()+1, '5', S("a51432dcb"));
485a83710eSEric Fiselier test(s, s.begin()+2, '6', S("a561432dcb"));
495a83710eSEric Fiselier test(s, s.begin()+3, '7', S("a5671432dcb"));
505a83710eSEric Fiselier test(s, s.begin()+4, 'A', S("a567A1432dcb"));
515a83710eSEric Fiselier test(s, s.begin()+5, 'B', S("a567AB1432dcb"));
525a83710eSEric Fiselier test(s, s.begin()+6, 'C', S("a567ABC1432dcb"));
535a83710eSEric Fiselier }
5476b4afc0SMarshall Clow #if TEST_STD_VER >= 11
555a83710eSEric Fiselier {
565a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
575a83710eSEric Fiselier S s;
585a83710eSEric Fiselier test(s, s.begin(), '1', S("1"));
595a83710eSEric Fiselier test(s, s.begin(), 'a', S("a1"));
605a83710eSEric Fiselier test(s, s.end(), 'b', S("a1b"));
615a83710eSEric Fiselier test(s, s.end()-1, 'c', S("a1cb"));
625a83710eSEric Fiselier test(s, s.end()-2, 'd', S("a1dcb"));
635a83710eSEric Fiselier test(s, s.end()-3, '2', S("a12dcb"));
645a83710eSEric Fiselier test(s, s.end()-4, '3', S("a132dcb"));
655a83710eSEric Fiselier test(s, s.end()-5, '4', S("a1432dcb"));
665a83710eSEric Fiselier test(s, s.begin()+1, '5', S("a51432dcb"));
675a83710eSEric Fiselier test(s, s.begin()+2, '6', S("a561432dcb"));
685a83710eSEric Fiselier test(s, s.begin()+3, '7', S("a5671432dcb"));
695a83710eSEric Fiselier test(s, s.begin()+4, 'A', S("a567A1432dcb"));
705a83710eSEric Fiselier test(s, s.begin()+5, 'B', S("a567AB1432dcb"));
715a83710eSEric Fiselier test(s, s.begin()+6, 'C', S("a567ABC1432dcb"));
725a83710eSEric Fiselier }
735a83710eSEric Fiselier #endif
742df59c50SJF Bastien
75dcffa7d3SNikolas Klauser return true;
76dcffa7d3SNikolas Klauser }
77dcffa7d3SNikolas Klauser
main(int,char **)78dcffa7d3SNikolas Klauser int main(int, char**)
79dcffa7d3SNikolas Klauser {
80dcffa7d3SNikolas Klauser test();
81dcffa7d3SNikolas Klauser #if TEST_STD_VER > 17
82*425620ccSNikolas Klauser static_assert(test());
83dcffa7d3SNikolas Klauser #endif
84dcffa7d3SNikolas Klauser
852df59c50SJF Bastien return 0;
865a83710eSEric Fiselier }
87