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 basic_string<charT,traits,Allocator>& str, 13*5a83710eSEric Fiselier // size_type pos, size_type n = npos, 14*5a83710eSEric Fiselier // const Allocator& a = Allocator()); 15*5a83710eSEric Fiselier 16*5a83710eSEric Fiselier #include <string> 17*5a83710eSEric Fiselier #include <stdexcept> 18*5a83710eSEric Fiselier #include <algorithm> 19*5a83710eSEric Fiselier #include <cassert> 20*5a83710eSEric Fiselier 21*5a83710eSEric Fiselier #include "test_allocator.h" 22*5a83710eSEric Fiselier #include "min_allocator.h" 23*5a83710eSEric Fiselier 24*5a83710eSEric Fiselier template <class S> 25*5a83710eSEric Fiselier void 26*5a83710eSEric Fiselier test(S str, unsigned pos) 27*5a83710eSEric Fiselier { 28*5a83710eSEric Fiselier typedef typename S::traits_type T; 29*5a83710eSEric Fiselier typedef typename S::allocator_type A; 30*5a83710eSEric Fiselier try 31*5a83710eSEric Fiselier { 32*5a83710eSEric Fiselier S s2(str, pos); 33*5a83710eSEric Fiselier assert(s2.__invariants()); 34*5a83710eSEric Fiselier assert(pos <= str.size()); 35*5a83710eSEric Fiselier unsigned rlen = str.size() - pos; 36*5a83710eSEric Fiselier assert(s2.size() == rlen); 37*5a83710eSEric Fiselier assert(T::compare(s2.data(), str.data() + pos, rlen) == 0); 38*5a83710eSEric Fiselier assert(s2.get_allocator() == A()); 39*5a83710eSEric Fiselier assert(s2.capacity() >= s2.size()); 40*5a83710eSEric Fiselier } 41*5a83710eSEric Fiselier catch (std::out_of_range&) 42*5a83710eSEric Fiselier { 43*5a83710eSEric Fiselier assert(pos > str.size()); 44*5a83710eSEric Fiselier } 45*5a83710eSEric Fiselier } 46*5a83710eSEric Fiselier 47*5a83710eSEric Fiselier template <class S> 48*5a83710eSEric Fiselier void 49*5a83710eSEric Fiselier test(S str, unsigned pos, unsigned n) 50*5a83710eSEric Fiselier { 51*5a83710eSEric Fiselier typedef typename S::traits_type T; 52*5a83710eSEric Fiselier typedef typename S::allocator_type A; 53*5a83710eSEric Fiselier try 54*5a83710eSEric Fiselier { 55*5a83710eSEric Fiselier S s2(str, pos, n); 56*5a83710eSEric Fiselier assert(s2.__invariants()); 57*5a83710eSEric Fiselier assert(pos <= str.size()); 58*5a83710eSEric Fiselier unsigned rlen = std::min<unsigned>(str.size() - pos, n); 59*5a83710eSEric Fiselier assert(s2.size() == rlen); 60*5a83710eSEric Fiselier assert(T::compare(s2.data(), str.data() + pos, rlen) == 0); 61*5a83710eSEric Fiselier assert(s2.get_allocator() == A()); 62*5a83710eSEric Fiselier assert(s2.capacity() >= s2.size()); 63*5a83710eSEric Fiselier } 64*5a83710eSEric Fiselier catch (std::out_of_range&) 65*5a83710eSEric Fiselier { 66*5a83710eSEric Fiselier assert(pos > str.size()); 67*5a83710eSEric Fiselier } 68*5a83710eSEric Fiselier } 69*5a83710eSEric Fiselier 70*5a83710eSEric Fiselier template <class S> 71*5a83710eSEric Fiselier void 72*5a83710eSEric Fiselier test(S str, unsigned pos, unsigned n, const typename S::allocator_type& a) 73*5a83710eSEric Fiselier { 74*5a83710eSEric Fiselier typedef typename S::traits_type T; 75*5a83710eSEric Fiselier typedef typename S::allocator_type A; 76*5a83710eSEric Fiselier try 77*5a83710eSEric Fiselier { 78*5a83710eSEric Fiselier S s2(str, pos, n, a); 79*5a83710eSEric Fiselier assert(s2.__invariants()); 80*5a83710eSEric Fiselier assert(pos <= str.size()); 81*5a83710eSEric Fiselier unsigned rlen = std::min<unsigned>(str.size() - pos, n); 82*5a83710eSEric Fiselier assert(s2.size() == rlen); 83*5a83710eSEric Fiselier assert(T::compare(s2.data(), str.data() + pos, rlen) == 0); 84*5a83710eSEric Fiselier assert(s2.get_allocator() == a); 85*5a83710eSEric Fiselier assert(s2.capacity() >= s2.size()); 86*5a83710eSEric Fiselier } 87*5a83710eSEric Fiselier catch (std::out_of_range&) 88*5a83710eSEric Fiselier { 89*5a83710eSEric Fiselier assert(pos > str.size()); 90*5a83710eSEric Fiselier } 91*5a83710eSEric Fiselier } 92*5a83710eSEric Fiselier 93*5a83710eSEric Fiselier int main() 94*5a83710eSEric Fiselier { 95*5a83710eSEric Fiselier { 96*5a83710eSEric Fiselier typedef test_allocator<char> A; 97*5a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, A> S; 98*5a83710eSEric Fiselier 99*5a83710eSEric Fiselier test(S(A(3)), 0); 100*5a83710eSEric Fiselier test(S(A(3)), 1); 101*5a83710eSEric Fiselier test(S("1", A(5)), 0); 102*5a83710eSEric Fiselier test(S("1", A(5)), 1); 103*5a83710eSEric Fiselier test(S("1", A(5)), 2); 104*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 0); 105*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 5); 106*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50); 107*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 500); 108*5a83710eSEric Fiselier 109*5a83710eSEric Fiselier test(S(A(3)), 0, 0); 110*5a83710eSEric Fiselier test(S(A(3)), 0, 1); 111*5a83710eSEric Fiselier test(S(A(3)), 1, 0); 112*5a83710eSEric Fiselier test(S(A(3)), 1, 1); 113*5a83710eSEric Fiselier test(S(A(3)), 1, 2); 114*5a83710eSEric Fiselier test(S("1", A(5)), 0, 0); 115*5a83710eSEric Fiselier test(S("1", A(5)), 0, 1); 116*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 0); 117*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 1); 118*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 10); 119*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 100); 120*5a83710eSEric Fiselier 121*5a83710eSEric Fiselier test(S(A(3)), 0, 0, A(4)); 122*5a83710eSEric Fiselier test(S(A(3)), 0, 1, A(4)); 123*5a83710eSEric Fiselier test(S(A(3)), 1, 0, A(4)); 124*5a83710eSEric Fiselier test(S(A(3)), 1, 1, A(4)); 125*5a83710eSEric Fiselier test(S(A(3)), 1, 2, A(4)); 126*5a83710eSEric Fiselier test(S("1", A(5)), 0, 0, A(6)); 127*5a83710eSEric Fiselier test(S("1", A(5)), 0, 1, A(6)); 128*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 0, A(8)); 129*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 1, A(8)); 130*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 10, A(8)); 131*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 100, A(8)); 132*5a83710eSEric Fiselier } 133*5a83710eSEric Fiselier #if __cplusplus >= 201103L 134*5a83710eSEric Fiselier { 135*5a83710eSEric Fiselier typedef min_allocator<char> A; 136*5a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, A> S; 137*5a83710eSEric Fiselier 138*5a83710eSEric Fiselier test(S(A()), 0); 139*5a83710eSEric Fiselier test(S(A()), 1); 140*5a83710eSEric Fiselier test(S("1", A()), 0); 141*5a83710eSEric Fiselier test(S("1", A()), 1); 142*5a83710eSEric Fiselier test(S("1", A()), 2); 143*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 0); 144*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 5); 145*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50); 146*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 500); 147*5a83710eSEric Fiselier 148*5a83710eSEric Fiselier test(S(A()), 0, 0); 149*5a83710eSEric Fiselier test(S(A()), 0, 1); 150*5a83710eSEric Fiselier test(S(A()), 1, 0); 151*5a83710eSEric Fiselier test(S(A()), 1, 1); 152*5a83710eSEric Fiselier test(S(A()), 1, 2); 153*5a83710eSEric Fiselier test(S("1", A()), 0, 0); 154*5a83710eSEric Fiselier test(S("1", A()), 0, 1); 155*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 0); 156*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 1); 157*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 10); 158*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 100); 159*5a83710eSEric Fiselier 160*5a83710eSEric Fiselier test(S(A()), 0, 0, A()); 161*5a83710eSEric Fiselier test(S(A()), 0, 1, A()); 162*5a83710eSEric Fiselier test(S(A()), 1, 0, A()); 163*5a83710eSEric Fiselier test(S(A()), 1, 1, A()); 164*5a83710eSEric Fiselier test(S(A()), 1, 2, A()); 165*5a83710eSEric Fiselier test(S("1", A()), 0, 0, A()); 166*5a83710eSEric Fiselier test(S("1", A()), 0, 1, A()); 167*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 0, A()); 168*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 1, A()); 169*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 10, A()); 170*5a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 100, A()); 171*5a83710eSEric Fiselier } 172*5a83710eSEric Fiselier #endif 173*5a83710eSEric Fiselier } 174