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