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