1f554add5SHoward Hinnant// -*- C++ -*-
2f554add5SHoward Hinnant//===--------------------------- __debug ----------------------------------===//
3f554add5SHoward Hinnant//
4f554add5SHoward Hinnant//                     The LLVM Compiler Infrastructure
5f554add5SHoward Hinnant//
6f554add5SHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7f554add5SHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
8f554add5SHoward Hinnant//
9f554add5SHoward Hinnant//===----------------------------------------------------------------------===//
10f554add5SHoward Hinnant
11f554add5SHoward Hinnant#ifndef _LIBCPP_DEBUG_H
12f554add5SHoward Hinnant#define _LIBCPP_DEBUG_H
13f554add5SHoward Hinnant
14cec9af9eSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 1
15cec9af9eSHoward Hinnant
16f554add5SHoward Hinnant#   include <cstdlib>
17f554add5SHoward Hinnant#   include <cstdio>
18f554add5SHoward Hinnant#   include <cstddef>
19f554add5SHoward Hinnant#   define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (_VSTD::printf("%s\n", m), _VSTD::abort()))
20f554add5SHoward Hinnant
21cec9af9eSHoward Hinnant#endif
22cec9af9eSHoward Hinnant
23cec9af9eSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
24cec9af9eSHoward Hinnant
25f554add5SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
26f554add5SHoward Hinnant
27f554add5SHoward Hinnantstruct _LIBCPP_VISIBLE __c_node;
28f554add5SHoward Hinnant
29f554add5SHoward Hinnantstruct _LIBCPP_VISIBLE __i_node
30f554add5SHoward Hinnant{
31f554add5SHoward Hinnant    void* __i_;
32f554add5SHoward Hinnant    __i_node* __next_;
33f554add5SHoward Hinnant    __c_node* __c_;
34f554add5SHoward Hinnant
35f554add5SHoward Hinnant    __i_node(const __i_node&) = delete;
36f554add5SHoward Hinnant    __i_node& operator=(const __i_node&) = delete;
37f554add5SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
38f554add5SHoward Hinnant    __i_node(void* __i, __i_node* __next, __c_node* __c)
39f554add5SHoward Hinnant        : __i_(__i), __next_(__next), __c_(__c) {}
40f554add5SHoward Hinnant    ~__i_node();
41f554add5SHoward Hinnant};
42f554add5SHoward Hinnant
43f554add5SHoward Hinnantstruct _LIBCPP_VISIBLE __c_node
44f554add5SHoward Hinnant{
45f554add5SHoward Hinnant    void* __c_;
46f554add5SHoward Hinnant    __c_node* __next_;
47f554add5SHoward Hinnant    __i_node** beg_;
48f554add5SHoward Hinnant    __i_node** end_;
49f554add5SHoward Hinnant    __i_node** cap_;
50f554add5SHoward Hinnant
51f554add5SHoward Hinnant    __c_node(const __c_node&) = delete;
52f554add5SHoward Hinnant    __c_node& operator=(const __c_node&) = delete;
53f554add5SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
54f554add5SHoward Hinnant    __c_node(void* __c, __c_node* __next)
55f554add5SHoward Hinnant        : __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {}
56f554add5SHoward Hinnant    virtual ~__c_node();
57f554add5SHoward Hinnant
58f554add5SHoward Hinnant    virtual bool __dereferenceable(const void*) const = 0;
59f554add5SHoward Hinnant    virtual bool __decrementable(const void*) const = 0;
60f554add5SHoward Hinnant    virtual bool __addable(const void*, ptrdiff_t) const = 0;
61f554add5SHoward Hinnant    virtual bool __subscriptable(const void*, ptrdiff_t) const = 0;
62f554add5SHoward Hinnant
63f554add5SHoward Hinnant    _LIBCPP_HIDDEN void __add(__i_node* __i);
64f554add5SHoward Hinnant    _LIBCPP_HIDDEN void __remove(__i_node* __i);
65f554add5SHoward Hinnant};
66f554add5SHoward Hinnant
67f554add5SHoward Hinnanttemplate <class _Cont>
68f554add5SHoward Hinnantstruct _C_node
69f554add5SHoward Hinnant    : public __c_node
70f554add5SHoward Hinnant{
71f554add5SHoward Hinnant    _C_node(void* __c, __c_node* __n)
72f554add5SHoward Hinnant        : __c_node(__c, __n) {}
73f554add5SHoward Hinnant
74f554add5SHoward Hinnant    virtual bool __dereferenceable(const void*) const;
75f554add5SHoward Hinnant    virtual bool __decrementable(const void*) const;
76f554add5SHoward Hinnant    virtual bool __addable(const void*, ptrdiff_t) const;
77f554add5SHoward Hinnant    virtual bool __subscriptable(const void*, ptrdiff_t) const;
78f554add5SHoward Hinnant};
79f554add5SHoward Hinnant
80f554add5SHoward Hinnanttemplate <class _Cont>
81f554add5SHoward Hinnantbool
82f554add5SHoward Hinnant_C_node<_Cont>::__dereferenceable(const void* __i) const
83f554add5SHoward Hinnant{
84f554add5SHoward Hinnant    typedef typename _Cont::const_iterator iterator;
85f554add5SHoward Hinnant    const iterator* __j = static_cast<const iterator*>(__i);
86f554add5SHoward Hinnant    _Cont* _C = static_cast<_Cont*>(__c_);
87f554add5SHoward Hinnant    return _C->__dereferenceable(__j);
88f554add5SHoward Hinnant}
89f554add5SHoward Hinnant
90f554add5SHoward Hinnanttemplate <class _Cont>
91f554add5SHoward Hinnantbool
92f554add5SHoward Hinnant_C_node<_Cont>::__decrementable(const void* __i) const
93f554add5SHoward Hinnant{
94f554add5SHoward Hinnant    typedef typename _Cont::const_iterator iterator;
95f554add5SHoward Hinnant    const iterator* __j = static_cast<const iterator*>(__i);
96f554add5SHoward Hinnant    _Cont* _C = static_cast<_Cont*>(__c_);
97f554add5SHoward Hinnant    return _C->__decrementable(__j);
98f554add5SHoward Hinnant}
99f554add5SHoward Hinnant
100f554add5SHoward Hinnanttemplate <class _Cont>
101f554add5SHoward Hinnantbool
102f554add5SHoward Hinnant_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const
103f554add5SHoward Hinnant{
104f554add5SHoward Hinnant    typedef typename _Cont::const_iterator iterator;
105f554add5SHoward Hinnant    const iterator* __j = static_cast<const iterator*>(__i);
106f554add5SHoward Hinnant    _Cont* _C = static_cast<_Cont*>(__c_);
107f554add5SHoward Hinnant    return _C->__addable(__j, __n);
108f554add5SHoward Hinnant}
109f554add5SHoward Hinnant
110f554add5SHoward Hinnanttemplate <class _Cont>
111f554add5SHoward Hinnantbool
112f554add5SHoward Hinnant_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const
113f554add5SHoward Hinnant{
114f554add5SHoward Hinnant    typedef typename _Cont::const_iterator iterator;
115f554add5SHoward Hinnant    const iterator* __j = static_cast<const iterator*>(__i);
116f554add5SHoward Hinnant    _Cont* _C = static_cast<_Cont*>(__c_);
117f554add5SHoward Hinnant    return _C->__subscriptable(__j, __n);
118f554add5SHoward Hinnant}
119f554add5SHoward Hinnant
120f554add5SHoward Hinnantclass _LIBCPP_VISIBLE __libcpp_db
121f554add5SHoward Hinnant{
122f554add5SHoward Hinnant    __c_node** __cbeg_;
123f554add5SHoward Hinnant    __c_node** __cend_;
124f554add5SHoward Hinnant    size_t   __csz_;
125f554add5SHoward Hinnant    __i_node** __ibeg_;
126f554add5SHoward Hinnant    __i_node** __iend_;
127f554add5SHoward Hinnant    size_t   __isz_;
128f554add5SHoward Hinnant
129f554add5SHoward Hinnant    __libcpp_db();
130f554add5SHoward Hinnantpublic:
131f554add5SHoward Hinnant    __libcpp_db(const __libcpp_db&) = delete;
132f554add5SHoward Hinnant    __libcpp_db& operator=(const __libcpp_db&) = delete;
133f554add5SHoward Hinnant    ~__libcpp_db();
134f554add5SHoward Hinnant
135f554add5SHoward Hinnant    class __db_c_iterator;
136f554add5SHoward Hinnant    class __db_c_const_iterator;
137f554add5SHoward Hinnant    class __db_i_iterator;
138f554add5SHoward Hinnant    class __db_i_const_iterator;
139f554add5SHoward Hinnant
140f554add5SHoward Hinnant    __db_c_const_iterator __c_end() const;
141f554add5SHoward Hinnant    __db_i_const_iterator __i_end() const;
142f554add5SHoward Hinnant
143f554add5SHoward Hinnant    template <class _Cont>
144f554add5SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
145f554add5SHoward Hinnant    void __insert_c(_Cont* __c)
146f554add5SHoward Hinnant    {
147f554add5SHoward Hinnant        __c_node* __n = __insert_c(static_cast<void*>(__c));
148f554add5SHoward Hinnant        ::new(__n) _C_node<_Cont>(__n->__c_, __n->__next_);
149f554add5SHoward Hinnant    }
150f554add5SHoward Hinnant
151*c36bfc49SHoward Hinnant    void __insert_i(void* __i);
152f554add5SHoward Hinnant    __c_node* __insert_c(void* __c);
153f554add5SHoward Hinnant    void __erase_c(void* __c);
154f554add5SHoward Hinnant
155f554add5SHoward Hinnant    void __insert_ic(void* __i, const void* __c);
156f554add5SHoward Hinnant    void __iterator_copy(void* __i, const void* __i0);
157f554add5SHoward Hinnant    void __erase_i(void* __i);
158f554add5SHoward Hinnant
159f554add5SHoward Hinnant    void* __find_c_from_i(void* __i) const;
160f554add5SHoward Hinnant    void __invalidate_all(void* __c);
161f554add5SHoward Hinnant    __c_node* __find_c_and_lock(void* __c) const;
162f554add5SHoward Hinnant    void unlock() const;
163f554add5SHoward Hinnant
164f554add5SHoward Hinnant    void swap(void* __c1, void* __c2);
165f554add5SHoward Hinnant
166f554add5SHoward Hinnant
167f554add5SHoward Hinnant    bool __dereferenceable(const void* __i) const;
168f554add5SHoward Hinnant    bool __decrementable(const void* __i) const;
169f554add5SHoward Hinnant    bool __addable(const void* __i, ptrdiff_t __n) const;
170f554add5SHoward Hinnant    bool __subscriptable(const void* __i, ptrdiff_t __n) const;
171f554add5SHoward Hinnant    bool __comparable(const void* __i, const void* __j) const;
172f554add5SHoward Hinnantprivate:
173f554add5SHoward Hinnant    _LIBCPP_HIDDEN
174f554add5SHoward Hinnant    __i_node* __insert_iterator(void* __i);
175f554add5SHoward Hinnant    _LIBCPP_HIDDEN
176f554add5SHoward Hinnant    __i_node* __find_iterator(const void* __i) const;
177f554add5SHoward Hinnant
178f554add5SHoward Hinnant    friend _LIBCPP_VISIBLE __libcpp_db* __get_db();
179f554add5SHoward Hinnant};
180f554add5SHoward Hinnant
181f554add5SHoward Hinnant_LIBCPP_VISIBLE __libcpp_db* __get_db();
182f554add5SHoward Hinnant_LIBCPP_VISIBLE const __libcpp_db* __get_const_db();
183f554add5SHoward Hinnant
184f554add5SHoward Hinnant
185f554add5SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
186f554add5SHoward Hinnant
187cec9af9eSHoward Hinnant#endif
188cec9af9eSHoward Hinnant
189f554add5SHoward Hinnant#endif  // _LIBCPP_DEBUG_H
190f554add5SHoward Hinnant
191