146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 10*4bdff4beSrobert#ifndef _LIBCPP___DEBUG 11*4bdff4beSrobert#define _LIBCPP___DEBUG 1246035553Spatrick 13*4bdff4beSrobert#include <__assert> 1446035553Spatrick#include <__config> 15*4bdff4beSrobert#include <__type_traits/is_constant_evaluated.h> 16*4bdff4beSrobert#include <cstddef> 1746035553Spatrick 1846035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1946035553Spatrick# pragma GCC system_header 2046035553Spatrick#endif 2146035553Spatrick 22*4bdff4beSrobert#if defined(_LIBCPP_ENABLE_DEBUG_MODE) && !defined(_LIBCPP_CXX03_LANG) && !defined(_LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY) 23*4bdff4beSrobert# define _LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY 2446035553Spatrick#endif 2546035553Spatrick 26*4bdff4beSrobert#if defined(_LIBCPP_ENABLE_DEBUG_MODE) && !defined(_LIBCPP_DEBUG_ITERATOR_BOUNDS_CHECKING) 27*4bdff4beSrobert# define _LIBCPP_DEBUG_ITERATOR_BOUNDS_CHECKING 2846035553Spatrick#endif 2946035553Spatrick 30*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 31*4bdff4beSrobert# define _LIBCPP_DEBUG_ASSERT(x, m) _LIBCPP_ASSERT(::std::__libcpp_is_constant_evaluated() || (x), m) 3276d0caaeSpatrick#else 33*4bdff4beSrobert# define _LIBCPP_DEBUG_ASSERT(x, m) ((void)0) 3446035553Spatrick#endif 3576d0caaeSpatrick 36*4bdff4beSrobert#if defined(_LIBCPP_ENABLE_DEBUG_MODE) || defined(_LIBCPP_BUILDING_LIBRARY) 3746035553Spatrick 3846035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 3946035553Spatrick 4046035553Spatrickstruct _LIBCPP_TYPE_VIS __c_node; 4146035553Spatrick 4246035553Spatrickstruct _LIBCPP_TYPE_VIS __i_node 4346035553Spatrick{ 4446035553Spatrick void* __i_; 4546035553Spatrick __i_node* __next_; 4646035553Spatrick __c_node* __c_; 4746035553Spatrick 4846035553Spatrick __i_node(const __i_node&) = delete; 4946035553Spatrick __i_node& operator=(const __i_node&) = delete; 50*4bdff4beSrobert 5146035553Spatrick _LIBCPP_INLINE_VISIBILITY 5246035553Spatrick __i_node(void* __i, __i_node* __next, __c_node* __c) 5346035553Spatrick : __i_(__i), __next_(__next), __c_(__c) {} 5446035553Spatrick ~__i_node(); 5546035553Spatrick}; 5646035553Spatrick 5746035553Spatrickstruct _LIBCPP_TYPE_VIS __c_node 5846035553Spatrick{ 5946035553Spatrick void* __c_; 6046035553Spatrick __c_node* __next_; 6146035553Spatrick __i_node** beg_; 6246035553Spatrick __i_node** end_; 6346035553Spatrick __i_node** cap_; 6446035553Spatrick 6546035553Spatrick __c_node(const __c_node&) = delete; 6646035553Spatrick __c_node& operator=(const __c_node&) = delete; 67*4bdff4beSrobert 6846035553Spatrick _LIBCPP_INLINE_VISIBILITY 69*4bdff4beSrobert explicit __c_node(void* __c, __c_node* __next) 7046035553Spatrick : __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {} 7146035553Spatrick virtual ~__c_node(); 7246035553Spatrick 7346035553Spatrick virtual bool __dereferenceable(const void*) const = 0; 7446035553Spatrick virtual bool __decrementable(const void*) const = 0; 7546035553Spatrick virtual bool __addable(const void*, ptrdiff_t) const = 0; 7646035553Spatrick virtual bool __subscriptable(const void*, ptrdiff_t) const = 0; 7746035553Spatrick 7846035553Spatrick void __add(__i_node* __i); 7946035553Spatrick _LIBCPP_HIDDEN void __remove(__i_node* __i); 8046035553Spatrick}; 8146035553Spatrick 8246035553Spatricktemplate <class _Cont> 8346035553Spatrickstruct _C_node 8446035553Spatrick : public __c_node 8546035553Spatrick{ 86*4bdff4beSrobert explicit _C_node(void* __c, __c_node* __n) 8746035553Spatrick : __c_node(__c, __n) {} 8846035553Spatrick 89*4bdff4beSrobert bool __dereferenceable(const void*) const override; 90*4bdff4beSrobert bool __decrementable(const void*) const override; 91*4bdff4beSrobert bool __addable(const void*, ptrdiff_t) const override; 92*4bdff4beSrobert bool __subscriptable(const void*, ptrdiff_t) const override; 9346035553Spatrick}; 9446035553Spatrick 9546035553Spatricktemplate <class _Cont> 9646035553Spatrickinline bool 9746035553Spatrick_C_node<_Cont>::__dereferenceable(const void* __i) const 9846035553Spatrick{ 9946035553Spatrick typedef typename _Cont::const_iterator iterator; 10046035553Spatrick const iterator* __j = static_cast<const iterator*>(__i); 10146035553Spatrick _Cont* _Cp = static_cast<_Cont*>(__c_); 10246035553Spatrick return _Cp->__dereferenceable(__j); 10346035553Spatrick} 10446035553Spatrick 10546035553Spatricktemplate <class _Cont> 10646035553Spatrickinline bool 10746035553Spatrick_C_node<_Cont>::__decrementable(const void* __i) const 10846035553Spatrick{ 10946035553Spatrick typedef typename _Cont::const_iterator iterator; 11046035553Spatrick const iterator* __j = static_cast<const iterator*>(__i); 11146035553Spatrick _Cont* _Cp = static_cast<_Cont*>(__c_); 11246035553Spatrick return _Cp->__decrementable(__j); 11346035553Spatrick} 11446035553Spatrick 11546035553Spatricktemplate <class _Cont> 11646035553Spatrickinline bool 11746035553Spatrick_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const 11846035553Spatrick{ 11946035553Spatrick typedef typename _Cont::const_iterator iterator; 12046035553Spatrick const iterator* __j = static_cast<const iterator*>(__i); 12146035553Spatrick _Cont* _Cp = static_cast<_Cont*>(__c_); 12246035553Spatrick return _Cp->__addable(__j, __n); 12346035553Spatrick} 12446035553Spatrick 12546035553Spatricktemplate <class _Cont> 12646035553Spatrickinline bool 12746035553Spatrick_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const 12846035553Spatrick{ 12946035553Spatrick typedef typename _Cont::const_iterator iterator; 13046035553Spatrick const iterator* __j = static_cast<const iterator*>(__i); 13146035553Spatrick _Cont* _Cp = static_cast<_Cont*>(__c_); 13246035553Spatrick return _Cp->__subscriptable(__j, __n); 13346035553Spatrick} 13446035553Spatrick 13546035553Spatrickclass _LIBCPP_TYPE_VIS __libcpp_db 13646035553Spatrick{ 13746035553Spatrick __c_node** __cbeg_; 13846035553Spatrick __c_node** __cend_; 13946035553Spatrick size_t __csz_; 14046035553Spatrick __i_node** __ibeg_; 14146035553Spatrick __i_node** __iend_; 14246035553Spatrick size_t __isz_; 14346035553Spatrick 144*4bdff4beSrobert explicit __libcpp_db(); 14546035553Spatrickpublic: 14646035553Spatrick __libcpp_db(const __libcpp_db&) = delete; 14746035553Spatrick __libcpp_db& operator=(const __libcpp_db&) = delete; 148*4bdff4beSrobert 14946035553Spatrick ~__libcpp_db(); 15046035553Spatrick 15146035553Spatrick class __db_c_iterator; 15246035553Spatrick class __db_c_const_iterator; 15346035553Spatrick class __db_i_iterator; 15446035553Spatrick class __db_i_const_iterator; 15546035553Spatrick 15646035553Spatrick __db_c_const_iterator __c_end() const; 15746035553Spatrick __db_i_const_iterator __i_end() const; 15846035553Spatrick 15946035553Spatrick typedef __c_node*(_InsertConstruct)(void*, void*, __c_node*); 16046035553Spatrick 16146035553Spatrick template <class _Cont> 16246035553Spatrick _LIBCPP_INLINE_VISIBILITY static __c_node* __create_C_node(void *__mem, void *__c, __c_node *__next) { 16346035553Spatrick return ::new (__mem) _C_node<_Cont>(__c, __next); 16446035553Spatrick } 16546035553Spatrick 16646035553Spatrick template <class _Cont> 16746035553Spatrick _LIBCPP_INLINE_VISIBILITY 16846035553Spatrick void __insert_c(_Cont* __c) 16946035553Spatrick { 17046035553Spatrick __insert_c(static_cast<void*>(__c), &__create_C_node<_Cont>); 17146035553Spatrick } 17246035553Spatrick 17346035553Spatrick void __insert_i(void* __i); 17446035553Spatrick void __insert_c(void* __c, _InsertConstruct* __fn); 17546035553Spatrick void __erase_c(void* __c); 17646035553Spatrick 17746035553Spatrick void __insert_ic(void* __i, const void* __c); 17846035553Spatrick void __iterator_copy(void* __i, const void* __i0); 17946035553Spatrick void __erase_i(void* __i); 18046035553Spatrick 18146035553Spatrick void* __find_c_from_i(void* __i) const; 18246035553Spatrick void __invalidate_all(void* __c); 18346035553Spatrick __c_node* __find_c_and_lock(void* __c) const; 18446035553Spatrick __c_node* __find_c(void* __c) const; 18546035553Spatrick void unlock() const; 18646035553Spatrick 18746035553Spatrick void swap(void* __c1, void* __c2); 18846035553Spatrick 18946035553Spatrick 19046035553Spatrick bool __dereferenceable(const void* __i) const; 19146035553Spatrick bool __decrementable(const void* __i) const; 19246035553Spatrick bool __addable(const void* __i, ptrdiff_t __n) const; 19346035553Spatrick bool __subscriptable(const void* __i, ptrdiff_t __n) const; 19446035553Spatrick bool __less_than_comparable(const void* __i, const void* __j) const; 19546035553Spatrickprivate: 19646035553Spatrick _LIBCPP_HIDDEN 19746035553Spatrick __i_node* __insert_iterator(void* __i); 19846035553Spatrick _LIBCPP_HIDDEN 19946035553Spatrick __i_node* __find_iterator(const void* __i) const; 20046035553Spatrick 20146035553Spatrick friend _LIBCPP_FUNC_VIS __libcpp_db* __get_db(); 20246035553Spatrick}; 20346035553Spatrick 20446035553Spatrick_LIBCPP_FUNC_VIS __libcpp_db* __get_db(); 20546035553Spatrick_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db(); 20646035553Spatrick 207*4bdff4beSrobert_LIBCPP_END_NAMESPACE_STD 20846035553Spatrick 209*4bdff4beSrobert#endif // defined(_LIBCPP_ENABLE_DEBUG_MODE) || defined(_LIBCPP_BUILDING_LIBRARY) 210*4bdff4beSrobert 211*4bdff4beSrobert_LIBCPP_BEGIN_NAMESPACE_STD 212*4bdff4beSrobert 213*4bdff4beSroberttemplate <class _Tp> 214*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_insert_c(_Tp* __c) { 215*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 216*4bdff4beSrobert if (!__libcpp_is_constant_evaluated()) 217*4bdff4beSrobert __get_db()->__insert_c(__c); 218*4bdff4beSrobert#else 219*4bdff4beSrobert (void)(__c); 220*4bdff4beSrobert#endif 221*4bdff4beSrobert} 222*4bdff4beSrobert 223*4bdff4beSroberttemplate <class _Tp> 224*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_insert_i(_Tp* __i) { 225*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 226*4bdff4beSrobert if (!__libcpp_is_constant_evaluated()) 227*4bdff4beSrobert __get_db()->__insert_i(__i); 228*4bdff4beSrobert#else 229*4bdff4beSrobert (void)(__i); 230*4bdff4beSrobert#endif 231*4bdff4beSrobert} 232*4bdff4beSrobert 233*4bdff4beSroberttemplate <class _Tp> 234*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_erase_c(_Tp* __c) { 235*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 236*4bdff4beSrobert if (!__libcpp_is_constant_evaluated()) 237*4bdff4beSrobert __get_db()->__erase_c(__c); 238*4bdff4beSrobert#else 239*4bdff4beSrobert (void)(__c); 240*4bdff4beSrobert#endif 241*4bdff4beSrobert} 242*4bdff4beSrobert 243*4bdff4beSroberttemplate <class _Tp> 244*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_swap(_Tp* __lhs, _Tp* __rhs) { 245*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 246*4bdff4beSrobert if (!__libcpp_is_constant_evaluated()) 247*4bdff4beSrobert __get_db()->swap(__lhs, __rhs); 248*4bdff4beSrobert#else 249*4bdff4beSrobert (void)(__lhs); 250*4bdff4beSrobert (void)(__rhs); 251*4bdff4beSrobert#endif 252*4bdff4beSrobert} 253*4bdff4beSrobert 254*4bdff4beSroberttemplate <class _Tp> 255*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_invalidate_all(_Tp* __c) { 256*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 257*4bdff4beSrobert if (!__libcpp_is_constant_evaluated()) 258*4bdff4beSrobert __get_db()->__invalidate_all(__c); 259*4bdff4beSrobert#else 260*4bdff4beSrobert (void)(__c); 261*4bdff4beSrobert#endif 262*4bdff4beSrobert} 26346035553Spatrick 26446035553Spatrick_LIBCPP_END_NAMESPACE_STD 26546035553Spatrick 266*4bdff4beSrobert#endif // _LIBCPP___DEBUG 267