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> 19*92bd7c03SHoward Hinnant# ifndef _LIBCPP_ASSERT 20f554add5SHoward Hinnant# define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (_VSTD::printf("%s\n", m), _VSTD::abort())) 21*92bd7c03SHoward Hinnant# endif 22f554add5SHoward Hinnant 23cec9af9eSHoward Hinnant#endif 24cec9af9eSHoward Hinnant 25cec9af9eSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 26cec9af9eSHoward Hinnant 27f554add5SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 28f554add5SHoward Hinnant 296e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS __c_node; 30f554add5SHoward Hinnant 316e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS __i_node 32f554add5SHoward Hinnant{ 33f554add5SHoward Hinnant void* __i_; 34f554add5SHoward Hinnant __i_node* __next_; 35f554add5SHoward Hinnant __c_node* __c_; 36f554add5SHoward Hinnant 37f554add5SHoward Hinnant __i_node(const __i_node&) = delete; 38f554add5SHoward Hinnant __i_node& operator=(const __i_node&) = delete; 39f554add5SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40f554add5SHoward Hinnant __i_node(void* __i, __i_node* __next, __c_node* __c) 41f554add5SHoward Hinnant : __i_(__i), __next_(__next), __c_(__c) {} 42f554add5SHoward Hinnant ~__i_node(); 43f554add5SHoward Hinnant}; 44f554add5SHoward Hinnant 456e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS __c_node 46f554add5SHoward Hinnant{ 47f554add5SHoward Hinnant void* __c_; 48f554add5SHoward Hinnant __c_node* __next_; 49f554add5SHoward Hinnant __i_node** beg_; 50f554add5SHoward Hinnant __i_node** end_; 51f554add5SHoward Hinnant __i_node** cap_; 52f554add5SHoward Hinnant 53f554add5SHoward Hinnant __c_node(const __c_node&) = delete; 54f554add5SHoward Hinnant __c_node& operator=(const __c_node&) = delete; 55f554add5SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 56f554add5SHoward Hinnant __c_node(void* __c, __c_node* __next) 57f554add5SHoward Hinnant : __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {} 58f554add5SHoward Hinnant virtual ~__c_node(); 59f554add5SHoward Hinnant 60f554add5SHoward Hinnant virtual bool __dereferenceable(const void*) const = 0; 61f554add5SHoward Hinnant virtual bool __decrementable(const void*) const = 0; 62f554add5SHoward Hinnant virtual bool __addable(const void*, ptrdiff_t) const = 0; 63f554add5SHoward Hinnant virtual bool __subscriptable(const void*, ptrdiff_t) const = 0; 64f554add5SHoward Hinnant 65920b56caSHoward Hinnant void __add(__i_node* __i); 66f554add5SHoward Hinnant _LIBCPP_HIDDEN void __remove(__i_node* __i); 67f554add5SHoward Hinnant}; 68f554add5SHoward Hinnant 69f554add5SHoward Hinnanttemplate <class _Cont> 70f554add5SHoward Hinnantstruct _C_node 71f554add5SHoward Hinnant : public __c_node 72f554add5SHoward Hinnant{ 73f554add5SHoward Hinnant _C_node(void* __c, __c_node* __n) 74f554add5SHoward Hinnant : __c_node(__c, __n) {} 75f554add5SHoward Hinnant 76f554add5SHoward Hinnant virtual bool __dereferenceable(const void*) const; 77f554add5SHoward Hinnant virtual bool __decrementable(const void*) const; 78f554add5SHoward Hinnant virtual bool __addable(const void*, ptrdiff_t) const; 79f554add5SHoward Hinnant virtual bool __subscriptable(const void*, ptrdiff_t) const; 80f554add5SHoward Hinnant}; 81f554add5SHoward Hinnant 82f554add5SHoward Hinnanttemplate <class _Cont> 83f554add5SHoward Hinnantbool 84f554add5SHoward Hinnant_C_node<_Cont>::__dereferenceable(const void* __i) const 85f554add5SHoward Hinnant{ 86f554add5SHoward Hinnant typedef typename _Cont::const_iterator iterator; 87f554add5SHoward Hinnant const iterator* __j = static_cast<const iterator*>(__i); 88c003db1fSHoward Hinnant _Cont* _Cp = static_cast<_Cont*>(__c_); 89c003db1fSHoward Hinnant return _Cp->__dereferenceable(__j); 90f554add5SHoward Hinnant} 91f554add5SHoward Hinnant 92f554add5SHoward Hinnanttemplate <class _Cont> 93f554add5SHoward Hinnantbool 94f554add5SHoward Hinnant_C_node<_Cont>::__decrementable(const void* __i) const 95f554add5SHoward Hinnant{ 96f554add5SHoward Hinnant typedef typename _Cont::const_iterator iterator; 97f554add5SHoward Hinnant const iterator* __j = static_cast<const iterator*>(__i); 98c003db1fSHoward Hinnant _Cont* _Cp = static_cast<_Cont*>(__c_); 99c003db1fSHoward Hinnant return _Cp->__decrementable(__j); 100f554add5SHoward Hinnant} 101f554add5SHoward Hinnant 102f554add5SHoward Hinnanttemplate <class _Cont> 103f554add5SHoward Hinnantbool 104f554add5SHoward Hinnant_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const 105f554add5SHoward Hinnant{ 106f554add5SHoward Hinnant typedef typename _Cont::const_iterator iterator; 107f554add5SHoward Hinnant const iterator* __j = static_cast<const iterator*>(__i); 108c003db1fSHoward Hinnant _Cont* _Cp = static_cast<_Cont*>(__c_); 109c003db1fSHoward Hinnant return _Cp->__addable(__j, __n); 110f554add5SHoward Hinnant} 111f554add5SHoward Hinnant 112f554add5SHoward Hinnanttemplate <class _Cont> 113f554add5SHoward Hinnantbool 114f554add5SHoward Hinnant_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const 115f554add5SHoward Hinnant{ 116f554add5SHoward Hinnant typedef typename _Cont::const_iterator iterator; 117f554add5SHoward Hinnant const iterator* __j = static_cast<const iterator*>(__i); 118c003db1fSHoward Hinnant _Cont* _Cp = static_cast<_Cont*>(__c_); 119c003db1fSHoward Hinnant return _Cp->__subscriptable(__j, __n); 120f554add5SHoward Hinnant} 121f554add5SHoward Hinnant 1226e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS __libcpp_db 123f554add5SHoward Hinnant{ 124f554add5SHoward Hinnant __c_node** __cbeg_; 125f554add5SHoward Hinnant __c_node** __cend_; 126f554add5SHoward Hinnant size_t __csz_; 127f554add5SHoward Hinnant __i_node** __ibeg_; 128f554add5SHoward Hinnant __i_node** __iend_; 129f554add5SHoward Hinnant size_t __isz_; 130f554add5SHoward Hinnant 131f554add5SHoward Hinnant __libcpp_db(); 132f554add5SHoward Hinnantpublic: 133f554add5SHoward Hinnant __libcpp_db(const __libcpp_db&) = delete; 134f554add5SHoward Hinnant __libcpp_db& operator=(const __libcpp_db&) = delete; 135f554add5SHoward Hinnant ~__libcpp_db(); 136f554add5SHoward Hinnant 137f554add5SHoward Hinnant class __db_c_iterator; 138f554add5SHoward Hinnant class __db_c_const_iterator; 139f554add5SHoward Hinnant class __db_i_iterator; 140f554add5SHoward Hinnant class __db_i_const_iterator; 141f554add5SHoward Hinnant 142f554add5SHoward Hinnant __db_c_const_iterator __c_end() const; 143f554add5SHoward Hinnant __db_i_const_iterator __i_end() const; 144f554add5SHoward Hinnant 145f554add5SHoward Hinnant template <class _Cont> 146f554add5SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 147f554add5SHoward Hinnant void __insert_c(_Cont* __c) 148f554add5SHoward Hinnant { 149f554add5SHoward Hinnant __c_node* __n = __insert_c(static_cast<void*>(__c)); 150f554add5SHoward Hinnant ::new(__n) _C_node<_Cont>(__n->__c_, __n->__next_); 151f554add5SHoward Hinnant } 152f554add5SHoward Hinnant 153c36bfc49SHoward Hinnant void __insert_i(void* __i); 154f554add5SHoward Hinnant __c_node* __insert_c(void* __c); 155f554add5SHoward Hinnant void __erase_c(void* __c); 156f554add5SHoward Hinnant 157f554add5SHoward Hinnant void __insert_ic(void* __i, const void* __c); 158f554add5SHoward Hinnant void __iterator_copy(void* __i, const void* __i0); 159f554add5SHoward Hinnant void __erase_i(void* __i); 160f554add5SHoward Hinnant 161f554add5SHoward Hinnant void* __find_c_from_i(void* __i) const; 162f554add5SHoward Hinnant void __invalidate_all(void* __c); 163f554add5SHoward Hinnant __c_node* __find_c_and_lock(void* __c) const; 164920b56caSHoward Hinnant __c_node* __find_c(void* __c) const; 165f554add5SHoward Hinnant void unlock() const; 166f554add5SHoward Hinnant 167f554add5SHoward Hinnant void swap(void* __c1, void* __c2); 168f554add5SHoward Hinnant 169f554add5SHoward Hinnant 170f554add5SHoward Hinnant bool __dereferenceable(const void* __i) const; 171f554add5SHoward Hinnant bool __decrementable(const void* __i) const; 172f554add5SHoward Hinnant bool __addable(const void* __i, ptrdiff_t __n) const; 173f554add5SHoward Hinnant bool __subscriptable(const void* __i, ptrdiff_t __n) const; 174f554add5SHoward Hinnant bool __comparable(const void* __i, const void* __j) const; 175f554add5SHoward Hinnantprivate: 176f554add5SHoward Hinnant _LIBCPP_HIDDEN 177f554add5SHoward Hinnant __i_node* __insert_iterator(void* __i); 178f554add5SHoward Hinnant _LIBCPP_HIDDEN 179f554add5SHoward Hinnant __i_node* __find_iterator(const void* __i) const; 180f554add5SHoward Hinnant 1816e41256fSHoward Hinnant friend _LIBCPP_FUNC_VIS __libcpp_db* __get_db(); 182f554add5SHoward Hinnant}; 183f554add5SHoward Hinnant 1846e41256fSHoward Hinnant_LIBCPP_FUNC_VIS __libcpp_db* __get_db(); 1856e41256fSHoward Hinnant_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db(); 186f554add5SHoward Hinnant 187f554add5SHoward Hinnant 188f554add5SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 189f554add5SHoward Hinnant 190cec9af9eSHoward Hinnant#endif 191cec9af9eSHoward Hinnant 192f554add5SHoward Hinnant#endif // _LIBCPP_DEBUG_H 193f554add5SHoward Hinnant 194