xref: /openbsd-src/gnu/llvm/libcxx/include/__debug (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
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