1*5a83710eSEric Fiselier //===----------------------------------------------------------------------===// 2*5a83710eSEric Fiselier // 3*5a83710eSEric Fiselier // The LLVM Compiler Infrastructure 4*5a83710eSEric Fiselier // 5*5a83710eSEric Fiselier // This file is dual licensed under the MIT and the University of Illinois Open 6*5a83710eSEric Fiselier // Source Licenses. See LICENSE.TXT for details. 7*5a83710eSEric Fiselier // 8*5a83710eSEric Fiselier //===----------------------------------------------------------------------===// 9*5a83710eSEric Fiselier 10*5a83710eSEric Fiselier // <string> 11*5a83710eSEric Fiselier 12*5a83710eSEric Fiselier // basic_string(const charT* s, const Allocator& a = Allocator()); 13*5a83710eSEric Fiselier 14*5a83710eSEric Fiselier #include <string> 15*5a83710eSEric Fiselier #include <stdexcept> 16*5a83710eSEric Fiselier #include <algorithm> 17*5a83710eSEric Fiselier #include <cassert> 18*5a83710eSEric Fiselier 19*5a83710eSEric Fiselier #include "test_allocator.h" 20*5a83710eSEric Fiselier #include "min_allocator.h" 21*5a83710eSEric Fiselier 22*5a83710eSEric Fiselier template <class charT> 23*5a83710eSEric Fiselier void 24*5a83710eSEric Fiselier test(const charT* s) 25*5a83710eSEric Fiselier { 26*5a83710eSEric Fiselier typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S; 27*5a83710eSEric Fiselier typedef typename S::traits_type T; 28*5a83710eSEric Fiselier typedef typename S::allocator_type A; 29*5a83710eSEric Fiselier unsigned n = T::length(s); 30*5a83710eSEric Fiselier S s2(s); 31*5a83710eSEric Fiselier assert(s2.__invariants()); 32*5a83710eSEric Fiselier assert(s2.size() == n); 33*5a83710eSEric Fiselier assert(T::compare(s2.data(), s, n) == 0); 34*5a83710eSEric Fiselier assert(s2.get_allocator() == A()); 35*5a83710eSEric Fiselier assert(s2.capacity() >= s2.size()); 36*5a83710eSEric Fiselier } 37*5a83710eSEric Fiselier 38*5a83710eSEric Fiselier template <class charT, class A> 39*5a83710eSEric Fiselier void 40*5a83710eSEric Fiselier test(const charT* s, const A& a) 41*5a83710eSEric Fiselier { 42*5a83710eSEric Fiselier typedef std::basic_string<charT, std::char_traits<charT>, A> S; 43*5a83710eSEric Fiselier typedef typename S::traits_type T; 44*5a83710eSEric Fiselier unsigned n = T::length(s); 45*5a83710eSEric Fiselier S s2(s, a); 46*5a83710eSEric Fiselier assert(s2.__invariants()); 47*5a83710eSEric Fiselier assert(s2.size() == n); 48*5a83710eSEric Fiselier assert(T::compare(s2.data(), s, n) == 0); 49*5a83710eSEric Fiselier assert(s2.get_allocator() == a); 50*5a83710eSEric Fiselier assert(s2.capacity() >= s2.size()); 51*5a83710eSEric Fiselier } 52*5a83710eSEric Fiselier 53*5a83710eSEric Fiselier int main() 54*5a83710eSEric Fiselier { 55*5a83710eSEric Fiselier { 56*5a83710eSEric Fiselier typedef test_allocator<char> A; 57*5a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, A> S; 58*5a83710eSEric Fiselier 59*5a83710eSEric Fiselier test(""); 60*5a83710eSEric Fiselier test("", A(2)); 61*5a83710eSEric Fiselier 62*5a83710eSEric Fiselier test("1"); 63*5a83710eSEric Fiselier test("1", A(2)); 64*5a83710eSEric Fiselier 65*5a83710eSEric Fiselier test("1234567980"); 66*5a83710eSEric Fiselier test("1234567980", A(2)); 67*5a83710eSEric Fiselier 68*5a83710eSEric Fiselier test("123456798012345679801234567980123456798012345679801234567980"); 69*5a83710eSEric Fiselier test("123456798012345679801234567980123456798012345679801234567980", A(2)); 70*5a83710eSEric Fiselier } 71*5a83710eSEric Fiselier #if __cplusplus >= 201103L 72*5a83710eSEric Fiselier { 73*5a83710eSEric Fiselier typedef min_allocator<char> A; 74*5a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, A> S; 75*5a83710eSEric Fiselier 76*5a83710eSEric Fiselier test(""); 77*5a83710eSEric Fiselier test("", A()); 78*5a83710eSEric Fiselier 79*5a83710eSEric Fiselier test("1"); 80*5a83710eSEric Fiselier test("1", A()); 81*5a83710eSEric Fiselier 82*5a83710eSEric Fiselier test("1234567980"); 83*5a83710eSEric Fiselier test("1234567980", A()); 84*5a83710eSEric Fiselier 85*5a83710eSEric Fiselier test("123456798012345679801234567980123456798012345679801234567980"); 86*5a83710eSEric Fiselier test("123456798012345679801234567980123456798012345679801234567980", A()); 87*5a83710eSEric Fiselier } 88*5a83710eSEric Fiselier #endif 89*5a83710eSEric Fiselier } 90