1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===------------------------ memory.cpp ----------------------------------===// 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 1046e9493c687004357f757d08335c3ec411a361fdHoward Hinnant#define _LIBCPP_BUILDING_MEMORY 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "memory" 128d86b2e6867297fb2109824c67c50de67f3a31f2Jonathan Roelofs#ifndef _LIBCPP_HAS_NO_THREADS 135fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant#include "mutex" 1465f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant#include "thread" 158d86b2e6867297fb2109824c67c50de67f3a31f2Jonathan Roelofs#endif 16c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier#include "support/atomic_support.h" 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 23c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier// NOTE: Relaxed and acq/rel atomics (for increment and decrement respectively) 24c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier// should be sufficient for thread safety. 25c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier// See https://llvm.org/bugs/show_bug.cgi?id=22803 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T> 27adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnantinline T 281694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantincrement(T& t) _NOEXCEPT 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 30c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier return __libcpp_atomic_add(&t, 1, _AO_Relaxed); 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T> 34adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnantinline T 351694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantdecrement(T& t) _NOEXCEPT 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 37c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier return __libcpp_atomic_add(&t, -1, _AO_Acq_Rel); 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} // namespace 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst allocator_arg_t allocator_arg = allocator_arg_t(); 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 441694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantbad_weak_ptr::~bad_weak_ptr() _NOEXCEPT {} 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char* 471694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantbad_weak_ptr::what() const _NOEXCEPT 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return "bad_weak_ptr"; 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__shared_count::~__shared_count() 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 571694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_count::__add_shared() _NOEXCEPT 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant increment(__shared_owners_); 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 6228dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnantbool 631694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_count::__release_shared() _NOEXCEPT 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (decrement(__shared_owners_) == -1) 6628dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant { 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __on_zero_shared(); 6828dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant return true; 6928dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant } 7028dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant return false; 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__shared_weak_count::~__shared_weak_count() 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 781694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__add_shared() _NOEXCEPT 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __shared_count::__add_shared(); 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 841694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__add_weak() _NOEXCEPT 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant increment(__shared_weak_owners_); 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 901694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__release_shared() _NOEXCEPT 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 9228dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant if (__shared_count::__release_shared()) 9328dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant __release_weak(); 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 971694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__release_weak() _NOEXCEPT 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (decrement(__shared_weak_owners_) == -1) 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __on_zero_shared_weak(); 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__shared_weak_count* 1041694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::lock() _NOEXCEPT 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 106c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier long object_owners = __libcpp_atomic_load(&__shared_owners_); 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant while (object_owners != -1) 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 109c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier if (__libcpp_atomic_compare_exchange(&__shared_owners_, 110c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier &object_owners, 111c6e466911f803e85548887c3acb50d6fa5c4b071Eric Fiselier object_owners+1)) 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return this; 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return 0; 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 11701f6a1410c6d468a461339a015e2f9419287fed1Eric Fiselier#if !defined(_LIBCPP_NO_RTTI) || !defined(_LIBCPP_BUILD_STATIC) 118d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst void* 1201694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__get_deleter(const type_info&) const _NOEXCEPT 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return 0; 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12516e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif // _LIBCPP_NO_RTTI 126d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant 127baed05dd373652596db041a469ed655c5ee49e50Jonathan Roelofs#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS) 12896c60b482ef2614185e3fa0c606f87c3efcf1e85Howard Hinnant 1295fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnantstatic const std::size_t __sp_mut_count = 16; 130e33c2d1926f49221c9d72a353d797d135a810d77Howard Hinnantstatic pthread_mutex_t mut_back_imp[__sp_mut_count] = 131e33c2d1926f49221c9d72a353d797d135a810d77Howard Hinnant{ 132e33c2d1926f49221c9d72a353d797d135a810d77Howard Hinnant PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 133e33c2d1926f49221c9d72a353d797d135a810d77Howard Hinnant PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 134e33c2d1926f49221c9d72a353d797d135a810d77Howard Hinnant PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 135e33c2d1926f49221c9d72a353d797d135a810d77Howard Hinnant PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER 136e33c2d1926f49221c9d72a353d797d135a810d77Howard Hinnant}; 137e33c2d1926f49221c9d72a353d797d135a810d77Howard Hinnant 138e33c2d1926f49221c9d72a353d797d135a810d77Howard Hinnantstatic mutex* mut_back = reinterpret_cast<std::mutex*>(mut_back_imp); 1395fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant 1405fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant_LIBCPP_CONSTEXPR __sp_mut::__sp_mut(void* p) _NOEXCEPT 1419c0df1416f2cec1cc6cce797d18ddc5e50b64797Howard Hinnant : __lx(p) 1425fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant{ 1435fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant} 1445fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant 1455fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnantvoid 1465fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant__sp_mut::lock() _NOEXCEPT 1475fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant{ 1489c0df1416f2cec1cc6cce797d18ddc5e50b64797Howard Hinnant mutex& m = *static_cast<mutex*>(__lx); 14965f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant unsigned count = 0; 15065f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant while (!m.try_lock()) 15165f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant { 15265f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant if (++count > 16) 15365f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant { 15465f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant m.lock(); 15565f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant break; 15665f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant } 15765f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant this_thread::yield(); 15865f059b842cc5b7990933781e119a5f14abc3504Howard Hinnant } 1595fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant} 1605fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant 1615fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnantvoid 1625fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant__sp_mut::unlock() _NOEXCEPT 1635fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant{ 1649c0df1416f2cec1cc6cce797d18ddc5e50b64797Howard Hinnant static_cast<mutex*>(__lx)->unlock(); 1655fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant} 1665fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant 1675fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant__sp_mut& 1685fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant__get_sp_mut(const void* p) 1695fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant{ 1705fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant static __sp_mut muts[__sp_mut_count] 1715fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant { 1725fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant &mut_back[ 0], &mut_back[ 1], &mut_back[ 2], &mut_back[ 3], 1735fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant &mut_back[ 4], &mut_back[ 5], &mut_back[ 6], &mut_back[ 7], 1745fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant &mut_back[ 8], &mut_back[ 9], &mut_back[10], &mut_back[11], 1755fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant &mut_back[12], &mut_back[13], &mut_back[14], &mut_back[15] 1765fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant }; 1775fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant return muts[hash<const void*>()(p) & (__sp_mut_count-1)]; 1785fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant} 1795fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant 1808d86b2e6867297fb2109824c67c50de67f3a31f2Jonathan Roelofs#endif // __has_feature(cxx_atomic) && !_LIBCPP_HAS_NO_THREADS 1815fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant 182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantdeclare_reachable(void*) 184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantdeclare_no_pointers(char*, size_t) 189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantundeclare_no_pointers(char*, size_t) 194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpointer_safety 1981694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantget_pointer_safety() _NOEXCEPT 199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return pointer_safety::relaxed; 201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid* 204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__undeclare_reachable(void* p) 205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return p; 207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid* 210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantalign(size_t alignment, size_t size, void*& ptr, size_t& space) 211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant void* r = nullptr; 213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (size <= space) 214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* p1 = static_cast<char*>(ptr); 2164c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger char* p2 = reinterpret_cast<char*>(reinterpret_cast<size_t>(p1 + (alignment - 1)) & -alignment); 217ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant size_t d = static_cast<size_t>(p2 - p1); 218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (d <= space - size) 219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant r = p2; 221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ptr = r; 222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant space -= d; 223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return r; 226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD 229