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// size_type rfind(const charT* s, size_type pos = npos) const; 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <string> 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 17061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h" 189dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class S> 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest(const S& s, const typename S::value_type* str, typename S::size_type pos, 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typename S::size_type x) 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(s.rfind(str, pos) == x); 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (x != S::npos) 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typename S::size_type n = S::traits_type::length(str); 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(x <= pos && x + n <= s.size()); 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class S> 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest(const S& s, const typename S::value_type* str, typename S::size_type x) 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(s.rfind(str) == x); 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (x != S::npos) 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typename S::size_type pos = s.size(); 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typename S::size_type n = S::traits_type::length(str); 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(x <= pos && x + n <= s.size()); 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 459dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S> 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test0() 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "", 0, 0); 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "abcde", 0, S::npos); 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "abcdeabcde", 0, S::npos); 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "abcdeabcdeabcdeabcde", 0, S::npos); 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "", 1, 0); 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "abcde", 1, S::npos); 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "abcdeabcde", 1, S::npos); 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "abcdeabcdeabcdeabcde", 1, S::npos); 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "", 0, 0); 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcde", 0, 0); 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcde", 0, S::npos); 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcdeabcdeabcde", 0, S::npos); 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "", 1, 1); 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcde", 1, 0); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcde", 1, S::npos); 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcdeabcdeabcde", 1, S::npos); 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "", 2, 2); 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcde", 2, 0); 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcde", 2, S::npos); 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcdeabcdeabcde", 2, S::npos); 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "", 4, 4); 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcde", 4, 0); 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcde", 4, S::npos); 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcdeabcdeabcde", 4, S::npos); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "", 5, 5); 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcde", 5, 0); 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcde", 5, S::npos); 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcdeabcdeabcde", 5, S::npos); 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "", 6, 5); 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcde", 6, 0); 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcde", 6, S::npos); 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcdeabcdeabcde", 6, S::npos); 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "", 0, 0); 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcde", 0, 0); 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcde", 0, 0); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, S::npos); 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "", 1, 1); 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcde", 1, 0); 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcde", 1, 0); 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, S::npos); 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "", 5, 5); 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcde", 5, 5); 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcde", 5, 0); 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, S::npos); 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "", 9, 9); 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcde", 9, 5); 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcde", 9, 0); 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, S::npos); 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "", 10, 10); 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcde", 10, 5); 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcde", 10, 0); 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, S::npos); 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "", 11, 10); 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcde", 11, 5); 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcde", 11, 0); 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, S::npos); 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "", 0, 0); 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 0); 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 0); 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0); 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "", 1, 1); 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 0); 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 0); 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 0); 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "", 10, 10); 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 10); 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 10); 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 0); 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "", 19, 19); 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 15); 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 10); 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 0); 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "", 20, 20); 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 15); 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 10); 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 0); 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "", 21, 20); 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 15); 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 10); 127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 0); 128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 1309dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S> 131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test1() 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "", 0); 134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "abcde", S::npos); 135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "abcdeabcde", S::npos); 136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S(""), "abcdeabcdeabcdeabcde", S::npos); 137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "", 5); 138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcde", 0); 139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcde", S::npos); 140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcde"), "abcdeabcdeabcdeabcde", S::npos); 141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "", 10); 142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcde", 5); 143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcde", 0); 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", S::npos); 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "", 20); 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcde", 15); 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10); 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0); 149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 1539dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant { 1549dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant typedef std::string S; 1559dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test0<S>(); 1569dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test1<S>(); 1579dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant } 1589dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant#if __cplusplus >= 201103L 1599dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant { 1609dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; 1619dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test0<S>(); 1629dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant test1<S>(); 1639dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant } 1649dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant#endif 165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 166