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