1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <string> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// void reserve(size_type res_arg=0); 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <string> 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <stdexcept> 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 18061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h" 199dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class S> 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest(S s) 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typename S::size_type old_cap = s.capacity(); 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant S s0 = s; 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant s.reserve(); 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(s.__invariants()); 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(s == s0); 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(s.capacity() <= old_cap); 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(s.capacity() >= s.size()); 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class S> 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest(S s, typename S::size_type res_arg) 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typename S::size_type old_cap = s.capacity(); 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant S s0 = s; 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant try 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant s.reserve(res_arg); 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(res_arg <= s.max_size()); 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(s == s0); 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(s.capacity() >= res_arg); 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(s.capacity() >= s.size()); 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant catch (std::length_error&) 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(res_arg > s.max_size()); 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 559dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant { 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::string S; 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant S s; 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s); 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant s.assign(10, 'a'); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant s.erase(5); 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s); 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant s.assign(100, 'a'); 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant s.erase(50); 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s); 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant S s; 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s, 5); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s, 10); 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s, 50); 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant S s(100, 'a'); 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant s.erase(50); 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s, 5); 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s, 10); 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s, 50); 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s, 100); 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(s, S::npos); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 849dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant } 859dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant#if __cplusplus >= 201103L 869dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant { 879dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; 889dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant { 899dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant S s; 909dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s); 919dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant 929dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant s.assign(10, 'a'); 939dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant s.erase(5); 949dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s); 959dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant 969dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant s.assign(100, 'a'); 979dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant s.erase(50); 989dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s); 999dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant } 1009dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant { 1019dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant S s; 1029dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s, 5); 1039dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s, 10); 1049dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s, 50); 1059dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant } 1069dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant { 1079dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant S s(100, 'a'); 1089dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant s.erase(50); 1099dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s, 5); 1109dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s, 10); 1119dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s, 50); 1129dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s, 100); 1139dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test(s, S::npos); 1149dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant } 1159dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant } 1169dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant#endif 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 118