Warning, /include/c++/v1/experimental/memory is written in an unsupported language. File is not indexed.
0001 // -*- C++ -*-
0002 //===----------------------------------------------------------------------===//
0003 //
0004 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0005 // See https://llvm.org/LICENSE.txt for license information.
0006 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0007 //
0008 //===----------------------------------------------------------------------===//
0009
0010 #ifndef _LIBCPP_EXPERIMENTAL_MEMORY
0011 #define _LIBCPP_EXPERIMENTAL_MEMORY
0012
0013 /*
0014 experimental/memory synopsis
0015
0016 namespace std::experimental::inline fundamentals_v2 {
0017
0018 template <class W> class observer_ptr {
0019 public:
0020 using element_type = W;
0021 using pointer = add_pointer_t<W>; // exposition-only
0022 using reference = add_lvalue_reference_t<W>; // exposition-only
0023
0024 // default ctor
0025 constexpr observer_ptr() noexcept;
0026
0027 // pointer-accepting ctors
0028 constexpr observer_ptr(nullptr_t) noexcept;
0029 constexpr explicit observer_ptr(pointer) noexcept;
0030
0031 // copying ctors (in addition to compiler-generated copy ctor)
0032 template <class W2> constexpr observer_ptr(observer_ptr<W2>) noexcept;
0033
0034 // observers
0035 constexpr pointer get() const noexcept;
0036 constexpr reference operator*() const;
0037 constexpr pointer operator->() const noexcept;
0038 constexpr explicit operator bool() const noexcept;
0039
0040 // conversions
0041 constexpr explicit operator pointer() const noexcept;
0042
0043 // modifiers
0044 constexpr pointer release() noexcept;
0045 constexpr void reset(pointer = nullptr) noexcept;
0046 constexpr void swap(observer_ptr&) noexcept;
0047 };
0048
0049 }
0050 */
0051
0052 #if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
0053 # include <__cxx03/experimental/memory>
0054 #else
0055 # include <__config>
0056 # include <__cstddef/nullptr_t.h>
0057 # include <__cstddef/size_t.h>
0058 # include <__functional/hash.h>
0059 # include <__functional/operations.h>
0060 # include <__type_traits/add_lvalue_reference.h>
0061 # include <__type_traits/add_pointer.h>
0062 # include <__type_traits/common_type.h>
0063 # include <__type_traits/enable_if.h>
0064 # include <__type_traits/is_convertible.h>
0065 # include <version>
0066
0067 # if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0068 # pragma GCC system_header
0069 # endif
0070
0071 # ifdef _LIBCPP_ENABLE_EXPERIMENTAL
0072
0073 _LIBCPP_BEGIN_NAMESPACE_LFTS_V2
0074
0075 # if _LIBCPP_STD_VER >= 17
0076
0077 template <class _Wp>
0078 class observer_ptr {
0079 public:
0080 using element_type = _Wp;
0081
0082 // constructors
0083 _LIBCPP_HIDE_FROM_ABI constexpr observer_ptr() noexcept : __ptr_(nullptr) {}
0084 _LIBCPP_HIDE_FROM_ABI constexpr observer_ptr(nullptr_t) noexcept : __ptr_(nullptr) {}
0085 _LIBCPP_HIDE_FROM_ABI constexpr explicit observer_ptr(element_type* __p) noexcept : __ptr_(__p) {}
0086
0087 template <class _W2, __enable_if_t<is_convertible<_W2*, _Wp*>::value, int> = 0>
0088 _LIBCPP_HIDE_FROM_ABI constexpr observer_ptr(observer_ptr<_W2> __other) noexcept : __ptr_(__other.get()) {}
0089
0090 // observers
0091 _LIBCPP_HIDE_FROM_ABI constexpr element_type* get() const noexcept { return __ptr_; }
0092 _LIBCPP_HIDE_FROM_ABI constexpr add_lvalue_reference_t<_Wp> operator*() const { return *__ptr_; }
0093 _LIBCPP_HIDE_FROM_ABI constexpr element_type* operator->() const noexcept { return __ptr_; }
0094 _LIBCPP_HIDE_FROM_ABI constexpr explicit operator bool() const noexcept { return __ptr_ != nullptr; }
0095
0096 // conversions
0097 _LIBCPP_HIDE_FROM_ABI constexpr explicit operator element_type*() const noexcept { return __ptr_; }
0098
0099 // modifiers
0100 _LIBCPP_HIDE_FROM_ABI constexpr void reset(element_type* __p = nullptr) noexcept { __ptr_ = __p; }
0101 _LIBCPP_HIDE_FROM_ABI constexpr void swap(observer_ptr& __other) noexcept {
0102 observer_ptr __tmp = __other;
0103 __other = *this;
0104 *this = __tmp;
0105 }
0106 _LIBCPP_HIDE_FROM_ABI constexpr element_type* release() noexcept {
0107 observer_ptr __p;
0108 __p.swap(*this);
0109 return __p.get();
0110 }
0111
0112 private:
0113 element_type* __ptr_;
0114 };
0115
0116 // specializations
0117
0118 template <class _Wp>
0119 _LIBCPP_HIDE_FROM_ABI constexpr void swap(observer_ptr<_Wp>& __a, observer_ptr<_Wp>& __b) noexcept {
0120 __a.swap(__b);
0121 }
0122
0123 template <class _Wp>
0124 _LIBCPP_HIDE_FROM_ABI observer_ptr<_Wp> make_observer(_Wp* __ptr) noexcept {
0125 return observer_ptr<_Wp>{__ptr};
0126 }
0127
0128 template <class _W1, class _W2>
0129 _LIBCPP_HIDE_FROM_ABI bool operator==(observer_ptr<_W1> __a, observer_ptr<_W2> __b) {
0130 return __a.get() == __b.get();
0131 }
0132
0133 template <class _W1, class _W2>
0134 _LIBCPP_HIDE_FROM_ABI bool operator!=(observer_ptr<_W1> __a, observer_ptr<_W2> __b) {
0135 return !(__a == __b);
0136 }
0137
0138 template <class _Wp>
0139 _LIBCPP_HIDE_FROM_ABI bool operator==(observer_ptr<_Wp> __p, nullptr_t) {
0140 return !__p;
0141 }
0142
0143 template <class _Wp>
0144 _LIBCPP_HIDE_FROM_ABI bool operator==(nullptr_t, observer_ptr<_Wp> __p) {
0145 return !__p;
0146 }
0147
0148 template <class _Wp>
0149 _LIBCPP_HIDE_FROM_ABI bool operator!=(observer_ptr<_Wp> __p, nullptr_t) {
0150 return (bool)__p;
0151 }
0152
0153 template <class _Wp>
0154 _LIBCPP_HIDE_FROM_ABI bool operator!=(nullptr_t, observer_ptr<_Wp> __p) {
0155 return (bool)__p;
0156 }
0157
0158 template <class _W1, class _W2>
0159 _LIBCPP_HIDE_FROM_ABI bool operator<(observer_ptr<_W1> __a, observer_ptr<_W2> __b) {
0160 return std::less<typename std::common_type<_W1*, _W2*>::type>()(__a.get(), __b.get());
0161 }
0162
0163 template <class _W1, class _W2>
0164 _LIBCPP_HIDE_FROM_ABI bool operator>(observer_ptr<_W1> __a, observer_ptr<_W2> __b) {
0165 return __b < __a;
0166 }
0167
0168 template <class _W1, class _W2>
0169 _LIBCPP_HIDE_FROM_ABI bool operator<=(observer_ptr<_W1> __a, observer_ptr<_W2> __b) {
0170 return !(__a > __b);
0171 }
0172
0173 template <class _W1, class _W2>
0174 _LIBCPP_HIDE_FROM_ABI bool operator>=(observer_ptr<_W1> __a, observer_ptr<_W2> __b) {
0175 return !(__a < __b);
0176 }
0177
0178 # endif // _LIBCPP_STD_VER >= 17
0179
0180 _LIBCPP_END_NAMESPACE_LFTS_V2
0181
0182 _LIBCPP_BEGIN_NAMESPACE_STD
0183
0184 // hash
0185
0186 # if _LIBCPP_STD_VER >= 17
0187 template <class _Tp>
0188 struct hash<experimental::observer_ptr<_Tp>> {
0189 _LIBCPP_HIDE_FROM_ABI size_t operator()(const experimental::observer_ptr<_Tp>& __ptr) const noexcept {
0190 return hash<_Tp*>()(__ptr.get());
0191 }
0192 };
0193 # endif // _LIBCPP_STD_VER >= 17
0194
0195 _LIBCPP_END_NAMESPACE_STD
0196
0197 # endif // _LIBCPP_ENABLE_EXPERIMENTAL
0198
0199 # if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
0200 # include <cstddef>
0201 # include <limits>
0202 # endif
0203 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
0204
0205 #endif /* _LIBCPP_EXPERIMENTAL_MEMORY */