1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <string> 11 12 // basic_string(size_type n, charT c, const Allocator& a = Allocator()); 13 14 #include <string> 15 #include <stdexcept> 16 #include <algorithm> 17 #include <cassert> 18 19 #include "test_allocator.h" 20 #include "min_allocator.h" 21 22 template <class charT> 23 void 24 test(unsigned n, charT c) 25 { 26 typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S; 27 typedef typename S::traits_type T; 28 typedef typename S::allocator_type A; 29 S s2(n, c); 30 assert(s2.__invariants()); 31 assert(s2.size() == n); 32 for (unsigned i = 0; i < n; ++i) 33 assert(s2[i] == c); 34 assert(s2.get_allocator() == A()); 35 assert(s2.capacity() >= s2.size()); 36 } 37 38 template <class charT, class A> 39 void 40 test(unsigned n, charT c, const A& a) 41 { 42 typedef std::basic_string<charT, std::char_traits<charT>, A> S; 43 typedef typename S::traits_type T; 44 S s2(n, c, a); 45 assert(s2.__invariants()); 46 assert(s2.size() == n); 47 for (unsigned i = 0; i < n; ++i) 48 assert(s2[i] == c); 49 assert(s2.get_allocator() == a); 50 assert(s2.capacity() >= s2.size()); 51 } 52 53 template <class Tp> 54 void 55 test(Tp n, Tp c) 56 { 57 typedef char charT; 58 typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S; 59 typedef typename S::traits_type T; 60 typedef typename S::allocator_type A; 61 S s2(n, c); 62 assert(s2.__invariants()); 63 assert(s2.size() == n); 64 for (unsigned i = 0; i < n; ++i) 65 assert(s2[i] == c); 66 assert(s2.get_allocator() == A()); 67 assert(s2.capacity() >= s2.size()); 68 } 69 70 template <class Tp, class A> 71 void 72 test(Tp n, Tp c, const A& a) 73 { 74 typedef char charT; 75 typedef std::basic_string<charT, std::char_traits<charT>, A> S; 76 typedef typename S::traits_type T; 77 S s2(n, c, a); 78 assert(s2.__invariants()); 79 assert(s2.size() == n); 80 for (unsigned i = 0; i < n; ++i) 81 assert(s2[i] == c); 82 assert(s2.get_allocator() == a); 83 assert(s2.capacity() >= s2.size()); 84 } 85 86 int main() 87 { 88 { 89 typedef test_allocator<char> A; 90 typedef std::basic_string<char, std::char_traits<char>, A> S; 91 92 test(0, 'a'); 93 test(0, 'a', A(2)); 94 95 test(1, 'a'); 96 test(1, 'a', A(2)); 97 98 test(10, 'a'); 99 test(10, 'a', A(2)); 100 101 test(100, 'a'); 102 test(100, 'a', A(2)); 103 104 test(100, 65); 105 test(100, 65, A(3)); 106 } 107 #if __cplusplus >= 201103L 108 { 109 typedef min_allocator<char> A; 110 typedef std::basic_string<char, std::char_traits<char>, A> S; 111 112 test(0, 'a'); 113 test(0, 'a', A()); 114 115 test(1, 'a'); 116 test(1, 'a', A()); 117 118 test(10, 'a'); 119 test(10, 'a', A()); 120 121 test(100, 'a'); 122 test(100, 'a', A()); 123 124 test(100, 65); 125 test(100, 65, A()); 126 } 127 #endif 128 } 129