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 // template<class InputIterator> 13*5a83710eSEric Fiselier // basic_string(InputIterator begin, InputIterator end, 14*5a83710eSEric Fiselier // const Allocator& a = Allocator()); 15*5a83710eSEric Fiselier 16*5a83710eSEric Fiselier #include <string> 17*5a83710eSEric Fiselier #include <iterator> 18*5a83710eSEric Fiselier #include <cassert> 19*5a83710eSEric Fiselier 20*5a83710eSEric Fiselier #include "test_allocator.h" 21*5a83710eSEric Fiselier #include "../input_iterator.h" 22*5a83710eSEric Fiselier #include "min_allocator.h" 23*5a83710eSEric Fiselier 24*5a83710eSEric Fiselier template <class It> 25*5a83710eSEric Fiselier void 26*5a83710eSEric Fiselier test(It first, It last) 27*5a83710eSEric Fiselier { 28*5a83710eSEric Fiselier typedef typename std::iterator_traits<It>::value_type charT; 29*5a83710eSEric Fiselier typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S; 30*5a83710eSEric Fiselier typedef typename S::traits_type T; 31*5a83710eSEric Fiselier typedef typename S::allocator_type A; 32*5a83710eSEric Fiselier S s2(first, last); 33*5a83710eSEric Fiselier assert(s2.__invariants()); 34*5a83710eSEric Fiselier assert(s2.size() == std::distance(first, last)); 35*5a83710eSEric Fiselier unsigned i = 0; 36*5a83710eSEric Fiselier for (It it = first; it != last; ++it, ++i) 37*5a83710eSEric Fiselier assert(s2[i] == *it); 38*5a83710eSEric Fiselier assert(s2.get_allocator() == A()); 39*5a83710eSEric Fiselier assert(s2.capacity() >= s2.size()); 40*5a83710eSEric Fiselier } 41*5a83710eSEric Fiselier 42*5a83710eSEric Fiselier template <class It, class A> 43*5a83710eSEric Fiselier void 44*5a83710eSEric Fiselier test(It first, It last, const A& a) 45*5a83710eSEric Fiselier { 46*5a83710eSEric Fiselier typedef typename std::iterator_traits<It>::value_type charT; 47*5a83710eSEric Fiselier typedef std::basic_string<charT, std::char_traits<charT>, A> S; 48*5a83710eSEric Fiselier typedef typename S::traits_type T; 49*5a83710eSEric Fiselier S s2(first, last, a); 50*5a83710eSEric Fiselier assert(s2.__invariants()); 51*5a83710eSEric Fiselier assert(s2.size() == std::distance(first, last)); 52*5a83710eSEric Fiselier unsigned i = 0; 53*5a83710eSEric Fiselier for (It it = first; it != last; ++it, ++i) 54*5a83710eSEric Fiselier assert(s2[i] == *it); 55*5a83710eSEric Fiselier assert(s2.get_allocator() == a); 56*5a83710eSEric Fiselier assert(s2.capacity() >= s2.size()); 57*5a83710eSEric Fiselier } 58*5a83710eSEric Fiselier 59*5a83710eSEric Fiselier int main() 60*5a83710eSEric Fiselier { 61*5a83710eSEric Fiselier { 62*5a83710eSEric Fiselier typedef test_allocator<char> A; 63*5a83710eSEric Fiselier const char* s = "12345678901234567890123456789012345678901234567890"; 64*5a83710eSEric Fiselier 65*5a83710eSEric Fiselier test(s, s); 66*5a83710eSEric Fiselier test(s, s, A(2)); 67*5a83710eSEric Fiselier 68*5a83710eSEric Fiselier test(s, s+1); 69*5a83710eSEric Fiselier test(s, s+1, A(2)); 70*5a83710eSEric Fiselier 71*5a83710eSEric Fiselier test(s, s+10); 72*5a83710eSEric Fiselier test(s, s+10, A(2)); 73*5a83710eSEric Fiselier 74*5a83710eSEric Fiselier test(s, s+50); 75*5a83710eSEric Fiselier test(s, s+50, A(2)); 76*5a83710eSEric Fiselier 77*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s)); 78*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s), A(2)); 79*5a83710eSEric Fiselier 80*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+1)); 81*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+1), A(2)); 82*5a83710eSEric Fiselier 83*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+10)); 84*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+10), A(2)); 85*5a83710eSEric Fiselier 86*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+50)); 87*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+50), A(2)); 88*5a83710eSEric Fiselier } 89*5a83710eSEric Fiselier #if __cplusplus >= 201103L 90*5a83710eSEric Fiselier { 91*5a83710eSEric Fiselier typedef min_allocator<char> A; 92*5a83710eSEric Fiselier const char* s = "12345678901234567890123456789012345678901234567890"; 93*5a83710eSEric Fiselier 94*5a83710eSEric Fiselier test(s, s); 95*5a83710eSEric Fiselier test(s, s, A()); 96*5a83710eSEric Fiselier 97*5a83710eSEric Fiselier test(s, s+1); 98*5a83710eSEric Fiselier test(s, s+1, A()); 99*5a83710eSEric Fiselier 100*5a83710eSEric Fiselier test(s, s+10); 101*5a83710eSEric Fiselier test(s, s+10, A()); 102*5a83710eSEric Fiselier 103*5a83710eSEric Fiselier test(s, s+50); 104*5a83710eSEric Fiselier test(s, s+50, A()); 105*5a83710eSEric Fiselier 106*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s)); 107*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s), A()); 108*5a83710eSEric Fiselier 109*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+1)); 110*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+1), A()); 111*5a83710eSEric Fiselier 112*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+10)); 113*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+10), A()); 114*5a83710eSEric Fiselier 115*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+50)); 116*5a83710eSEric Fiselier test(input_iterator<const char*>(s), input_iterator<const char*>(s+50), A()); 117*5a83710eSEric Fiselier } 118*5a83710eSEric Fiselier #endif 119*5a83710eSEric Fiselier } 120