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 // void reserve(size_type res_arg=0); 13*5a83710eSEric Fiselier 14*5a83710eSEric Fiselier #include <string> 15*5a83710eSEric Fiselier #include <stdexcept> 16*5a83710eSEric Fiselier #include <cassert> 17*5a83710eSEric Fiselier 18*5a83710eSEric Fiselier #include "min_allocator.h" 19*5a83710eSEric Fiselier 20*5a83710eSEric Fiselier template <class S> 21*5a83710eSEric Fiselier void 22*5a83710eSEric Fiselier test(S s) 23*5a83710eSEric Fiselier { 24*5a83710eSEric Fiselier typename S::size_type old_cap = s.capacity(); 25*5a83710eSEric Fiselier S s0 = s; 26*5a83710eSEric Fiselier s.reserve(); 27*5a83710eSEric Fiselier assert(s.__invariants()); 28*5a83710eSEric Fiselier assert(s == s0); 29*5a83710eSEric Fiselier assert(s.capacity() <= old_cap); 30*5a83710eSEric Fiselier assert(s.capacity() >= s.size()); 31*5a83710eSEric Fiselier } 32*5a83710eSEric Fiselier 33*5a83710eSEric Fiselier template <class S> 34*5a83710eSEric Fiselier void 35*5a83710eSEric Fiselier test(S s, typename S::size_type res_arg) 36*5a83710eSEric Fiselier { 37*5a83710eSEric Fiselier typename S::size_type old_cap = s.capacity(); 38*5a83710eSEric Fiselier S s0 = s; 39*5a83710eSEric Fiselier try 40*5a83710eSEric Fiselier { 41*5a83710eSEric Fiselier s.reserve(res_arg); 42*5a83710eSEric Fiselier assert(res_arg <= s.max_size()); 43*5a83710eSEric Fiselier assert(s == s0); 44*5a83710eSEric Fiselier assert(s.capacity() >= res_arg); 45*5a83710eSEric Fiselier assert(s.capacity() >= s.size()); 46*5a83710eSEric Fiselier } 47*5a83710eSEric Fiselier catch (std::length_error&) 48*5a83710eSEric Fiselier { 49*5a83710eSEric Fiselier assert(res_arg > s.max_size()); 50*5a83710eSEric Fiselier } 51*5a83710eSEric Fiselier } 52*5a83710eSEric Fiselier 53*5a83710eSEric Fiselier int main() 54*5a83710eSEric Fiselier { 55*5a83710eSEric Fiselier { 56*5a83710eSEric Fiselier typedef std::string S; 57*5a83710eSEric Fiselier { 58*5a83710eSEric Fiselier S s; 59*5a83710eSEric Fiselier test(s); 60*5a83710eSEric Fiselier 61*5a83710eSEric Fiselier s.assign(10, 'a'); 62*5a83710eSEric Fiselier s.erase(5); 63*5a83710eSEric Fiselier test(s); 64*5a83710eSEric Fiselier 65*5a83710eSEric Fiselier s.assign(100, 'a'); 66*5a83710eSEric Fiselier s.erase(50); 67*5a83710eSEric Fiselier test(s); 68*5a83710eSEric Fiselier } 69*5a83710eSEric Fiselier { 70*5a83710eSEric Fiselier S s; 71*5a83710eSEric Fiselier test(s, 5); 72*5a83710eSEric Fiselier test(s, 10); 73*5a83710eSEric Fiselier test(s, 50); 74*5a83710eSEric Fiselier } 75*5a83710eSEric Fiselier { 76*5a83710eSEric Fiselier S s(100, 'a'); 77*5a83710eSEric Fiselier s.erase(50); 78*5a83710eSEric Fiselier test(s, 5); 79*5a83710eSEric Fiselier test(s, 10); 80*5a83710eSEric Fiselier test(s, 50); 81*5a83710eSEric Fiselier test(s, 100); 82*5a83710eSEric Fiselier test(s, S::npos); 83*5a83710eSEric Fiselier } 84*5a83710eSEric Fiselier } 85*5a83710eSEric Fiselier #if __cplusplus >= 201103L 86*5a83710eSEric Fiselier { 87*5a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; 88*5a83710eSEric Fiselier { 89*5a83710eSEric Fiselier S s; 90*5a83710eSEric Fiselier test(s); 91*5a83710eSEric Fiselier 92*5a83710eSEric Fiselier s.assign(10, 'a'); 93*5a83710eSEric Fiselier s.erase(5); 94*5a83710eSEric Fiselier test(s); 95*5a83710eSEric Fiselier 96*5a83710eSEric Fiselier s.assign(100, 'a'); 97*5a83710eSEric Fiselier s.erase(50); 98*5a83710eSEric Fiselier test(s); 99*5a83710eSEric Fiselier } 100*5a83710eSEric Fiselier { 101*5a83710eSEric Fiselier S s; 102*5a83710eSEric Fiselier test(s, 5); 103*5a83710eSEric Fiselier test(s, 10); 104*5a83710eSEric Fiselier test(s, 50); 105*5a83710eSEric Fiselier } 106*5a83710eSEric Fiselier { 107*5a83710eSEric Fiselier S s(100, 'a'); 108*5a83710eSEric Fiselier s.erase(50); 109*5a83710eSEric Fiselier test(s, 5); 110*5a83710eSEric Fiselier test(s, 10); 111*5a83710eSEric Fiselier test(s, 50); 112*5a83710eSEric Fiselier test(s, 100); 113*5a83710eSEric Fiselier test(s, S::npos); 114*5a83710eSEric Fiselier } 115*5a83710eSEric Fiselier } 116*5a83710eSEric Fiselier #endif 117*5a83710eSEric Fiselier } 118