Warning, /include/c++/v1/__cxx03/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___CXX03_EXPERIMENTAL_MEMORY
0011 #define _LIBCPP___CXX03_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 #include <__cxx03/__functional/hash.h>
0053 #include <__cxx03/__functional/operations.h>
0054 #include <__cxx03/__type_traits/add_lvalue_reference.h>
0055 #include <__cxx03/__type_traits/add_pointer.h>
0056 #include <__cxx03/__type_traits/common_type.h>
0057 #include <__cxx03/__type_traits/enable_if.h>
0058 #include <__cxx03/__type_traits/is_convertible.h>
0059 #include <__cxx03/cstddef>
0060 #include <__cxx03/experimental/__config>
0061
0062 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0063 # pragma GCC system_header
0064 #endif
0065
0066 #ifdef _LIBCPP_ENABLE_EXPERIMENTAL
0067
0068 _LIBCPP_BEGIN_NAMESPACE_LFTS_V2
0069
0070 # if _LIBCPP_STD_VER >= 17
0071
0072 template <class _Wp>
0073 class observer_ptr {
0074 public:
0075 using element_type = _Wp;
0076
0077 // constructors
0078 _LIBCPP_HIDE_FROM_ABI constexpr observer_ptr() noexcept : __ptr_(nullptr) {}
0079 _LIBCPP_HIDE_FROM_ABI constexpr observer_ptr(nullptr_t) noexcept : __ptr_(nullptr) {}
0080 _LIBCPP_HIDE_FROM_ABI constexpr explicit observer_ptr(element_type* __p) noexcept : __ptr_(__p) {}
0081
0082 template <class _W2, __enable_if_t<is_convertible<_W2*, _Wp*>::value, int> = 0>
0083 _LIBCPP_HIDE_FROM_ABI constexpr observer_ptr(observer_ptr<_W2> __other) noexcept : __ptr_(__other.get()) {}
0084
0085 // observers
0086 _LIBCPP_HIDE_FROM_ABI constexpr element_type* get() const noexcept { return __ptr_; }
0087 _LIBCPP_HIDE_FROM_ABI constexpr add_lvalue_reference_t<_Wp> operator*() const { return *__ptr_; }
0088 _LIBCPP_HIDE_FROM_ABI constexpr element_type* operator->() const noexcept { return __ptr_; }
0089 _LIBCPP_HIDE_FROM_ABI constexpr explicit operator bool() const noexcept { return __ptr_ != nullptr; }
0090
0091 // conversions
0092 _LIBCPP_HIDE_FROM_ABI constexpr explicit operator element_type*() const noexcept { return __ptr_; }
0093
0094 // modifiers
0095 _LIBCPP_HIDE_FROM_ABI constexpr void reset(element_type* __p = nullptr) noexcept { __ptr_ = __p; }
0096 _LIBCPP_HIDE_FROM_ABI constexpr void swap(observer_ptr& __other) noexcept {
0097 observer_ptr __tmp = __other;
0098 __other = *this;
0099 *this = __tmp;
0100 }
0101 _LIBCPP_HIDE_FROM_ABI constexpr element_type* release() noexcept {
0102 observer_ptr __p;
0103 __p.swap(*this);
0104 return __p.get();
0105 }
0106
0107 private:
0108 element_type* __ptr_;
0109 };
0110
0111 // specializations
0112
0113 template <class _Wp>
0114 _LIBCPP_HIDE_FROM_ABI constexpr void swap(observer_ptr<_Wp>& __a, observer_ptr<_Wp>& __b) noexcept {
0115 __a.swap(__b);
0116 }
0117
0118 template <class _Wp>
0119 _LIBCPP_HIDE_FROM_ABI observer_ptr<_Wp> make_observer(_Wp* __ptr) noexcept {
0120 return observer_ptr<_Wp>{__ptr};
0121 }
0122
0123 template <class _W1, class _W2>
0124 _LIBCPP_HIDE_FROM_ABI bool operator==(observer_ptr<_W1> __a, observer_ptr<_W2> __b) {
0125 return __a.get() == __b.get();
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 == __b);
0131 }
0132
0133 template <class _Wp>
0134 _LIBCPP_HIDE_FROM_ABI bool operator==(observer_ptr<_Wp> __p, nullptr_t) {
0135 return !__p;
0136 }
0137
0138 template <class _Wp>
0139 _LIBCPP_HIDE_FROM_ABI bool operator==(nullptr_t, observer_ptr<_Wp> __p) {
0140 return !__p;
0141 }
0142
0143 template <class _Wp>
0144 _LIBCPP_HIDE_FROM_ABI bool operator!=(observer_ptr<_Wp> __p, nullptr_t) {
0145 return (bool)__p;
0146 }
0147
0148 template <class _Wp>
0149 _LIBCPP_HIDE_FROM_ABI bool operator!=(nullptr_t, observer_ptr<_Wp> __p) {
0150 return (bool)__p;
0151 }
0152
0153 template <class _W1, class _W2>
0154 _LIBCPP_HIDE_FROM_ABI bool operator<(observer_ptr<_W1> __a, observer_ptr<_W2> __b) {
0155 return std::less<typename std::common_type<_W1*, _W2*>::type>()(__a.get(), __b.get());
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 __b < __a;
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 !(__a > __b);
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 # endif // _LIBCPP_STD_VER >= 17
0174
0175 _LIBCPP_END_NAMESPACE_LFTS_V2
0176
0177 _LIBCPP_BEGIN_NAMESPACE_STD
0178
0179 // hash
0180
0181 # if _LIBCPP_STD_VER >= 17
0182 template <class _Tp>
0183 struct hash<experimental::observer_ptr<_Tp>> {
0184 _LIBCPP_HIDE_FROM_ABI size_t operator()(const experimental::observer_ptr<_Tp>& __ptr) const noexcept {
0185 return hash<_Tp*>()(__ptr.get());
0186 }
0187 };
0188 # endif // _LIBCPP_STD_VER >= 17
0189
0190 _LIBCPP_END_NAMESPACE_STD
0191
0192 #endif // _LIBCPP_ENABLE_EXPERIMENTAL
0193
0194 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
0195 # include <__cxx03/limits>
0196 #endif
0197
0198 #endif /* _LIBCPP___CXX03_EXPERIMENTAL_MEMORY */