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