xref: /openbsd-src/gnu/llvm/libcxx/include/__memory/destruct_n.h (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
1*4bdff4beSrobert //===----------------------------------------------------------------------===//
2*4bdff4beSrobert //
3*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information.
5*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*4bdff4beSrobert //
7*4bdff4beSrobert //===----------------------------------------------------------------------===//
8*4bdff4beSrobert 
9*4bdff4beSrobert #ifndef _LIBCPP___MEMORY_DESTRUCT_N_H
10*4bdff4beSrobert #define _LIBCPP___MEMORY_DESTRUCT_N_H
11*4bdff4beSrobert 
12*4bdff4beSrobert #include <__config>
13*4bdff4beSrobert #include <__type_traits/integral_constant.h>
14*4bdff4beSrobert #include <__type_traits/is_trivially_destructible.h>
15*4bdff4beSrobert #include <cstddef>
16*4bdff4beSrobert 
17*4bdff4beSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
18*4bdff4beSrobert #  pragma GCC system_header
19*4bdff4beSrobert #endif
20*4bdff4beSrobert 
21*4bdff4beSrobert _LIBCPP_BEGIN_NAMESPACE_STD
22*4bdff4beSrobert 
23*4bdff4beSrobert struct __destruct_n
24*4bdff4beSrobert {
25*4bdff4beSrobert private:
26*4bdff4beSrobert     size_t __size_;
27*4bdff4beSrobert 
28*4bdff4beSrobert     template <class _Tp>
__process__destruct_n29*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT
30*4bdff4beSrobert         {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();}
31*4bdff4beSrobert 
32*4bdff4beSrobert     template <class _Tp>
__process__destruct_n33*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT
34*4bdff4beSrobert         {}
35*4bdff4beSrobert 
__incr__destruct_n36*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT
37*4bdff4beSrobert         {++__size_;}
__incr__destruct_n38*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT
39*4bdff4beSrobert         {}
40*4bdff4beSrobert 
__set__destruct_n41*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT
42*4bdff4beSrobert         {__size_ = __s;}
__set__destruct_n43*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT
44*4bdff4beSrobert         {}
45*4bdff4beSrobert public:
__destruct_n__destruct_n46*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT
47*4bdff4beSrobert         : __size_(__s) {}
48*4bdff4beSrobert 
49*4bdff4beSrobert     template <class _Tp>
__incr__destruct_n50*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY void __incr() _NOEXCEPT
51*4bdff4beSrobert         {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
52*4bdff4beSrobert 
53*4bdff4beSrobert     template <class _Tp>
__set__destruct_n54*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT
55*4bdff4beSrobert         {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
56*4bdff4beSrobert 
57*4bdff4beSrobert     template <class _Tp>
operator__destruct_n58*4bdff4beSrobert     _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT
59*4bdff4beSrobert         {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
60*4bdff4beSrobert };
61*4bdff4beSrobert 
62*4bdff4beSrobert _LIBCPP_END_NAMESPACE_STD
63*4bdff4beSrobert 
64*4bdff4beSrobert #endif // _LIBCPP___MEMORY_DESTRUCT_N_H
65