1*58b9f456SAndroid Build Coastguard Worker //===-------------------------- debug.cpp ---------------------------------===//
2*58b9f456SAndroid Build Coastguard Worker //
3*58b9f456SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*58b9f456SAndroid Build Coastguard Worker //
5*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
6*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
7*58b9f456SAndroid Build Coastguard Worker //
8*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*58b9f456SAndroid Build Coastguard Worker
10*58b9f456SAndroid Build Coastguard Worker #include "__config"
11*58b9f456SAndroid Build Coastguard Worker #include "__debug"
12*58b9f456SAndroid Build Coastguard Worker #include "functional"
13*58b9f456SAndroid Build Coastguard Worker #include "algorithm"
14*58b9f456SAndroid Build Coastguard Worker #include "string"
15*58b9f456SAndroid Build Coastguard Worker #include "cstdio"
16*58b9f456SAndroid Build Coastguard Worker #include "__hash_table"
17*58b9f456SAndroid Build Coastguard Worker #include "mutex"
18*58b9f456SAndroid Build Coastguard Worker
19*58b9f456SAndroid Build Coastguard Worker _LIBCPP_BEGIN_NAMESPACE_STD
20*58b9f456SAndroid Build Coastguard Worker
make_what_str(__libcpp_debug_info const & info)21*58b9f456SAndroid Build Coastguard Worker static std::string make_what_str(__libcpp_debug_info const& info) {
22*58b9f456SAndroid Build Coastguard Worker string msg = info.__file_;
23*58b9f456SAndroid Build Coastguard Worker msg += ":" + to_string(info.__line_) + ": _LIBCPP_ASSERT '";
24*58b9f456SAndroid Build Coastguard Worker msg += info.__pred_;
25*58b9f456SAndroid Build Coastguard Worker msg += "' failed. ";
26*58b9f456SAndroid Build Coastguard Worker msg += info.__msg_;
27*58b9f456SAndroid Build Coastguard Worker return msg;
28*58b9f456SAndroid Build Coastguard Worker }
29*58b9f456SAndroid Build Coastguard Worker
30*58b9f456SAndroid Build Coastguard Worker _LIBCPP_SAFE_STATIC __libcpp_debug_function_type
31*58b9f456SAndroid Build Coastguard Worker __libcpp_debug_function = __libcpp_abort_debug_function;
32*58b9f456SAndroid Build Coastguard Worker
__libcpp_set_debug_function(__libcpp_debug_function_type __func)33*58b9f456SAndroid Build Coastguard Worker bool __libcpp_set_debug_function(__libcpp_debug_function_type __func) {
34*58b9f456SAndroid Build Coastguard Worker __libcpp_debug_function = __func;
35*58b9f456SAndroid Build Coastguard Worker return true;
36*58b9f456SAndroid Build Coastguard Worker }
37*58b9f456SAndroid Build Coastguard Worker
__libcpp_abort_debug_function(__libcpp_debug_info const & info)38*58b9f456SAndroid Build Coastguard Worker _LIBCPP_NORETURN void __libcpp_abort_debug_function(__libcpp_debug_info const& info) {
39*58b9f456SAndroid Build Coastguard Worker std::fprintf(stderr, "%s\n", make_what_str(info).c_str());
40*58b9f456SAndroid Build Coastguard Worker std::abort();
41*58b9f456SAndroid Build Coastguard Worker }
42*58b9f456SAndroid Build Coastguard Worker
__libcpp_throw_debug_function(__libcpp_debug_info const & info)43*58b9f456SAndroid Build Coastguard Worker _LIBCPP_NORETURN void __libcpp_throw_debug_function(__libcpp_debug_info const& info) {
44*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_NO_EXCEPTIONS
45*58b9f456SAndroid Build Coastguard Worker throw __libcpp_debug_exception(info);
46*58b9f456SAndroid Build Coastguard Worker #else
47*58b9f456SAndroid Build Coastguard Worker __libcpp_abort_debug_function(info);
48*58b9f456SAndroid Build Coastguard Worker #endif
49*58b9f456SAndroid Build Coastguard Worker }
50*58b9f456SAndroid Build Coastguard Worker
51*58b9f456SAndroid Build Coastguard Worker struct __libcpp_debug_exception::__libcpp_debug_exception_imp {
52*58b9f456SAndroid Build Coastguard Worker __libcpp_debug_info __info_;
53*58b9f456SAndroid Build Coastguard Worker std::string __what_str_;
54*58b9f456SAndroid Build Coastguard Worker };
55*58b9f456SAndroid Build Coastguard Worker
__libcpp_debug_exception()56*58b9f456SAndroid Build Coastguard Worker __libcpp_debug_exception::__libcpp_debug_exception() _NOEXCEPT
57*58b9f456SAndroid Build Coastguard Worker : __imp_(nullptr) {
58*58b9f456SAndroid Build Coastguard Worker }
59*58b9f456SAndroid Build Coastguard Worker
__libcpp_debug_exception(__libcpp_debug_info const & info)60*58b9f456SAndroid Build Coastguard Worker __libcpp_debug_exception::__libcpp_debug_exception(
61*58b9f456SAndroid Build Coastguard Worker __libcpp_debug_info const& info) : __imp_(new __libcpp_debug_exception_imp)
62*58b9f456SAndroid Build Coastguard Worker {
63*58b9f456SAndroid Build Coastguard Worker __imp_->__info_ = info;
64*58b9f456SAndroid Build Coastguard Worker __imp_->__what_str_ = make_what_str(info);
65*58b9f456SAndroid Build Coastguard Worker }
__libcpp_debug_exception(__libcpp_debug_exception const & other)66*58b9f456SAndroid Build Coastguard Worker __libcpp_debug_exception::__libcpp_debug_exception(
67*58b9f456SAndroid Build Coastguard Worker __libcpp_debug_exception const& other) : __imp_(nullptr) {
68*58b9f456SAndroid Build Coastguard Worker if (other.__imp_)
69*58b9f456SAndroid Build Coastguard Worker __imp_ = new __libcpp_debug_exception_imp(*other.__imp_);
70*58b9f456SAndroid Build Coastguard Worker }
71*58b9f456SAndroid Build Coastguard Worker
~__libcpp_debug_exception()72*58b9f456SAndroid Build Coastguard Worker __libcpp_debug_exception::~__libcpp_debug_exception() _NOEXCEPT {
73*58b9f456SAndroid Build Coastguard Worker if (__imp_)
74*58b9f456SAndroid Build Coastguard Worker delete __imp_;
75*58b9f456SAndroid Build Coastguard Worker }
76*58b9f456SAndroid Build Coastguard Worker
what() const77*58b9f456SAndroid Build Coastguard Worker const char* __libcpp_debug_exception::what() const _NOEXCEPT {
78*58b9f456SAndroid Build Coastguard Worker if (__imp_)
79*58b9f456SAndroid Build Coastguard Worker return __imp_->__what_str_.c_str();
80*58b9f456SAndroid Build Coastguard Worker return "__libcpp_debug_exception";
81*58b9f456SAndroid Build Coastguard Worker }
82*58b9f456SAndroid Build Coastguard Worker
83*58b9f456SAndroid Build Coastguard Worker _LIBCPP_FUNC_VIS
84*58b9f456SAndroid Build Coastguard Worker __libcpp_db*
__get_db()85*58b9f456SAndroid Build Coastguard Worker __get_db()
86*58b9f456SAndroid Build Coastguard Worker {
87*58b9f456SAndroid Build Coastguard Worker static __libcpp_db db;
88*58b9f456SAndroid Build Coastguard Worker return &db;
89*58b9f456SAndroid Build Coastguard Worker }
90*58b9f456SAndroid Build Coastguard Worker
91*58b9f456SAndroid Build Coastguard Worker _LIBCPP_FUNC_VIS
92*58b9f456SAndroid Build Coastguard Worker const __libcpp_db*
__get_const_db()93*58b9f456SAndroid Build Coastguard Worker __get_const_db()
94*58b9f456SAndroid Build Coastguard Worker {
95*58b9f456SAndroid Build Coastguard Worker return __get_db();
96*58b9f456SAndroid Build Coastguard Worker }
97*58b9f456SAndroid Build Coastguard Worker
98*58b9f456SAndroid Build Coastguard Worker namespace
99*58b9f456SAndroid Build Coastguard Worker {
100*58b9f456SAndroid Build Coastguard Worker
101*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
102*58b9f456SAndroid Build Coastguard Worker typedef mutex mutex_type;
103*58b9f456SAndroid Build Coastguard Worker typedef lock_guard<mutex_type> WLock;
104*58b9f456SAndroid Build Coastguard Worker typedef lock_guard<mutex_type> RLock;
105*58b9f456SAndroid Build Coastguard Worker
106*58b9f456SAndroid Build Coastguard Worker mutex_type&
mut()107*58b9f456SAndroid Build Coastguard Worker mut()
108*58b9f456SAndroid Build Coastguard Worker {
109*58b9f456SAndroid Build Coastguard Worker static mutex_type m;
110*58b9f456SAndroid Build Coastguard Worker return m;
111*58b9f456SAndroid Build Coastguard Worker }
112*58b9f456SAndroid Build Coastguard Worker #endif // !_LIBCPP_HAS_NO_THREADS
113*58b9f456SAndroid Build Coastguard Worker
114*58b9f456SAndroid Build Coastguard Worker } // unnamed namespace
115*58b9f456SAndroid Build Coastguard Worker
~__i_node()116*58b9f456SAndroid Build Coastguard Worker __i_node::~__i_node()
117*58b9f456SAndroid Build Coastguard Worker {
118*58b9f456SAndroid Build Coastguard Worker if (__next_)
119*58b9f456SAndroid Build Coastguard Worker {
120*58b9f456SAndroid Build Coastguard Worker __next_->~__i_node();
121*58b9f456SAndroid Build Coastguard Worker free(__next_);
122*58b9f456SAndroid Build Coastguard Worker }
123*58b9f456SAndroid Build Coastguard Worker }
124*58b9f456SAndroid Build Coastguard Worker
~__c_node()125*58b9f456SAndroid Build Coastguard Worker __c_node::~__c_node()
126*58b9f456SAndroid Build Coastguard Worker {
127*58b9f456SAndroid Build Coastguard Worker free(beg_);
128*58b9f456SAndroid Build Coastguard Worker if (__next_)
129*58b9f456SAndroid Build Coastguard Worker {
130*58b9f456SAndroid Build Coastguard Worker __next_->~__c_node();
131*58b9f456SAndroid Build Coastguard Worker free(__next_);
132*58b9f456SAndroid Build Coastguard Worker }
133*58b9f456SAndroid Build Coastguard Worker }
134*58b9f456SAndroid Build Coastguard Worker
__libcpp_db()135*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__libcpp_db()
136*58b9f456SAndroid Build Coastguard Worker : __cbeg_(nullptr),
137*58b9f456SAndroid Build Coastguard Worker __cend_(nullptr),
138*58b9f456SAndroid Build Coastguard Worker __csz_(0),
139*58b9f456SAndroid Build Coastguard Worker __ibeg_(nullptr),
140*58b9f456SAndroid Build Coastguard Worker __iend_(nullptr),
141*58b9f456SAndroid Build Coastguard Worker __isz_(0)
142*58b9f456SAndroid Build Coastguard Worker {
143*58b9f456SAndroid Build Coastguard Worker }
144*58b9f456SAndroid Build Coastguard Worker
~__libcpp_db()145*58b9f456SAndroid Build Coastguard Worker __libcpp_db::~__libcpp_db()
146*58b9f456SAndroid Build Coastguard Worker {
147*58b9f456SAndroid Build Coastguard Worker if (__cbeg_)
148*58b9f456SAndroid Build Coastguard Worker {
149*58b9f456SAndroid Build Coastguard Worker for (__c_node** p = __cbeg_; p != __cend_; ++p)
150*58b9f456SAndroid Build Coastguard Worker {
151*58b9f456SAndroid Build Coastguard Worker if (*p != nullptr)
152*58b9f456SAndroid Build Coastguard Worker {
153*58b9f456SAndroid Build Coastguard Worker (*p)->~__c_node();
154*58b9f456SAndroid Build Coastguard Worker free(*p);
155*58b9f456SAndroid Build Coastguard Worker }
156*58b9f456SAndroid Build Coastguard Worker }
157*58b9f456SAndroid Build Coastguard Worker free(__cbeg_);
158*58b9f456SAndroid Build Coastguard Worker }
159*58b9f456SAndroid Build Coastguard Worker if (__ibeg_)
160*58b9f456SAndroid Build Coastguard Worker {
161*58b9f456SAndroid Build Coastguard Worker for (__i_node** p = __ibeg_; p != __iend_; ++p)
162*58b9f456SAndroid Build Coastguard Worker {
163*58b9f456SAndroid Build Coastguard Worker if (*p != nullptr)
164*58b9f456SAndroid Build Coastguard Worker {
165*58b9f456SAndroid Build Coastguard Worker (*p)->~__i_node();
166*58b9f456SAndroid Build Coastguard Worker free(*p);
167*58b9f456SAndroid Build Coastguard Worker }
168*58b9f456SAndroid Build Coastguard Worker }
169*58b9f456SAndroid Build Coastguard Worker free(__ibeg_);
170*58b9f456SAndroid Build Coastguard Worker }
171*58b9f456SAndroid Build Coastguard Worker }
172*58b9f456SAndroid Build Coastguard Worker
173*58b9f456SAndroid Build Coastguard Worker void*
__find_c_from_i(void * __i) const174*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__find_c_from_i(void* __i) const
175*58b9f456SAndroid Build Coastguard Worker {
176*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
177*58b9f456SAndroid Build Coastguard Worker RLock _(mut());
178*58b9f456SAndroid Build Coastguard Worker #endif
179*58b9f456SAndroid Build Coastguard Worker __i_node* i = __find_iterator(__i);
180*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(i != nullptr, "iterator not found in debug database.");
181*58b9f456SAndroid Build Coastguard Worker return i->__c_ != nullptr ? i->__c_->__c_ : nullptr;
182*58b9f456SAndroid Build Coastguard Worker }
183*58b9f456SAndroid Build Coastguard Worker
184*58b9f456SAndroid Build Coastguard Worker void
__insert_ic(void * __i,const void * __c)185*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__insert_ic(void* __i, const void* __c)
186*58b9f456SAndroid Build Coastguard Worker {
187*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
188*58b9f456SAndroid Build Coastguard Worker WLock _(mut());
189*58b9f456SAndroid Build Coastguard Worker #endif
190*58b9f456SAndroid Build Coastguard Worker if (__cbeg_ == __cend_)
191*58b9f456SAndroid Build Coastguard Worker return;
192*58b9f456SAndroid Build Coastguard Worker size_t hc = hash<const void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
193*58b9f456SAndroid Build Coastguard Worker __c_node* c = __cbeg_[hc];
194*58b9f456SAndroid Build Coastguard Worker if (c == nullptr)
195*58b9f456SAndroid Build Coastguard Worker return;
196*58b9f456SAndroid Build Coastguard Worker while (c->__c_ != __c)
197*58b9f456SAndroid Build Coastguard Worker {
198*58b9f456SAndroid Build Coastguard Worker c = c->__next_;
199*58b9f456SAndroid Build Coastguard Worker if (c == nullptr)
200*58b9f456SAndroid Build Coastguard Worker return;
201*58b9f456SAndroid Build Coastguard Worker }
202*58b9f456SAndroid Build Coastguard Worker __i_node* i = __insert_iterator(__i);
203*58b9f456SAndroid Build Coastguard Worker c->__add(i);
204*58b9f456SAndroid Build Coastguard Worker i->__c_ = c;
205*58b9f456SAndroid Build Coastguard Worker }
206*58b9f456SAndroid Build Coastguard Worker
207*58b9f456SAndroid Build Coastguard Worker __c_node*
__insert_c(void * __c)208*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__insert_c(void* __c)
209*58b9f456SAndroid Build Coastguard Worker {
210*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
211*58b9f456SAndroid Build Coastguard Worker WLock _(mut());
212*58b9f456SAndroid Build Coastguard Worker #endif
213*58b9f456SAndroid Build Coastguard Worker if (__csz_ + 1 > static_cast<size_t>(__cend_ - __cbeg_))
214*58b9f456SAndroid Build Coastguard Worker {
215*58b9f456SAndroid Build Coastguard Worker size_t nc = __next_prime(2*static_cast<size_t>(__cend_ - __cbeg_) + 1);
216*58b9f456SAndroid Build Coastguard Worker __c_node** cbeg = static_cast<__c_node**>(calloc(nc, sizeof(void*)));
217*58b9f456SAndroid Build Coastguard Worker if (cbeg == nullptr)
218*58b9f456SAndroid Build Coastguard Worker __throw_bad_alloc();
219*58b9f456SAndroid Build Coastguard Worker
220*58b9f456SAndroid Build Coastguard Worker for (__c_node** p = __cbeg_; p != __cend_; ++p)
221*58b9f456SAndroid Build Coastguard Worker {
222*58b9f456SAndroid Build Coastguard Worker __c_node* q = *p;
223*58b9f456SAndroid Build Coastguard Worker while (q != nullptr)
224*58b9f456SAndroid Build Coastguard Worker {
225*58b9f456SAndroid Build Coastguard Worker size_t h = hash<void*>()(q->__c_) % nc;
226*58b9f456SAndroid Build Coastguard Worker __c_node* r = q->__next_;
227*58b9f456SAndroid Build Coastguard Worker q->__next_ = cbeg[h];
228*58b9f456SAndroid Build Coastguard Worker cbeg[h] = q;
229*58b9f456SAndroid Build Coastguard Worker q = r;
230*58b9f456SAndroid Build Coastguard Worker }
231*58b9f456SAndroid Build Coastguard Worker }
232*58b9f456SAndroid Build Coastguard Worker free(__cbeg_);
233*58b9f456SAndroid Build Coastguard Worker __cbeg_ = cbeg;
234*58b9f456SAndroid Build Coastguard Worker __cend_ = __cbeg_ + nc;
235*58b9f456SAndroid Build Coastguard Worker }
236*58b9f456SAndroid Build Coastguard Worker size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
237*58b9f456SAndroid Build Coastguard Worker __c_node* p = __cbeg_[hc];
238*58b9f456SAndroid Build Coastguard Worker __c_node* r = __cbeg_[hc] =
239*58b9f456SAndroid Build Coastguard Worker static_cast<__c_node*>(malloc(sizeof(__c_node)));
240*58b9f456SAndroid Build Coastguard Worker if (__cbeg_[hc] == nullptr)
241*58b9f456SAndroid Build Coastguard Worker __throw_bad_alloc();
242*58b9f456SAndroid Build Coastguard Worker
243*58b9f456SAndroid Build Coastguard Worker r->__c_ = __c;
244*58b9f456SAndroid Build Coastguard Worker r->__next_ = p;
245*58b9f456SAndroid Build Coastguard Worker ++__csz_;
246*58b9f456SAndroid Build Coastguard Worker return r;
247*58b9f456SAndroid Build Coastguard Worker }
248*58b9f456SAndroid Build Coastguard Worker
249*58b9f456SAndroid Build Coastguard Worker void
__erase_i(void * __i)250*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__erase_i(void* __i)
251*58b9f456SAndroid Build Coastguard Worker {
252*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
253*58b9f456SAndroid Build Coastguard Worker WLock _(mut());
254*58b9f456SAndroid Build Coastguard Worker #endif
255*58b9f456SAndroid Build Coastguard Worker if (__ibeg_ != __iend_)
256*58b9f456SAndroid Build Coastguard Worker {
257*58b9f456SAndroid Build Coastguard Worker size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_);
258*58b9f456SAndroid Build Coastguard Worker __i_node* p = __ibeg_[hi];
259*58b9f456SAndroid Build Coastguard Worker if (p != nullptr)
260*58b9f456SAndroid Build Coastguard Worker {
261*58b9f456SAndroid Build Coastguard Worker __i_node* q = nullptr;
262*58b9f456SAndroid Build Coastguard Worker while (p->__i_ != __i)
263*58b9f456SAndroid Build Coastguard Worker {
264*58b9f456SAndroid Build Coastguard Worker q = p;
265*58b9f456SAndroid Build Coastguard Worker p = p->__next_;
266*58b9f456SAndroid Build Coastguard Worker if (p == nullptr)
267*58b9f456SAndroid Build Coastguard Worker return;
268*58b9f456SAndroid Build Coastguard Worker }
269*58b9f456SAndroid Build Coastguard Worker if (q == nullptr)
270*58b9f456SAndroid Build Coastguard Worker __ibeg_[hi] = p->__next_;
271*58b9f456SAndroid Build Coastguard Worker else
272*58b9f456SAndroid Build Coastguard Worker q->__next_ = p->__next_;
273*58b9f456SAndroid Build Coastguard Worker __c_node* c = p->__c_;
274*58b9f456SAndroid Build Coastguard Worker --__isz_;
275*58b9f456SAndroid Build Coastguard Worker if (c != nullptr)
276*58b9f456SAndroid Build Coastguard Worker c->__remove(p);
277*58b9f456SAndroid Build Coastguard Worker free(p);
278*58b9f456SAndroid Build Coastguard Worker }
279*58b9f456SAndroid Build Coastguard Worker }
280*58b9f456SAndroid Build Coastguard Worker }
281*58b9f456SAndroid Build Coastguard Worker
282*58b9f456SAndroid Build Coastguard Worker void
__invalidate_all(void * __c)283*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__invalidate_all(void* __c)
284*58b9f456SAndroid Build Coastguard Worker {
285*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
286*58b9f456SAndroid Build Coastguard Worker WLock _(mut());
287*58b9f456SAndroid Build Coastguard Worker #endif
288*58b9f456SAndroid Build Coastguard Worker if (__cend_ != __cbeg_)
289*58b9f456SAndroid Build Coastguard Worker {
290*58b9f456SAndroid Build Coastguard Worker size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
291*58b9f456SAndroid Build Coastguard Worker __c_node* p = __cbeg_[hc];
292*58b9f456SAndroid Build Coastguard Worker if (p == nullptr)
293*58b9f456SAndroid Build Coastguard Worker return;
294*58b9f456SAndroid Build Coastguard Worker while (p->__c_ != __c)
295*58b9f456SAndroid Build Coastguard Worker {
296*58b9f456SAndroid Build Coastguard Worker p = p->__next_;
297*58b9f456SAndroid Build Coastguard Worker if (p == nullptr)
298*58b9f456SAndroid Build Coastguard Worker return;
299*58b9f456SAndroid Build Coastguard Worker }
300*58b9f456SAndroid Build Coastguard Worker while (p->end_ != p->beg_)
301*58b9f456SAndroid Build Coastguard Worker {
302*58b9f456SAndroid Build Coastguard Worker --p->end_;
303*58b9f456SAndroid Build Coastguard Worker (*p->end_)->__c_ = nullptr;
304*58b9f456SAndroid Build Coastguard Worker }
305*58b9f456SAndroid Build Coastguard Worker }
306*58b9f456SAndroid Build Coastguard Worker }
307*58b9f456SAndroid Build Coastguard Worker
308*58b9f456SAndroid Build Coastguard Worker __c_node*
__find_c_and_lock(void * __c) const309*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__find_c_and_lock(void* __c) const
310*58b9f456SAndroid Build Coastguard Worker {
311*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
312*58b9f456SAndroid Build Coastguard Worker mut().lock();
313*58b9f456SAndroid Build Coastguard Worker #endif
314*58b9f456SAndroid Build Coastguard Worker if (__cend_ == __cbeg_)
315*58b9f456SAndroid Build Coastguard Worker {
316*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
317*58b9f456SAndroid Build Coastguard Worker mut().unlock();
318*58b9f456SAndroid Build Coastguard Worker #endif
319*58b9f456SAndroid Build Coastguard Worker return nullptr;
320*58b9f456SAndroid Build Coastguard Worker }
321*58b9f456SAndroid Build Coastguard Worker size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
322*58b9f456SAndroid Build Coastguard Worker __c_node* p = __cbeg_[hc];
323*58b9f456SAndroid Build Coastguard Worker if (p == nullptr)
324*58b9f456SAndroid Build Coastguard Worker {
325*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
326*58b9f456SAndroid Build Coastguard Worker mut().unlock();
327*58b9f456SAndroid Build Coastguard Worker #endif
328*58b9f456SAndroid Build Coastguard Worker return nullptr;
329*58b9f456SAndroid Build Coastguard Worker }
330*58b9f456SAndroid Build Coastguard Worker while (p->__c_ != __c)
331*58b9f456SAndroid Build Coastguard Worker {
332*58b9f456SAndroid Build Coastguard Worker p = p->__next_;
333*58b9f456SAndroid Build Coastguard Worker if (p == nullptr)
334*58b9f456SAndroid Build Coastguard Worker {
335*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
336*58b9f456SAndroid Build Coastguard Worker mut().unlock();
337*58b9f456SAndroid Build Coastguard Worker #endif
338*58b9f456SAndroid Build Coastguard Worker return nullptr;
339*58b9f456SAndroid Build Coastguard Worker }
340*58b9f456SAndroid Build Coastguard Worker }
341*58b9f456SAndroid Build Coastguard Worker return p;
342*58b9f456SAndroid Build Coastguard Worker }
343*58b9f456SAndroid Build Coastguard Worker
344*58b9f456SAndroid Build Coastguard Worker __c_node*
__find_c(void * __c) const345*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__find_c(void* __c) const
346*58b9f456SAndroid Build Coastguard Worker {
347*58b9f456SAndroid Build Coastguard Worker size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
348*58b9f456SAndroid Build Coastguard Worker __c_node* p = __cbeg_[hc];
349*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c A");
350*58b9f456SAndroid Build Coastguard Worker while (p->__c_ != __c)
351*58b9f456SAndroid Build Coastguard Worker {
352*58b9f456SAndroid Build Coastguard Worker p = p->__next_;
353*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c B");
354*58b9f456SAndroid Build Coastguard Worker }
355*58b9f456SAndroid Build Coastguard Worker return p;
356*58b9f456SAndroid Build Coastguard Worker }
357*58b9f456SAndroid Build Coastguard Worker
358*58b9f456SAndroid Build Coastguard Worker void
unlock() const359*58b9f456SAndroid Build Coastguard Worker __libcpp_db::unlock() const
360*58b9f456SAndroid Build Coastguard Worker {
361*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
362*58b9f456SAndroid Build Coastguard Worker mut().unlock();
363*58b9f456SAndroid Build Coastguard Worker #endif
364*58b9f456SAndroid Build Coastguard Worker }
365*58b9f456SAndroid Build Coastguard Worker
366*58b9f456SAndroid Build Coastguard Worker void
__erase_c(void * __c)367*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__erase_c(void* __c)
368*58b9f456SAndroid Build Coastguard Worker {
369*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
370*58b9f456SAndroid Build Coastguard Worker WLock _(mut());
371*58b9f456SAndroid Build Coastguard Worker #endif
372*58b9f456SAndroid Build Coastguard Worker if (__cend_ != __cbeg_)
373*58b9f456SAndroid Build Coastguard Worker {
374*58b9f456SAndroid Build Coastguard Worker size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
375*58b9f456SAndroid Build Coastguard Worker __c_node* p = __cbeg_[hc];
376*58b9f456SAndroid Build Coastguard Worker if (p == nullptr)
377*58b9f456SAndroid Build Coastguard Worker return;
378*58b9f456SAndroid Build Coastguard Worker __c_node* q = nullptr;
379*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __erase_c A");
380*58b9f456SAndroid Build Coastguard Worker while (p->__c_ != __c)
381*58b9f456SAndroid Build Coastguard Worker {
382*58b9f456SAndroid Build Coastguard Worker q = p;
383*58b9f456SAndroid Build Coastguard Worker p = p->__next_;
384*58b9f456SAndroid Build Coastguard Worker if (p == nullptr)
385*58b9f456SAndroid Build Coastguard Worker return;
386*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __erase_c B");
387*58b9f456SAndroid Build Coastguard Worker }
388*58b9f456SAndroid Build Coastguard Worker if (q == nullptr)
389*58b9f456SAndroid Build Coastguard Worker __cbeg_[hc] = p->__next_;
390*58b9f456SAndroid Build Coastguard Worker else
391*58b9f456SAndroid Build Coastguard Worker q->__next_ = p->__next_;
392*58b9f456SAndroid Build Coastguard Worker while (p->end_ != p->beg_)
393*58b9f456SAndroid Build Coastguard Worker {
394*58b9f456SAndroid Build Coastguard Worker --p->end_;
395*58b9f456SAndroid Build Coastguard Worker (*p->end_)->__c_ = nullptr;
396*58b9f456SAndroid Build Coastguard Worker }
397*58b9f456SAndroid Build Coastguard Worker free(p->beg_);
398*58b9f456SAndroid Build Coastguard Worker free(p);
399*58b9f456SAndroid Build Coastguard Worker --__csz_;
400*58b9f456SAndroid Build Coastguard Worker }
401*58b9f456SAndroid Build Coastguard Worker }
402*58b9f456SAndroid Build Coastguard Worker
403*58b9f456SAndroid Build Coastguard Worker void
__iterator_copy(void * __i,const void * __i0)404*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__iterator_copy(void* __i, const void* __i0)
405*58b9f456SAndroid Build Coastguard Worker {
406*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
407*58b9f456SAndroid Build Coastguard Worker WLock _(mut());
408*58b9f456SAndroid Build Coastguard Worker #endif
409*58b9f456SAndroid Build Coastguard Worker __i_node* i = __find_iterator(__i);
410*58b9f456SAndroid Build Coastguard Worker __i_node* i0 = __find_iterator(__i0);
411*58b9f456SAndroid Build Coastguard Worker __c_node* c0 = i0 != nullptr ? i0->__c_ : nullptr;
412*58b9f456SAndroid Build Coastguard Worker if (i == nullptr && i0 != nullptr)
413*58b9f456SAndroid Build Coastguard Worker i = __insert_iterator(__i);
414*58b9f456SAndroid Build Coastguard Worker __c_node* c = i != nullptr ? i->__c_ : nullptr;
415*58b9f456SAndroid Build Coastguard Worker if (c != c0)
416*58b9f456SAndroid Build Coastguard Worker {
417*58b9f456SAndroid Build Coastguard Worker if (c != nullptr)
418*58b9f456SAndroid Build Coastguard Worker c->__remove(i);
419*58b9f456SAndroid Build Coastguard Worker if (i != nullptr)
420*58b9f456SAndroid Build Coastguard Worker {
421*58b9f456SAndroid Build Coastguard Worker i->__c_ = nullptr;
422*58b9f456SAndroid Build Coastguard Worker if (c0 != nullptr)
423*58b9f456SAndroid Build Coastguard Worker {
424*58b9f456SAndroid Build Coastguard Worker i->__c_ = c0;
425*58b9f456SAndroid Build Coastguard Worker i->__c_->__add(i);
426*58b9f456SAndroid Build Coastguard Worker }
427*58b9f456SAndroid Build Coastguard Worker }
428*58b9f456SAndroid Build Coastguard Worker }
429*58b9f456SAndroid Build Coastguard Worker }
430*58b9f456SAndroid Build Coastguard Worker
431*58b9f456SAndroid Build Coastguard Worker bool
__dereferenceable(const void * __i) const432*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__dereferenceable(const void* __i) const
433*58b9f456SAndroid Build Coastguard Worker {
434*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
435*58b9f456SAndroid Build Coastguard Worker RLock _(mut());
436*58b9f456SAndroid Build Coastguard Worker #endif
437*58b9f456SAndroid Build Coastguard Worker __i_node* i = __find_iterator(__i);
438*58b9f456SAndroid Build Coastguard Worker return i != nullptr && i->__c_ != nullptr && i->__c_->__dereferenceable(__i);
439*58b9f456SAndroid Build Coastguard Worker }
440*58b9f456SAndroid Build Coastguard Worker
441*58b9f456SAndroid Build Coastguard Worker bool
__decrementable(const void * __i) const442*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__decrementable(const void* __i) const
443*58b9f456SAndroid Build Coastguard Worker {
444*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
445*58b9f456SAndroid Build Coastguard Worker RLock _(mut());
446*58b9f456SAndroid Build Coastguard Worker #endif
447*58b9f456SAndroid Build Coastguard Worker __i_node* i = __find_iterator(__i);
448*58b9f456SAndroid Build Coastguard Worker return i != nullptr && i->__c_ != nullptr && i->__c_->__decrementable(__i);
449*58b9f456SAndroid Build Coastguard Worker }
450*58b9f456SAndroid Build Coastguard Worker
451*58b9f456SAndroid Build Coastguard Worker bool
__addable(const void * __i,ptrdiff_t __n) const452*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__addable(const void* __i, ptrdiff_t __n) const
453*58b9f456SAndroid Build Coastguard Worker {
454*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
455*58b9f456SAndroid Build Coastguard Worker RLock _(mut());
456*58b9f456SAndroid Build Coastguard Worker #endif
457*58b9f456SAndroid Build Coastguard Worker __i_node* i = __find_iterator(__i);
458*58b9f456SAndroid Build Coastguard Worker return i != nullptr && i->__c_ != nullptr && i->__c_->__addable(__i, __n);
459*58b9f456SAndroid Build Coastguard Worker }
460*58b9f456SAndroid Build Coastguard Worker
461*58b9f456SAndroid Build Coastguard Worker bool
__subscriptable(const void * __i,ptrdiff_t __n) const462*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__subscriptable(const void* __i, ptrdiff_t __n) const
463*58b9f456SAndroid Build Coastguard Worker {
464*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
465*58b9f456SAndroid Build Coastguard Worker RLock _(mut());
466*58b9f456SAndroid Build Coastguard Worker #endif
467*58b9f456SAndroid Build Coastguard Worker __i_node* i = __find_iterator(__i);
468*58b9f456SAndroid Build Coastguard Worker return i != nullptr && i->__c_ != nullptr && i->__c_->__subscriptable(__i, __n);
469*58b9f456SAndroid Build Coastguard Worker }
470*58b9f456SAndroid Build Coastguard Worker
471*58b9f456SAndroid Build Coastguard Worker bool
__less_than_comparable(const void * __i,const void * __j) const472*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__less_than_comparable(const void* __i, const void* __j) const
473*58b9f456SAndroid Build Coastguard Worker {
474*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
475*58b9f456SAndroid Build Coastguard Worker RLock _(mut());
476*58b9f456SAndroid Build Coastguard Worker #endif
477*58b9f456SAndroid Build Coastguard Worker __i_node* i = __find_iterator(__i);
478*58b9f456SAndroid Build Coastguard Worker __i_node* j = __find_iterator(__j);
479*58b9f456SAndroid Build Coastguard Worker __c_node* ci = i != nullptr ? i->__c_ : nullptr;
480*58b9f456SAndroid Build Coastguard Worker __c_node* cj = j != nullptr ? j->__c_ : nullptr;
481*58b9f456SAndroid Build Coastguard Worker return ci != nullptr && ci == cj;
482*58b9f456SAndroid Build Coastguard Worker }
483*58b9f456SAndroid Build Coastguard Worker
484*58b9f456SAndroid Build Coastguard Worker void
swap(void * c1,void * c2)485*58b9f456SAndroid Build Coastguard Worker __libcpp_db::swap(void* c1, void* c2)
486*58b9f456SAndroid Build Coastguard Worker {
487*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
488*58b9f456SAndroid Build Coastguard Worker WLock _(mut());
489*58b9f456SAndroid Build Coastguard Worker #endif
490*58b9f456SAndroid Build Coastguard Worker size_t hc = hash<void*>()(c1) % static_cast<size_t>(__cend_ - __cbeg_);
491*58b9f456SAndroid Build Coastguard Worker __c_node* p1 = __cbeg_[hc];
492*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(p1 != nullptr, "debug mode internal logic error swap A");
493*58b9f456SAndroid Build Coastguard Worker while (p1->__c_ != c1)
494*58b9f456SAndroid Build Coastguard Worker {
495*58b9f456SAndroid Build Coastguard Worker p1 = p1->__next_;
496*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(p1 != nullptr, "debug mode internal logic error swap B");
497*58b9f456SAndroid Build Coastguard Worker }
498*58b9f456SAndroid Build Coastguard Worker hc = hash<void*>()(c2) % static_cast<size_t>(__cend_ - __cbeg_);
499*58b9f456SAndroid Build Coastguard Worker __c_node* p2 = __cbeg_[hc];
500*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(p2 != nullptr, "debug mode internal logic error swap C");
501*58b9f456SAndroid Build Coastguard Worker while (p2->__c_ != c2)
502*58b9f456SAndroid Build Coastguard Worker {
503*58b9f456SAndroid Build Coastguard Worker p2 = p2->__next_;
504*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(p2 != nullptr, "debug mode internal logic error swap D");
505*58b9f456SAndroid Build Coastguard Worker }
506*58b9f456SAndroid Build Coastguard Worker std::swap(p1->beg_, p2->beg_);
507*58b9f456SAndroid Build Coastguard Worker std::swap(p1->end_, p2->end_);
508*58b9f456SAndroid Build Coastguard Worker std::swap(p1->cap_, p2->cap_);
509*58b9f456SAndroid Build Coastguard Worker for (__i_node** p = p1->beg_; p != p1->end_; ++p)
510*58b9f456SAndroid Build Coastguard Worker (*p)->__c_ = p1;
511*58b9f456SAndroid Build Coastguard Worker for (__i_node** p = p2->beg_; p != p2->end_; ++p)
512*58b9f456SAndroid Build Coastguard Worker (*p)->__c_ = p2;
513*58b9f456SAndroid Build Coastguard Worker }
514*58b9f456SAndroid Build Coastguard Worker
515*58b9f456SAndroid Build Coastguard Worker void
__insert_i(void * __i)516*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__insert_i(void* __i)
517*58b9f456SAndroid Build Coastguard Worker {
518*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_THREADS
519*58b9f456SAndroid Build Coastguard Worker WLock _(mut());
520*58b9f456SAndroid Build Coastguard Worker #endif
521*58b9f456SAndroid Build Coastguard Worker __insert_iterator(__i);
522*58b9f456SAndroid Build Coastguard Worker }
523*58b9f456SAndroid Build Coastguard Worker
524*58b9f456SAndroid Build Coastguard Worker void
__add(__i_node * i)525*58b9f456SAndroid Build Coastguard Worker __c_node::__add(__i_node* i)
526*58b9f456SAndroid Build Coastguard Worker {
527*58b9f456SAndroid Build Coastguard Worker if (end_ == cap_)
528*58b9f456SAndroid Build Coastguard Worker {
529*58b9f456SAndroid Build Coastguard Worker size_t nc = 2*static_cast<size_t>(cap_ - beg_);
530*58b9f456SAndroid Build Coastguard Worker if (nc == 0)
531*58b9f456SAndroid Build Coastguard Worker nc = 1;
532*58b9f456SAndroid Build Coastguard Worker __i_node** beg =
533*58b9f456SAndroid Build Coastguard Worker static_cast<__i_node**>(malloc(nc * sizeof(__i_node*)));
534*58b9f456SAndroid Build Coastguard Worker if (beg == nullptr)
535*58b9f456SAndroid Build Coastguard Worker __throw_bad_alloc();
536*58b9f456SAndroid Build Coastguard Worker
537*58b9f456SAndroid Build Coastguard Worker if (nc > 1)
538*58b9f456SAndroid Build Coastguard Worker memcpy(beg, beg_, nc/2*sizeof(__i_node*));
539*58b9f456SAndroid Build Coastguard Worker free(beg_);
540*58b9f456SAndroid Build Coastguard Worker beg_ = beg;
541*58b9f456SAndroid Build Coastguard Worker end_ = beg_ + nc/2;
542*58b9f456SAndroid Build Coastguard Worker cap_ = beg_ + nc;
543*58b9f456SAndroid Build Coastguard Worker }
544*58b9f456SAndroid Build Coastguard Worker *end_++ = i;
545*58b9f456SAndroid Build Coastguard Worker }
546*58b9f456SAndroid Build Coastguard Worker
547*58b9f456SAndroid Build Coastguard Worker // private api
548*58b9f456SAndroid Build Coastguard Worker
549*58b9f456SAndroid Build Coastguard Worker _LIBCPP_HIDDEN
550*58b9f456SAndroid Build Coastguard Worker __i_node*
__insert_iterator(void * __i)551*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__insert_iterator(void* __i)
552*58b9f456SAndroid Build Coastguard Worker {
553*58b9f456SAndroid Build Coastguard Worker if (__isz_ + 1 > static_cast<size_t>(__iend_ - __ibeg_))
554*58b9f456SAndroid Build Coastguard Worker {
555*58b9f456SAndroid Build Coastguard Worker size_t nc = __next_prime(2*static_cast<size_t>(__iend_ - __ibeg_) + 1);
556*58b9f456SAndroid Build Coastguard Worker __i_node** ibeg = static_cast<__i_node**>(calloc(nc, sizeof(void*)));
557*58b9f456SAndroid Build Coastguard Worker if (ibeg == nullptr)
558*58b9f456SAndroid Build Coastguard Worker __throw_bad_alloc();
559*58b9f456SAndroid Build Coastguard Worker
560*58b9f456SAndroid Build Coastguard Worker for (__i_node** p = __ibeg_; p != __iend_; ++p)
561*58b9f456SAndroid Build Coastguard Worker {
562*58b9f456SAndroid Build Coastguard Worker __i_node* q = *p;
563*58b9f456SAndroid Build Coastguard Worker while (q != nullptr)
564*58b9f456SAndroid Build Coastguard Worker {
565*58b9f456SAndroid Build Coastguard Worker size_t h = hash<void*>()(q->__i_) % nc;
566*58b9f456SAndroid Build Coastguard Worker __i_node* r = q->__next_;
567*58b9f456SAndroid Build Coastguard Worker q->__next_ = ibeg[h];
568*58b9f456SAndroid Build Coastguard Worker ibeg[h] = q;
569*58b9f456SAndroid Build Coastguard Worker q = r;
570*58b9f456SAndroid Build Coastguard Worker }
571*58b9f456SAndroid Build Coastguard Worker }
572*58b9f456SAndroid Build Coastguard Worker free(__ibeg_);
573*58b9f456SAndroid Build Coastguard Worker __ibeg_ = ibeg;
574*58b9f456SAndroid Build Coastguard Worker __iend_ = __ibeg_ + nc;
575*58b9f456SAndroid Build Coastguard Worker }
576*58b9f456SAndroid Build Coastguard Worker size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_);
577*58b9f456SAndroid Build Coastguard Worker __i_node* p = __ibeg_[hi];
578*58b9f456SAndroid Build Coastguard Worker __i_node* r = __ibeg_[hi] =
579*58b9f456SAndroid Build Coastguard Worker static_cast<__i_node*>(malloc(sizeof(__i_node)));
580*58b9f456SAndroid Build Coastguard Worker if (r == nullptr)
581*58b9f456SAndroid Build Coastguard Worker __throw_bad_alloc();
582*58b9f456SAndroid Build Coastguard Worker
583*58b9f456SAndroid Build Coastguard Worker ::new(r) __i_node(__i, p, nullptr);
584*58b9f456SAndroid Build Coastguard Worker ++__isz_;
585*58b9f456SAndroid Build Coastguard Worker return r;
586*58b9f456SAndroid Build Coastguard Worker }
587*58b9f456SAndroid Build Coastguard Worker
588*58b9f456SAndroid Build Coastguard Worker _LIBCPP_HIDDEN
589*58b9f456SAndroid Build Coastguard Worker __i_node*
__find_iterator(const void * __i) const590*58b9f456SAndroid Build Coastguard Worker __libcpp_db::__find_iterator(const void* __i) const
591*58b9f456SAndroid Build Coastguard Worker {
592*58b9f456SAndroid Build Coastguard Worker __i_node* r = nullptr;
593*58b9f456SAndroid Build Coastguard Worker if (__ibeg_ != __iend_)
594*58b9f456SAndroid Build Coastguard Worker {
595*58b9f456SAndroid Build Coastguard Worker size_t h = hash<const void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_);
596*58b9f456SAndroid Build Coastguard Worker for (__i_node* nd = __ibeg_[h]; nd != nullptr; nd = nd->__next_)
597*58b9f456SAndroid Build Coastguard Worker {
598*58b9f456SAndroid Build Coastguard Worker if (nd->__i_ == __i)
599*58b9f456SAndroid Build Coastguard Worker {
600*58b9f456SAndroid Build Coastguard Worker r = nd;
601*58b9f456SAndroid Build Coastguard Worker break;
602*58b9f456SAndroid Build Coastguard Worker }
603*58b9f456SAndroid Build Coastguard Worker }
604*58b9f456SAndroid Build Coastguard Worker }
605*58b9f456SAndroid Build Coastguard Worker return r;
606*58b9f456SAndroid Build Coastguard Worker }
607*58b9f456SAndroid Build Coastguard Worker
608*58b9f456SAndroid Build Coastguard Worker _LIBCPP_HIDDEN
609*58b9f456SAndroid Build Coastguard Worker void
__remove(__i_node * p)610*58b9f456SAndroid Build Coastguard Worker __c_node::__remove(__i_node* p)
611*58b9f456SAndroid Build Coastguard Worker {
612*58b9f456SAndroid Build Coastguard Worker __i_node** r = find(beg_, end_, p);
613*58b9f456SAndroid Build Coastguard Worker _LIBCPP_ASSERT(r != end_, "debug mode internal logic error __c_node::__remove");
614*58b9f456SAndroid Build Coastguard Worker if (--end_ != r)
615*58b9f456SAndroid Build Coastguard Worker memmove(r, r+1, static_cast<size_t>(end_ - r)*sizeof(__i_node*));
616*58b9f456SAndroid Build Coastguard Worker }
617*58b9f456SAndroid Build Coastguard Worker
618*58b9f456SAndroid Build Coastguard Worker _LIBCPP_END_NAMESPACE_STD
619