mbed-os5 only for TYBLE16
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
platform/cxxsupport/mstd_memory@1:9db0e321a9f4, 2019-12-31 (annotated)
- Committer:
- kenjiArai
- Date:
- Tue Dec 31 06:02:27 2019 +0000
- Revision:
- 1:9db0e321a9f4
updated based on mbed-os5.15.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 1:9db0e321a9f4 | 1 | /* mbed Microcontroller Library |
kenjiArai | 1:9db0e321a9f4 | 2 | * Copyright (c) 2019 ARM Limited |
kenjiArai | 1:9db0e321a9f4 | 3 | * SPDX-License-Identifier: Apache-2.0 |
kenjiArai | 1:9db0e321a9f4 | 4 | * |
kenjiArai | 1:9db0e321a9f4 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
kenjiArai | 1:9db0e321a9f4 | 6 | * you may not use this file except in compliance with the License. |
kenjiArai | 1:9db0e321a9f4 | 7 | * You may obtain a copy of the License at |
kenjiArai | 1:9db0e321a9f4 | 8 | * |
kenjiArai | 1:9db0e321a9f4 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
kenjiArai | 1:9db0e321a9f4 | 10 | * |
kenjiArai | 1:9db0e321a9f4 | 11 | * Unless required by applicable law or agreed to in writing, software |
kenjiArai | 1:9db0e321a9f4 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
kenjiArai | 1:9db0e321a9f4 | 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
kenjiArai | 1:9db0e321a9f4 | 14 | * See the License for the specific language governing permissions and |
kenjiArai | 1:9db0e321a9f4 | 15 | * limitations under the License. |
kenjiArai | 1:9db0e321a9f4 | 16 | */ |
kenjiArai | 1:9db0e321a9f4 | 17 | #ifndef MSTD_MEMORY_ |
kenjiArai | 1:9db0e321a9f4 | 18 | #define MSTD_MEMORY_ |
kenjiArai | 1:9db0e321a9f4 | 19 | |
kenjiArai | 1:9db0e321a9f4 | 20 | /* <mstd_memory> |
kenjiArai | 1:9db0e321a9f4 | 21 | * |
kenjiArai | 1:9db0e321a9f4 | 22 | * - includes toolchain's <memory> |
kenjiArai | 1:9db0e321a9f4 | 23 | * - For ARM C 5, C++11/14 features: |
kenjiArai | 1:9db0e321a9f4 | 24 | * - std::align |
kenjiArai | 1:9db0e321a9f4 | 25 | * - std::addressof |
kenjiArai | 1:9db0e321a9f4 | 26 | * - std::uninitialized_copy_n |
kenjiArai | 1:9db0e321a9f4 | 27 | * - std::unique_ptr, std::make_unique, std::default_delete |
kenjiArai | 1:9db0e321a9f4 | 28 | * - For all toolchains, C++17 backports: |
kenjiArai | 1:9db0e321a9f4 | 29 | * - mstd::uninitialized_default_construct, mstd::uninitialized_value_construct |
kenjiArai | 1:9db0e321a9f4 | 30 | * - mstd::uninitialized_move, mstd::uninitialized_move_n |
kenjiArai | 1:9db0e321a9f4 | 31 | * - mstd::destroy_at, mstd::destroy, mstd::destroy_n |
kenjiArai | 1:9db0e321a9f4 | 32 | */ |
kenjiArai | 1:9db0e321a9f4 | 33 | |
kenjiArai | 1:9db0e321a9f4 | 34 | #include <memory> |
kenjiArai | 1:9db0e321a9f4 | 35 | |
kenjiArai | 1:9db0e321a9f4 | 36 | #include <mstd_type_traits> |
kenjiArai | 1:9db0e321a9f4 | 37 | #include <mstd_utility> // std::pair |
kenjiArai | 1:9db0e321a9f4 | 38 | #include <mstd_iterator> // std::iterator_traits |
kenjiArai | 1:9db0e321a9f4 | 39 | |
kenjiArai | 1:9db0e321a9f4 | 40 | #ifdef __CC_ARM |
kenjiArai | 1:9db0e321a9f4 | 41 | |
kenjiArai | 1:9db0e321a9f4 | 42 | #include <cstddef> // size_t, ptrdiff_t |
kenjiArai | 1:9db0e321a9f4 | 43 | #include <_move.h> // exchange |
kenjiArai | 1:9db0e321a9f4 | 44 | |
kenjiArai | 1:9db0e321a9f4 | 45 | namespace std |
kenjiArai | 1:9db0e321a9f4 | 46 | { |
kenjiArai | 1:9db0e321a9f4 | 47 | // [ptr.align] |
kenjiArai | 1:9db0e321a9f4 | 48 | inline void *align(size_t alignment, size_t size, void *&ptr, size_t &space) noexcept |
kenjiArai | 1:9db0e321a9f4 | 49 | { |
kenjiArai | 1:9db0e321a9f4 | 50 | /* Behavior is undefined if alignment is not a power of 2 */ |
kenjiArai | 1:9db0e321a9f4 | 51 | uintptr_t addr = reinterpret_cast<uintptr_t>(ptr); |
kenjiArai | 1:9db0e321a9f4 | 52 | uintptr_t new_addr = (addr + (alignment - 1)) & ~(alignment - 1); |
kenjiArai | 1:9db0e321a9f4 | 53 | uintptr_t pad = new_addr - addr; |
kenjiArai | 1:9db0e321a9f4 | 54 | if (pad + size <= space) { |
kenjiArai | 1:9db0e321a9f4 | 55 | space -= pad; |
kenjiArai | 1:9db0e321a9f4 | 56 | ptr = reinterpret_cast<void *>(new_addr); |
kenjiArai | 1:9db0e321a9f4 | 57 | return ptr; |
kenjiArai | 1:9db0e321a9f4 | 58 | } else { |
kenjiArai | 1:9db0e321a9f4 | 59 | return nullptr; |
kenjiArai | 1:9db0e321a9f4 | 60 | } |
kenjiArai | 1:9db0e321a9f4 | 61 | } |
kenjiArai | 1:9db0e321a9f4 | 62 | |
kenjiArai | 1:9db0e321a9f4 | 63 | // [specialized.addressof] |
kenjiArai | 1:9db0e321a9f4 | 64 | template <typename T> |
kenjiArai | 1:9db0e321a9f4 | 65 | T *addressof(T &arg) noexcept |
kenjiArai | 1:9db0e321a9f4 | 66 | { |
kenjiArai | 1:9db0e321a9f4 | 67 | return reinterpret_cast<T *>(const_cast<char *>(&reinterpret_cast<const volatile char &>(arg))); |
kenjiArai | 1:9db0e321a9f4 | 68 | } |
kenjiArai | 1:9db0e321a9f4 | 69 | |
kenjiArai | 1:9db0e321a9f4 | 70 | // [uninitialized.copy] - ARMCC has pre-C++11 uninitialized_copy |
kenjiArai | 1:9db0e321a9f4 | 71 | template <class InputIterator, class Size, class ForwardIterator> |
kenjiArai | 1:9db0e321a9f4 | 72 | ForwardIterator uninitialized_copy_n(InputIterator first, Size n, ForwardIterator result) { |
kenjiArai | 1:9db0e321a9f4 | 73 | for ( ; n > 0; ++result, (void) ++first, --n) { |
kenjiArai | 1:9db0e321a9f4 | 74 | ::new (static_cast<void*>(addressof(*result))) |
kenjiArai | 1:9db0e321a9f4 | 75 | typename std::iterator_traits<ForwardIterator>::value_type(*first); |
kenjiArai | 1:9db0e321a9f4 | 76 | } |
kenjiArai | 1:9db0e321a9f4 | 77 | |
kenjiArai | 1:9db0e321a9f4 | 78 | return result; |
kenjiArai | 1:9db0e321a9f4 | 79 | } |
kenjiArai | 1:9db0e321a9f4 | 80 | |
kenjiArai | 1:9db0e321a9f4 | 81 | // [uninitialized.fill] - ARMCC has pre-C++11 uninitialized_fill and uninitialized_fill_n |
kenjiArai | 1:9db0e321a9f4 | 82 | |
kenjiArai | 1:9db0e321a9f4 | 83 | // [unique.ptr] |
kenjiArai | 1:9db0e321a9f4 | 84 | namespace impl |
kenjiArai | 1:9db0e321a9f4 | 85 | { |
kenjiArai | 1:9db0e321a9f4 | 86 | /* Base version - use T * */ |
kenjiArai | 1:9db0e321a9f4 | 87 | template <typename T, typename D, typename = void> |
kenjiArai | 1:9db0e321a9f4 | 88 | struct unique_ptr_type_helper { |
kenjiArai | 1:9db0e321a9f4 | 89 | typedef T *type; |
kenjiArai | 1:9db0e321a9f4 | 90 | }; |
kenjiArai | 1:9db0e321a9f4 | 91 | |
kenjiArai | 1:9db0e321a9f4 | 92 | /* if "remove_reference_t<D>::pointer" is a type, specialise to use it */ |
kenjiArai | 1:9db0e321a9f4 | 93 | template <typename T, typename D> |
kenjiArai | 1:9db0e321a9f4 | 94 | struct unique_ptr_type_helper<T, D, mstd::void_t<typename remove_reference_t<D>::pointer>> { |
kenjiArai | 1:9db0e321a9f4 | 95 | typedef typename remove_reference_t<D>::pointer type; |
kenjiArai | 1:9db0e321a9f4 | 96 | }; |
kenjiArai | 1:9db0e321a9f4 | 97 | |
kenjiArai | 1:9db0e321a9f4 | 98 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 99 | using unique_ptr_type_helper_t = typename unique_ptr_type_helper<T, D>::type; |
kenjiArai | 1:9db0e321a9f4 | 100 | |
kenjiArai | 1:9db0e321a9f4 | 101 | // Want to eliminate storage for the deleter - could just use it as a base |
kenjiArai | 1:9db0e321a9f4 | 102 | // class, for empty base optimisation, if we knew it was a class. But it could be |
kenjiArai | 1:9db0e321a9f4 | 103 | // a pointer or reference. Here's a version that uses deleter as base, |
kenjiArai | 1:9db0e321a9f4 | 104 | template<class D, typename = void> |
kenjiArai | 1:9db0e321a9f4 | 105 | class deleter_store : private D { |
kenjiArai | 1:9db0e321a9f4 | 106 | public: |
kenjiArai | 1:9db0e321a9f4 | 107 | constexpr deleter_store() noexcept = default; |
kenjiArai | 1:9db0e321a9f4 | 108 | template <typename _D> |
kenjiArai | 1:9db0e321a9f4 | 109 | constexpr deleter_store(_D &&d) noexcept : D(std::forward<_D>(d)) { } |
kenjiArai | 1:9db0e321a9f4 | 110 | |
kenjiArai | 1:9db0e321a9f4 | 111 | D &get_deleter() noexcept { return static_cast<D &>(*this); } |
kenjiArai | 1:9db0e321a9f4 | 112 | const D &get_deleter() const noexcept { return static_cast<const D &>(*this); } |
kenjiArai | 1:9db0e321a9f4 | 113 | }; |
kenjiArai | 1:9db0e321a9f4 | 114 | |
kenjiArai | 1:9db0e321a9f4 | 115 | //Here's a version that stores (for pointer/reference) |
kenjiArai | 1:9db0e321a9f4 | 116 | template<class D> |
kenjiArai | 1:9db0e321a9f4 | 117 | class deleter_store<D, enable_if_t<!is_class<D>::value>> { |
kenjiArai | 1:9db0e321a9f4 | 118 | D d; |
kenjiArai | 1:9db0e321a9f4 | 119 | public: |
kenjiArai | 1:9db0e321a9f4 | 120 | constexpr deleter_store() noexcept : d() { } |
kenjiArai | 1:9db0e321a9f4 | 121 | template <typename _D> |
kenjiArai | 1:9db0e321a9f4 | 122 | constexpr deleter_store(_D &&d) noexcept : d(std::forward<_D>(d)) { } |
kenjiArai | 1:9db0e321a9f4 | 123 | |
kenjiArai | 1:9db0e321a9f4 | 124 | D &get_deleter() noexcept { return d; } |
kenjiArai | 1:9db0e321a9f4 | 125 | const D &get_deleter() const noexcept { return d; } |
kenjiArai | 1:9db0e321a9f4 | 126 | }; |
kenjiArai | 1:9db0e321a9f4 | 127 | } |
kenjiArai | 1:9db0e321a9f4 | 128 | |
kenjiArai | 1:9db0e321a9f4 | 129 | // [unique.ptr.dltr.dflt] |
kenjiArai | 1:9db0e321a9f4 | 130 | template<class T> |
kenjiArai | 1:9db0e321a9f4 | 131 | struct default_delete { |
kenjiArai | 1:9db0e321a9f4 | 132 | constexpr default_delete() noexcept = default; |
kenjiArai | 1:9db0e321a9f4 | 133 | |
kenjiArai | 1:9db0e321a9f4 | 134 | template <class U, class = enable_if_t<is_convertible<U *, T *>::value>> |
kenjiArai | 1:9db0e321a9f4 | 135 | default_delete(const default_delete<U> &d) noexcept { } |
kenjiArai | 1:9db0e321a9f4 | 136 | |
kenjiArai | 1:9db0e321a9f4 | 137 | void operator()(T *ptr) const |
kenjiArai | 1:9db0e321a9f4 | 138 | { |
kenjiArai | 1:9db0e321a9f4 | 139 | // Program is ill-formed if T is incomplete - generate diagnostic by breaking compilation |
kenjiArai | 1:9db0e321a9f4 | 140 | // (Behaviour of raw delete of incomplete class is undefined if complete class is non-trivial, else permitted) |
kenjiArai | 1:9db0e321a9f4 | 141 | static_assert(sizeof(T) == sizeof(T), "Cannot delete incomplete type"); |
kenjiArai | 1:9db0e321a9f4 | 142 | delete ptr; |
kenjiArai | 1:9db0e321a9f4 | 143 | } |
kenjiArai | 1:9db0e321a9f4 | 144 | }; |
kenjiArai | 1:9db0e321a9f4 | 145 | |
kenjiArai | 1:9db0e321a9f4 | 146 | // [unique.ptr.dltr.dflt1] |
kenjiArai | 1:9db0e321a9f4 | 147 | template<class T> |
kenjiArai | 1:9db0e321a9f4 | 148 | struct default_delete<T[]> { |
kenjiArai | 1:9db0e321a9f4 | 149 | constexpr default_delete() noexcept = default; |
kenjiArai | 1:9db0e321a9f4 | 150 | |
kenjiArai | 1:9db0e321a9f4 | 151 | template <class U, class = enable_if_t<is_convertible<U (*)[], T (*)[]>::value>> |
kenjiArai | 1:9db0e321a9f4 | 152 | default_delete(const default_delete<U> &d) noexcept { } |
kenjiArai | 1:9db0e321a9f4 | 153 | |
kenjiArai | 1:9db0e321a9f4 | 154 | template <class U, class = enable_if_t<is_convertible<U (*)[], T (*)[]>::value>> |
kenjiArai | 1:9db0e321a9f4 | 155 | void operator()(U *ptr) const |
kenjiArai | 1:9db0e321a9f4 | 156 | { |
kenjiArai | 1:9db0e321a9f4 | 157 | delete[] ptr; |
kenjiArai | 1:9db0e321a9f4 | 158 | } |
kenjiArai | 1:9db0e321a9f4 | 159 | }; |
kenjiArai | 1:9db0e321a9f4 | 160 | |
kenjiArai | 1:9db0e321a9f4 | 161 | // [unique.ptr.single] |
kenjiArai | 1:9db0e321a9f4 | 162 | template< |
kenjiArai | 1:9db0e321a9f4 | 163 | class T, |
kenjiArai | 1:9db0e321a9f4 | 164 | class D = default_delete<T> |
kenjiArai | 1:9db0e321a9f4 | 165 | > class unique_ptr : public impl::deleter_store<D> |
kenjiArai | 1:9db0e321a9f4 | 166 | { |
kenjiArai | 1:9db0e321a9f4 | 167 | template <class U, class E> |
kenjiArai | 1:9db0e321a9f4 | 168 | static constexpr bool is_compatible_unique_ptr() |
kenjiArai | 1:9db0e321a9f4 | 169 | { |
kenjiArai | 1:9db0e321a9f4 | 170 | return is_convertible<typename unique_ptr<U,E>::pointer, pointer>::value && |
kenjiArai | 1:9db0e321a9f4 | 171 | !is_array<U>::value; |
kenjiArai | 1:9db0e321a9f4 | 172 | } |
kenjiArai | 1:9db0e321a9f4 | 173 | public: |
kenjiArai | 1:9db0e321a9f4 | 174 | typedef impl::unique_ptr_type_helper_t<T, D> pointer; |
kenjiArai | 1:9db0e321a9f4 | 175 | typedef T element_type; |
kenjiArai | 1:9db0e321a9f4 | 176 | typedef D deleter_type; |
kenjiArai | 1:9db0e321a9f4 | 177 | // [unique.ptr.single.ctor] |
kenjiArai | 1:9db0e321a9f4 | 178 | template <class _D = D, typename = enable_if_t<!is_pointer<_D>::value && is_default_constructible<_D>::value>> |
kenjiArai | 1:9db0e321a9f4 | 179 | constexpr unique_ptr() noexcept : impl::deleter_store<D>(), ptr_() { } |
kenjiArai | 1:9db0e321a9f4 | 180 | template <class _D = D, typename = enable_if_t<!is_pointer<_D>::value && is_default_constructible<_D>::value>> |
kenjiArai | 1:9db0e321a9f4 | 181 | constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { } |
kenjiArai | 1:9db0e321a9f4 | 182 | template <class _D = D, typename = enable_if_t<!is_pointer<_D>::value && is_default_constructible<_D>::value>> |
kenjiArai | 1:9db0e321a9f4 | 183 | explicit unique_ptr(pointer ptr) noexcept : impl::deleter_store<D>(), ptr_(ptr) { } |
kenjiArai | 1:9db0e321a9f4 | 184 | template <class _D = D, typename = enable_if_t<is_copy_constructible<_D>::value>> |
kenjiArai | 1:9db0e321a9f4 | 185 | unique_ptr(pointer ptr, const D &d) noexcept : impl::deleter_store<D>(d), ptr_(ptr) { } |
kenjiArai | 1:9db0e321a9f4 | 186 | template <class _D = D, typename = enable_if_t<is_move_constructible<_D>::value>> |
kenjiArai | 1:9db0e321a9f4 | 187 | unique_ptr(pointer ptr, enable_if_t<!is_lvalue_reference<_D>::value, _D &&> d) noexcept : impl::deleter_store<D>(move(d)), ptr_(ptr) { } |
kenjiArai | 1:9db0e321a9f4 | 188 | template <class _D = D, typename _A = remove_reference_t<_D>> |
kenjiArai | 1:9db0e321a9f4 | 189 | unique_ptr(pointer ptr, enable_if_t<is_lvalue_reference<_D>::value, _A &&> d) = delete; |
kenjiArai | 1:9db0e321a9f4 | 190 | unique_ptr(const unique_ptr &) = delete; |
kenjiArai | 1:9db0e321a9f4 | 191 | unique_ptr(unique_ptr &&u) noexcept : impl::deleter_store<D>(forward<D>(u.get_deleter())), ptr_(u.ptr_) { u.ptr_ = nullptr; } |
kenjiArai | 1:9db0e321a9f4 | 192 | template <class U, class E, class = enable_if_t< |
kenjiArai | 1:9db0e321a9f4 | 193 | is_compatible_unique_ptr<U, E>() && |
kenjiArai | 1:9db0e321a9f4 | 194 | (is_reference<D>::value ? is_same<E, D>::value : is_convertible<E,D>::value)>> |
kenjiArai | 1:9db0e321a9f4 | 195 | unique_ptr(unique_ptr<U, E>&& u) noexcept : impl::deleter_store<D>(std::forward<E>(u.get_deleter())), ptr_(u.release()) { } |
kenjiArai | 1:9db0e321a9f4 | 196 | |
kenjiArai | 1:9db0e321a9f4 | 197 | // [unique.ptr.single.dtor] |
kenjiArai | 1:9db0e321a9f4 | 198 | ~unique_ptr() |
kenjiArai | 1:9db0e321a9f4 | 199 | { |
kenjiArai | 1:9db0e321a9f4 | 200 | if (ptr_) { |
kenjiArai | 1:9db0e321a9f4 | 201 | this->get_deleter()(ptr_); |
kenjiArai | 1:9db0e321a9f4 | 202 | } |
kenjiArai | 1:9db0e321a9f4 | 203 | } |
kenjiArai | 1:9db0e321a9f4 | 204 | |
kenjiArai | 1:9db0e321a9f4 | 205 | // [unique.ptr.single.modifiers] |
kenjiArai | 1:9db0e321a9f4 | 206 | pointer release() noexcept |
kenjiArai | 1:9db0e321a9f4 | 207 | { |
kenjiArai | 1:9db0e321a9f4 | 208 | return std::exchange(ptr_, nullptr); |
kenjiArai | 1:9db0e321a9f4 | 209 | } |
kenjiArai | 1:9db0e321a9f4 | 210 | |
kenjiArai | 1:9db0e321a9f4 | 211 | void reset(pointer ptr = pointer()) noexcept |
kenjiArai | 1:9db0e321a9f4 | 212 | { |
kenjiArai | 1:9db0e321a9f4 | 213 | pointer old = std::exchange(ptr_, ptr); |
kenjiArai | 1:9db0e321a9f4 | 214 | if (old) { |
kenjiArai | 1:9db0e321a9f4 | 215 | this->get_deleter()(old); |
kenjiArai | 1:9db0e321a9f4 | 216 | } |
kenjiArai | 1:9db0e321a9f4 | 217 | } |
kenjiArai | 1:9db0e321a9f4 | 218 | |
kenjiArai | 1:9db0e321a9f4 | 219 | void swap(unique_ptr &other) noexcept |
kenjiArai | 1:9db0e321a9f4 | 220 | { |
kenjiArai | 1:9db0e321a9f4 | 221 | using std::swap; |
kenjiArai | 1:9db0e321a9f4 | 222 | swap(this->get_deleter(), other.get_deleter()); |
kenjiArai | 1:9db0e321a9f4 | 223 | swap(ptr_, other.ptr_); |
kenjiArai | 1:9db0e321a9f4 | 224 | } |
kenjiArai | 1:9db0e321a9f4 | 225 | |
kenjiArai | 1:9db0e321a9f4 | 226 | // [unique.ptr.single.asgn] |
kenjiArai | 1:9db0e321a9f4 | 227 | unique_ptr &operator=(const unique_ptr &r) = delete; |
kenjiArai | 1:9db0e321a9f4 | 228 | unique_ptr &operator=(unique_ptr &&r) noexcept |
kenjiArai | 1:9db0e321a9f4 | 229 | { |
kenjiArai | 1:9db0e321a9f4 | 230 | reset(r.release()); |
kenjiArai | 1:9db0e321a9f4 | 231 | this->get_deleter() = std::forward<D>(r.get_deleter()); |
kenjiArai | 1:9db0e321a9f4 | 232 | return *this; |
kenjiArai | 1:9db0e321a9f4 | 233 | } |
kenjiArai | 1:9db0e321a9f4 | 234 | unique_ptr &operator=(nullptr_t) noexcept |
kenjiArai | 1:9db0e321a9f4 | 235 | { |
kenjiArai | 1:9db0e321a9f4 | 236 | reset(); |
kenjiArai | 1:9db0e321a9f4 | 237 | return *this; |
kenjiArai | 1:9db0e321a9f4 | 238 | } |
kenjiArai | 1:9db0e321a9f4 | 239 | |
kenjiArai | 1:9db0e321a9f4 | 240 | template <class U, class E> |
kenjiArai | 1:9db0e321a9f4 | 241 | enable_if_t<is_compatible_unique_ptr<U, E>() && |
kenjiArai | 1:9db0e321a9f4 | 242 | is_assignable<D &, E &&>::value, |
kenjiArai | 1:9db0e321a9f4 | 243 | unique_ptr> &operator=(unique_ptr<U, E> &&u) noexcept |
kenjiArai | 1:9db0e321a9f4 | 244 | { |
kenjiArai | 1:9db0e321a9f4 | 245 | reset(u.release()); |
kenjiArai | 1:9db0e321a9f4 | 246 | this->get_deleter() = std::forward<E>(u.get_deleter()); |
kenjiArai | 1:9db0e321a9f4 | 247 | return *this; |
kenjiArai | 1:9db0e321a9f4 | 248 | } |
kenjiArai | 1:9db0e321a9f4 | 249 | |
kenjiArai | 1:9db0e321a9f4 | 250 | // [unique.ptr.single.observers] |
kenjiArai | 1:9db0e321a9f4 | 251 | pointer get() const noexcept { return ptr_; } |
kenjiArai | 1:9db0e321a9f4 | 252 | pointer operator->() const noexcept { return ptr_; } |
kenjiArai | 1:9db0e321a9f4 | 253 | add_lvalue_reference_t<T> operator*() const noexcept { return *ptr_; } |
kenjiArai | 1:9db0e321a9f4 | 254 | explicit operator bool() const noexcept { return ptr_; } |
kenjiArai | 1:9db0e321a9f4 | 255 | private: |
kenjiArai | 1:9db0e321a9f4 | 256 | pointer ptr_; |
kenjiArai | 1:9db0e321a9f4 | 257 | }; |
kenjiArai | 1:9db0e321a9f4 | 258 | |
kenjiArai | 1:9db0e321a9f4 | 259 | // [unique.ptr.runtime] |
kenjiArai | 1:9db0e321a9f4 | 260 | template<class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 261 | class unique_ptr<T[], D> : public impl::deleter_store<D> |
kenjiArai | 1:9db0e321a9f4 | 262 | { |
kenjiArai | 1:9db0e321a9f4 | 263 | template <class U> |
kenjiArai | 1:9db0e321a9f4 | 264 | static constexpr bool is_compatible_pointer() |
kenjiArai | 1:9db0e321a9f4 | 265 | { |
kenjiArai | 1:9db0e321a9f4 | 266 | return is_same<U, pointer>::value || |
kenjiArai | 1:9db0e321a9f4 | 267 | is_same<U, nullptr_t>::value || |
kenjiArai | 1:9db0e321a9f4 | 268 | (is_same<pointer, element_type *>::value && is_pointer<U>::value && |
kenjiArai | 1:9db0e321a9f4 | 269 | is_convertible<remove_pointer_t<U> (*)[], element_type (*)[]>::value); |
kenjiArai | 1:9db0e321a9f4 | 270 | } |
kenjiArai | 1:9db0e321a9f4 | 271 | |
kenjiArai | 1:9db0e321a9f4 | 272 | template <class U, class E, class UP = unique_ptr<U,E>> |
kenjiArai | 1:9db0e321a9f4 | 273 | static constexpr bool is_compatible_unique_ptr() |
kenjiArai | 1:9db0e321a9f4 | 274 | { |
kenjiArai | 1:9db0e321a9f4 | 275 | return is_array<U>::value && |
kenjiArai | 1:9db0e321a9f4 | 276 | is_same<pointer, element_type *>::value && |
kenjiArai | 1:9db0e321a9f4 | 277 | is_same<typename UP::pointer, typename UP::element_type *>::value && |
kenjiArai | 1:9db0e321a9f4 | 278 | is_convertible<typename UP::element_type(*)[], element_type(*)[]>::value; |
kenjiArai | 1:9db0e321a9f4 | 279 | } |
kenjiArai | 1:9db0e321a9f4 | 280 | public: |
kenjiArai | 1:9db0e321a9f4 | 281 | typedef impl::unique_ptr_type_helper_t<T, D> pointer; |
kenjiArai | 1:9db0e321a9f4 | 282 | typedef T element_type; |
kenjiArai | 1:9db0e321a9f4 | 283 | typedef D deleter_type; |
kenjiArai | 1:9db0e321a9f4 | 284 | |
kenjiArai | 1:9db0e321a9f4 | 285 | // [unique.ptr.runtime.ctor] / [unique.ptr.single.ctor] |
kenjiArai | 1:9db0e321a9f4 | 286 | template <class _D = D, typename = enable_if_t<!is_pointer<_D>::value && is_default_constructible<_D>::value>> |
kenjiArai | 1:9db0e321a9f4 | 287 | constexpr unique_ptr() noexcept : impl::deleter_store<D>(), ptr_() { } |
kenjiArai | 1:9db0e321a9f4 | 288 | |
kenjiArai | 1:9db0e321a9f4 | 289 | template <class _D = D, typename = enable_if_t<!is_pointer<_D>::value && is_default_constructible<_D>::value>> |
kenjiArai | 1:9db0e321a9f4 | 290 | constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { } |
kenjiArai | 1:9db0e321a9f4 | 291 | |
kenjiArai | 1:9db0e321a9f4 | 292 | template <class _D = D, typename = enable_if_t<!is_pointer<_D>::value && is_default_constructible<_D>::value>, |
kenjiArai | 1:9db0e321a9f4 | 293 | class U, typename = enable_if_t<is_compatible_pointer<U>()>> |
kenjiArai | 1:9db0e321a9f4 | 294 | explicit unique_ptr(U ptr) noexcept : impl::deleter_store<D>(), ptr_(ptr) { } |
kenjiArai | 1:9db0e321a9f4 | 295 | |
kenjiArai | 1:9db0e321a9f4 | 296 | template <class _D = D, typename = enable_if_t<is_copy_constructible<_D>::value>, |
kenjiArai | 1:9db0e321a9f4 | 297 | class U, typename = enable_if_t<is_compatible_pointer<U>()>> |
kenjiArai | 1:9db0e321a9f4 | 298 | unique_ptr(U ptr, const D &d) noexcept : impl::deleter_store<D>(d), ptr_(ptr) { } |
kenjiArai | 1:9db0e321a9f4 | 299 | |
kenjiArai | 1:9db0e321a9f4 | 300 | template <class _D = D, typename = enable_if_t<is_move_constructible<_D>::value>, |
kenjiArai | 1:9db0e321a9f4 | 301 | class U, typename = enable_if_t<is_compatible_pointer<U>()>> |
kenjiArai | 1:9db0e321a9f4 | 302 | unique_ptr(U ptr, enable_if_t<!is_lvalue_reference<_D>::value, _D &&> d) noexcept : impl::deleter_store<D>(std::move(d)), ptr_(ptr) { } |
kenjiArai | 1:9db0e321a9f4 | 303 | |
kenjiArai | 1:9db0e321a9f4 | 304 | template <class _D = D, typename _A = remove_reference_t<_D>, |
kenjiArai | 1:9db0e321a9f4 | 305 | class U, typename = enable_if_t<is_compatible_pointer<U>()>> |
kenjiArai | 1:9db0e321a9f4 | 306 | unique_ptr(U ptr, enable_if_t<is_lvalue_reference<_D>::value, _A &&> d) = delete; |
kenjiArai | 1:9db0e321a9f4 | 307 | |
kenjiArai | 1:9db0e321a9f4 | 308 | unique_ptr(const unique_ptr &) = delete; |
kenjiArai | 1:9db0e321a9f4 | 309 | unique_ptr(unique_ptr &&u) noexcept : impl::deleter_store<D>(std::forward<D>(u.get_deleter())), ptr_(u.ptr_) { u.ptr_ = nullptr; } |
kenjiArai | 1:9db0e321a9f4 | 310 | |
kenjiArai | 1:9db0e321a9f4 | 311 | template <class U, class E, |
kenjiArai | 1:9db0e321a9f4 | 312 | typename = enable_if_t<is_compatible_unique_ptr<U, E>() && |
kenjiArai | 1:9db0e321a9f4 | 313 | (is_reference<D>::value ? is_same<E,D>::value : is_convertible<E,D>::value)>> |
kenjiArai | 1:9db0e321a9f4 | 314 | unique_ptr(unique_ptr<U, E>&& u) noexcept : impl::deleter_store<D>(std::forward<E>(u.get_deleter())), ptr_(u.release()) { } |
kenjiArai | 1:9db0e321a9f4 | 315 | |
kenjiArai | 1:9db0e321a9f4 | 316 | // [unique.ptr.single.dtor] |
kenjiArai | 1:9db0e321a9f4 | 317 | ~unique_ptr() |
kenjiArai | 1:9db0e321a9f4 | 318 | { |
kenjiArai | 1:9db0e321a9f4 | 319 | if (ptr_) { |
kenjiArai | 1:9db0e321a9f4 | 320 | this->get_deleter()(ptr_); |
kenjiArai | 1:9db0e321a9f4 | 321 | } |
kenjiArai | 1:9db0e321a9f4 | 322 | } |
kenjiArai | 1:9db0e321a9f4 | 323 | |
kenjiArai | 1:9db0e321a9f4 | 324 | // [unique.ptr.runtime.modifiers] / [unique.ptr.single.modifiers] |
kenjiArai | 1:9db0e321a9f4 | 325 | pointer release() noexcept |
kenjiArai | 1:9db0e321a9f4 | 326 | { |
kenjiArai | 1:9db0e321a9f4 | 327 | return std::exchange(ptr_, nullptr); |
kenjiArai | 1:9db0e321a9f4 | 328 | } |
kenjiArai | 1:9db0e321a9f4 | 329 | |
kenjiArai | 1:9db0e321a9f4 | 330 | void reset(pointer ptr = pointer()) noexcept |
kenjiArai | 1:9db0e321a9f4 | 331 | { |
kenjiArai | 1:9db0e321a9f4 | 332 | pointer old = std::exchange(ptr_, ptr); |
kenjiArai | 1:9db0e321a9f4 | 333 | if (old) { |
kenjiArai | 1:9db0e321a9f4 | 334 | this->get_deleter()(old); |
kenjiArai | 1:9db0e321a9f4 | 335 | } |
kenjiArai | 1:9db0e321a9f4 | 336 | } |
kenjiArai | 1:9db0e321a9f4 | 337 | |
kenjiArai | 1:9db0e321a9f4 | 338 | template <class U> |
kenjiArai | 1:9db0e321a9f4 | 339 | void reset(U) = delete; |
kenjiArai | 1:9db0e321a9f4 | 340 | |
kenjiArai | 1:9db0e321a9f4 | 341 | void swap(unique_ptr &other) noexcept |
kenjiArai | 1:9db0e321a9f4 | 342 | { |
kenjiArai | 1:9db0e321a9f4 | 343 | using std::swap; |
kenjiArai | 1:9db0e321a9f4 | 344 | swap(this->get_deleter(), other.get_deleter()); |
kenjiArai | 1:9db0e321a9f4 | 345 | swap(ptr_, other.ptr_); |
kenjiArai | 1:9db0e321a9f4 | 346 | } |
kenjiArai | 1:9db0e321a9f4 | 347 | |
kenjiArai | 1:9db0e321a9f4 | 348 | // [unique.ptr.runtime.asgn] / [unique.ptr.single.asgn] |
kenjiArai | 1:9db0e321a9f4 | 349 | unique_ptr &operator=(const unique_ptr &r) = delete; |
kenjiArai | 1:9db0e321a9f4 | 350 | unique_ptr &operator=(unique_ptr &&r) noexcept |
kenjiArai | 1:9db0e321a9f4 | 351 | { |
kenjiArai | 1:9db0e321a9f4 | 352 | reset(r.release()); |
kenjiArai | 1:9db0e321a9f4 | 353 | this->get_deleter() = std::forward<D>(r.get_deleter()); |
kenjiArai | 1:9db0e321a9f4 | 354 | return *this; |
kenjiArai | 1:9db0e321a9f4 | 355 | } |
kenjiArai | 1:9db0e321a9f4 | 356 | unique_ptr &operator=(nullptr_t) noexcept |
kenjiArai | 1:9db0e321a9f4 | 357 | { |
kenjiArai | 1:9db0e321a9f4 | 358 | reset(); |
kenjiArai | 1:9db0e321a9f4 | 359 | return *this; |
kenjiArai | 1:9db0e321a9f4 | 360 | } |
kenjiArai | 1:9db0e321a9f4 | 361 | template <class U, class E> |
kenjiArai | 1:9db0e321a9f4 | 362 | enable_if_t<is_compatible_unique_ptr<U, E>() && |
kenjiArai | 1:9db0e321a9f4 | 363 | is_assignable<D &, E &&>::value, |
kenjiArai | 1:9db0e321a9f4 | 364 | unique_ptr> &operator=(unique_ptr<U, E> &&u) noexcept |
kenjiArai | 1:9db0e321a9f4 | 365 | { |
kenjiArai | 1:9db0e321a9f4 | 366 | reset(u.release()); |
kenjiArai | 1:9db0e321a9f4 | 367 | this->get_deleter() = std::forward<E>(u.get_deleter()); |
kenjiArai | 1:9db0e321a9f4 | 368 | return *this; |
kenjiArai | 1:9db0e321a9f4 | 369 | } |
kenjiArai | 1:9db0e321a9f4 | 370 | |
kenjiArai | 1:9db0e321a9f4 | 371 | // [unique.ptr.runtime.observers] / [unique.ptr.single.observers] |
kenjiArai | 1:9db0e321a9f4 | 372 | pointer get() const noexcept { return ptr_; } |
kenjiArai | 1:9db0e321a9f4 | 373 | T &operator[](size_t index) const { return ptr_[index]; } |
kenjiArai | 1:9db0e321a9f4 | 374 | explicit operator bool() const noexcept { return ptr_; } |
kenjiArai | 1:9db0e321a9f4 | 375 | private: |
kenjiArai | 1:9db0e321a9f4 | 376 | pointer ptr_; |
kenjiArai | 1:9db0e321a9f4 | 377 | }; |
kenjiArai | 1:9db0e321a9f4 | 378 | |
kenjiArai | 1:9db0e321a9f4 | 379 | // [unique.ptr.create] |
kenjiArai | 1:9db0e321a9f4 | 380 | template <typename T, typename... Args> |
kenjiArai | 1:9db0e321a9f4 | 381 | enable_if_t<!is_array<T>::value, |
kenjiArai | 1:9db0e321a9f4 | 382 | unique_ptr<T>> make_unique(Args &&... args) |
kenjiArai | 1:9db0e321a9f4 | 383 | { |
kenjiArai | 1:9db0e321a9f4 | 384 | return unique_ptr<T>(new T(std::forward<Args>(args)...)); |
kenjiArai | 1:9db0e321a9f4 | 385 | } |
kenjiArai | 1:9db0e321a9f4 | 386 | |
kenjiArai | 1:9db0e321a9f4 | 387 | template <typename T> |
kenjiArai | 1:9db0e321a9f4 | 388 | enable_if_t<is_array<T>::value && extent<T>::value == 0, |
kenjiArai | 1:9db0e321a9f4 | 389 | unique_ptr<T>> make_unique(size_t size) |
kenjiArai | 1:9db0e321a9f4 | 390 | { |
kenjiArai | 1:9db0e321a9f4 | 391 | return unique_ptr<T>(new remove_extent_t<T>[size]()); |
kenjiArai | 1:9db0e321a9f4 | 392 | } |
kenjiArai | 1:9db0e321a9f4 | 393 | |
kenjiArai | 1:9db0e321a9f4 | 394 | template <typename T, typename... Args> |
kenjiArai | 1:9db0e321a9f4 | 395 | enable_if_t<extent<T>::value != 0, |
kenjiArai | 1:9db0e321a9f4 | 396 | void> make_unique(Args &&... args) = delete; |
kenjiArai | 1:9db0e321a9f4 | 397 | |
kenjiArai | 1:9db0e321a9f4 | 398 | // [unique.ptr.special] |
kenjiArai | 1:9db0e321a9f4 | 399 | template< class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 400 | void swap(unique_ptr<T,D> &lhs, unique_ptr<T,D> &rhs) noexcept |
kenjiArai | 1:9db0e321a9f4 | 401 | { |
kenjiArai | 1:9db0e321a9f4 | 402 | lhs.swap(rhs); |
kenjiArai | 1:9db0e321a9f4 | 403 | } |
kenjiArai | 1:9db0e321a9f4 | 404 | |
kenjiArai | 1:9db0e321a9f4 | 405 | template<class T1, class D1, class T2, class D2> |
kenjiArai | 1:9db0e321a9f4 | 406 | bool operator==(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y) |
kenjiArai | 1:9db0e321a9f4 | 407 | { |
kenjiArai | 1:9db0e321a9f4 | 408 | return x.get() == y.get(); |
kenjiArai | 1:9db0e321a9f4 | 409 | } |
kenjiArai | 1:9db0e321a9f4 | 410 | |
kenjiArai | 1:9db0e321a9f4 | 411 | template<class T1, class D1, class T2, class D2> |
kenjiArai | 1:9db0e321a9f4 | 412 | bool operator!=(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y) |
kenjiArai | 1:9db0e321a9f4 | 413 | { |
kenjiArai | 1:9db0e321a9f4 | 414 | return x.get() != y.get(); |
kenjiArai | 1:9db0e321a9f4 | 415 | } |
kenjiArai | 1:9db0e321a9f4 | 416 | |
kenjiArai | 1:9db0e321a9f4 | 417 | template<class T1, class D1, class T2, class D2> |
kenjiArai | 1:9db0e321a9f4 | 418 | bool operator<(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y) |
kenjiArai | 1:9db0e321a9f4 | 419 | { |
kenjiArai | 1:9db0e321a9f4 | 420 | using CT = common_type_t<typename unique_ptr<T1, D1>::pointer, typename unique_ptr<T2, D2>::pointer>; |
kenjiArai | 1:9db0e321a9f4 | 421 | return less<CT>()(x.get(), y.get()); |
kenjiArai | 1:9db0e321a9f4 | 422 | } |
kenjiArai | 1:9db0e321a9f4 | 423 | |
kenjiArai | 1:9db0e321a9f4 | 424 | template<class T1, class D1, class T2, class D2> |
kenjiArai | 1:9db0e321a9f4 | 425 | bool operator<=(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y) |
kenjiArai | 1:9db0e321a9f4 | 426 | { |
kenjiArai | 1:9db0e321a9f4 | 427 | return !(y < x); |
kenjiArai | 1:9db0e321a9f4 | 428 | } |
kenjiArai | 1:9db0e321a9f4 | 429 | |
kenjiArai | 1:9db0e321a9f4 | 430 | template<class T1, class D1, class T2, class D2> |
kenjiArai | 1:9db0e321a9f4 | 431 | bool operator>(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y) |
kenjiArai | 1:9db0e321a9f4 | 432 | { |
kenjiArai | 1:9db0e321a9f4 | 433 | return y < x; |
kenjiArai | 1:9db0e321a9f4 | 434 | } |
kenjiArai | 1:9db0e321a9f4 | 435 | |
kenjiArai | 1:9db0e321a9f4 | 436 | template<class T1, class D1, class T2, class D2> |
kenjiArai | 1:9db0e321a9f4 | 437 | bool operator>=(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y) |
kenjiArai | 1:9db0e321a9f4 | 438 | { |
kenjiArai | 1:9db0e321a9f4 | 439 | return !(x < y); |
kenjiArai | 1:9db0e321a9f4 | 440 | } |
kenjiArai | 1:9db0e321a9f4 | 441 | |
kenjiArai | 1:9db0e321a9f4 | 442 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 443 | bool operator==(const unique_ptr<T, D> &x, nullptr_t) noexcept |
kenjiArai | 1:9db0e321a9f4 | 444 | { |
kenjiArai | 1:9db0e321a9f4 | 445 | return !x; |
kenjiArai | 1:9db0e321a9f4 | 446 | } |
kenjiArai | 1:9db0e321a9f4 | 447 | |
kenjiArai | 1:9db0e321a9f4 | 448 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 449 | bool operator==(nullptr_t, const unique_ptr<T, D> &x) noexcept |
kenjiArai | 1:9db0e321a9f4 | 450 | { |
kenjiArai | 1:9db0e321a9f4 | 451 | return !x; |
kenjiArai | 1:9db0e321a9f4 | 452 | } |
kenjiArai | 1:9db0e321a9f4 | 453 | |
kenjiArai | 1:9db0e321a9f4 | 454 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 455 | bool operator!=(const unique_ptr<T, D> &x, nullptr_t) noexcept |
kenjiArai | 1:9db0e321a9f4 | 456 | { |
kenjiArai | 1:9db0e321a9f4 | 457 | return bool(x); |
kenjiArai | 1:9db0e321a9f4 | 458 | } |
kenjiArai | 1:9db0e321a9f4 | 459 | |
kenjiArai | 1:9db0e321a9f4 | 460 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 461 | bool operator!=(nullptr_t, const unique_ptr<T, D> &x) noexcept |
kenjiArai | 1:9db0e321a9f4 | 462 | { |
kenjiArai | 1:9db0e321a9f4 | 463 | return bool(x); |
kenjiArai | 1:9db0e321a9f4 | 464 | } |
kenjiArai | 1:9db0e321a9f4 | 465 | |
kenjiArai | 1:9db0e321a9f4 | 466 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 467 | bool operator<(const unique_ptr<T, D> &x, nullptr_t) noexcept |
kenjiArai | 1:9db0e321a9f4 | 468 | { |
kenjiArai | 1:9db0e321a9f4 | 469 | return less<typename unique_ptr<T, D>::pointer>()(x.get(), nullptr); |
kenjiArai | 1:9db0e321a9f4 | 470 | } |
kenjiArai | 1:9db0e321a9f4 | 471 | |
kenjiArai | 1:9db0e321a9f4 | 472 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 473 | bool operator<(nullptr_t, const unique_ptr<T, D> &x) noexcept |
kenjiArai | 1:9db0e321a9f4 | 474 | { |
kenjiArai | 1:9db0e321a9f4 | 475 | return less<typename unique_ptr<T, D>::pointer>()(nullptr, x.get()); |
kenjiArai | 1:9db0e321a9f4 | 476 | } |
kenjiArai | 1:9db0e321a9f4 | 477 | |
kenjiArai | 1:9db0e321a9f4 | 478 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 479 | bool operator>(const unique_ptr<T, D> &x, nullptr_t) noexcept |
kenjiArai | 1:9db0e321a9f4 | 480 | { |
kenjiArai | 1:9db0e321a9f4 | 481 | return nullptr < x; |
kenjiArai | 1:9db0e321a9f4 | 482 | } |
kenjiArai | 1:9db0e321a9f4 | 483 | |
kenjiArai | 1:9db0e321a9f4 | 484 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 485 | bool operator>(nullptr_t, const unique_ptr<T, D> &x) noexcept |
kenjiArai | 1:9db0e321a9f4 | 486 | { |
kenjiArai | 1:9db0e321a9f4 | 487 | return x < nullptr; |
kenjiArai | 1:9db0e321a9f4 | 488 | } |
kenjiArai | 1:9db0e321a9f4 | 489 | |
kenjiArai | 1:9db0e321a9f4 | 490 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 491 | bool operator<=(const unique_ptr<T, D> &x, nullptr_t) noexcept |
kenjiArai | 1:9db0e321a9f4 | 492 | { |
kenjiArai | 1:9db0e321a9f4 | 493 | return !(nullptr < x); |
kenjiArai | 1:9db0e321a9f4 | 494 | } |
kenjiArai | 1:9db0e321a9f4 | 495 | |
kenjiArai | 1:9db0e321a9f4 | 496 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 497 | bool operator<=(nullptr_t, const unique_ptr<T, D> &x) noexcept |
kenjiArai | 1:9db0e321a9f4 | 498 | { |
kenjiArai | 1:9db0e321a9f4 | 499 | return !(x < nullptr); |
kenjiArai | 1:9db0e321a9f4 | 500 | } |
kenjiArai | 1:9db0e321a9f4 | 501 | |
kenjiArai | 1:9db0e321a9f4 | 502 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 503 | bool operator>=(const unique_ptr<T, D> &x, nullptr_t) noexcept |
kenjiArai | 1:9db0e321a9f4 | 504 | { |
kenjiArai | 1:9db0e321a9f4 | 505 | return !(x < nullptr); |
kenjiArai | 1:9db0e321a9f4 | 506 | } |
kenjiArai | 1:9db0e321a9f4 | 507 | |
kenjiArai | 1:9db0e321a9f4 | 508 | template <class T, class D> |
kenjiArai | 1:9db0e321a9f4 | 509 | bool operator>=(nullptr_t, const unique_ptr<T, D> &x) noexcept |
kenjiArai | 1:9db0e321a9f4 | 510 | { |
kenjiArai | 1:9db0e321a9f4 | 511 | return !(nullptr < x); |
kenjiArai | 1:9db0e321a9f4 | 512 | } |
kenjiArai | 1:9db0e321a9f4 | 513 | |
kenjiArai | 1:9db0e321a9f4 | 514 | } // namespace std |
kenjiArai | 1:9db0e321a9f4 | 515 | |
kenjiArai | 1:9db0e321a9f4 | 516 | #endif // __CC_ARM |
kenjiArai | 1:9db0e321a9f4 | 517 | |
kenjiArai | 1:9db0e321a9f4 | 518 | namespace mstd { |
kenjiArai | 1:9db0e321a9f4 | 519 | using std::align; |
kenjiArai | 1:9db0e321a9f4 | 520 | using std::allocator; |
kenjiArai | 1:9db0e321a9f4 | 521 | using std::addressof; |
kenjiArai | 1:9db0e321a9f4 | 522 | |
kenjiArai | 1:9db0e321a9f4 | 523 | // [uninitialized.construct.default] (C++17) |
kenjiArai | 1:9db0e321a9f4 | 524 | template <class ForwardIterator, class Size> |
kenjiArai | 1:9db0e321a9f4 | 525 | void uninitialized_default_construct(ForwardIterator first, ForwardIterator last) { |
kenjiArai | 1:9db0e321a9f4 | 526 | for (; first != last; ++first) { |
kenjiArai | 1:9db0e321a9f4 | 527 | ::new (static_cast<void*>(addressof(*first))) |
kenjiArai | 1:9db0e321a9f4 | 528 | typename std::iterator_traits<ForwardIterator>::value_type; |
kenjiArai | 1:9db0e321a9f4 | 529 | } |
kenjiArai | 1:9db0e321a9f4 | 530 | } |
kenjiArai | 1:9db0e321a9f4 | 531 | |
kenjiArai | 1:9db0e321a9f4 | 532 | template <class ForwardIterator, class Size> |
kenjiArai | 1:9db0e321a9f4 | 533 | ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n) { |
kenjiArai | 1:9db0e321a9f4 | 534 | for (; n; ++first, --n) { |
kenjiArai | 1:9db0e321a9f4 | 535 | ::new (static_cast<void*>(addressof(*first))) |
kenjiArai | 1:9db0e321a9f4 | 536 | typename std::iterator_traits<ForwardIterator>::value_type; |
kenjiArai | 1:9db0e321a9f4 | 537 | } |
kenjiArai | 1:9db0e321a9f4 | 538 | |
kenjiArai | 1:9db0e321a9f4 | 539 | return first; |
kenjiArai | 1:9db0e321a9f4 | 540 | } |
kenjiArai | 1:9db0e321a9f4 | 541 | |
kenjiArai | 1:9db0e321a9f4 | 542 | // [uninitialized.construct.value] (C++17) |
kenjiArai | 1:9db0e321a9f4 | 543 | template <class ForwardIterator, class Size> |
kenjiArai | 1:9db0e321a9f4 | 544 | void uninitialized_value_construct(ForwardIterator first, ForwardIterator last) { |
kenjiArai | 1:9db0e321a9f4 | 545 | for (; first != last; ++first) { |
kenjiArai | 1:9db0e321a9f4 | 546 | ::new (static_cast<void*>(addressof(*first))) |
kenjiArai | 1:9db0e321a9f4 | 547 | typename std::iterator_traits<ForwardIterator>::value_type(); |
kenjiArai | 1:9db0e321a9f4 | 548 | } |
kenjiArai | 1:9db0e321a9f4 | 549 | } |
kenjiArai | 1:9db0e321a9f4 | 550 | |
kenjiArai | 1:9db0e321a9f4 | 551 | template <class ForwardIterator, class Size> |
kenjiArai | 1:9db0e321a9f4 | 552 | ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n) { |
kenjiArai | 1:9db0e321a9f4 | 553 | for (; n; ++first, --n) { |
kenjiArai | 1:9db0e321a9f4 | 554 | ::new (static_cast<void*>(addressof(*first))) |
kenjiArai | 1:9db0e321a9f4 | 555 | typename std::iterator_traits<ForwardIterator>::value_type(); |
kenjiArai | 1:9db0e321a9f4 | 556 | } |
kenjiArai | 1:9db0e321a9f4 | 557 | |
kenjiArai | 1:9db0e321a9f4 | 558 | return first; |
kenjiArai | 1:9db0e321a9f4 | 559 | } |
kenjiArai | 1:9db0e321a9f4 | 560 | |
kenjiArai | 1:9db0e321a9f4 | 561 | // [uninitialized.move] (C++17) |
kenjiArai | 1:9db0e321a9f4 | 562 | template <class InputIterator, class ForwardIterator> |
kenjiArai | 1:9db0e321a9f4 | 563 | ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result) { |
kenjiArai | 1:9db0e321a9f4 | 564 | for (; first != last; ++result, (void) ++first) { |
kenjiArai | 1:9db0e321a9f4 | 565 | ::new (static_cast<void*>(addressof(*result))) |
kenjiArai | 1:9db0e321a9f4 | 566 | typename std::iterator_traits<ForwardIterator>::value_type(move(*first)); |
kenjiArai | 1:9db0e321a9f4 | 567 | } |
kenjiArai | 1:9db0e321a9f4 | 568 | |
kenjiArai | 1:9db0e321a9f4 | 569 | return result; |
kenjiArai | 1:9db0e321a9f4 | 570 | } |
kenjiArai | 1:9db0e321a9f4 | 571 | |
kenjiArai | 1:9db0e321a9f4 | 572 | template <class InputIterator, class Size, class ForwardIterator> |
kenjiArai | 1:9db0e321a9f4 | 573 | std::pair<InputIterator, ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result) { |
kenjiArai | 1:9db0e321a9f4 | 574 | for ( ; n > 0; ++result, (void) ++first, --n) { |
kenjiArai | 1:9db0e321a9f4 | 575 | ::new (static_cast<void*>(addressof(*result))) |
kenjiArai | 1:9db0e321a9f4 | 576 | typename std::iterator_traits<ForwardIterator>::value_type(std::move(*first)); |
kenjiArai | 1:9db0e321a9f4 | 577 | } |
kenjiArai | 1:9db0e321a9f4 | 578 | |
kenjiArai | 1:9db0e321a9f4 | 579 | return { first, result }; |
kenjiArai | 1:9db0e321a9f4 | 580 | } |
kenjiArai | 1:9db0e321a9f4 | 581 | |
kenjiArai | 1:9db0e321a9f4 | 582 | using std::uninitialized_copy; |
kenjiArai | 1:9db0e321a9f4 | 583 | using std::uninitialized_copy_n; |
kenjiArai | 1:9db0e321a9f4 | 584 | using std::uninitialized_fill; |
kenjiArai | 1:9db0e321a9f4 | 585 | using std::uninitialized_fill_n; |
kenjiArai | 1:9db0e321a9f4 | 586 | |
kenjiArai | 1:9db0e321a9f4 | 587 | // [specialized.destroy] (C++17) |
kenjiArai | 1:9db0e321a9f4 | 588 | template <class T> |
kenjiArai | 1:9db0e321a9f4 | 589 | void destroy_at(T *location) |
kenjiArai | 1:9db0e321a9f4 | 590 | { |
kenjiArai | 1:9db0e321a9f4 | 591 | location->~T(); |
kenjiArai | 1:9db0e321a9f4 | 592 | } |
kenjiArai | 1:9db0e321a9f4 | 593 | |
kenjiArai | 1:9db0e321a9f4 | 594 | template <class ForwardIterator> |
kenjiArai | 1:9db0e321a9f4 | 595 | void destroy(ForwardIterator first, ForwardIterator last) |
kenjiArai | 1:9db0e321a9f4 | 596 | { |
kenjiArai | 1:9db0e321a9f4 | 597 | for (; first != last; ++first) { |
kenjiArai | 1:9db0e321a9f4 | 598 | destroy_at(addressof(*first)); |
kenjiArai | 1:9db0e321a9f4 | 599 | } |
kenjiArai | 1:9db0e321a9f4 | 600 | } |
kenjiArai | 1:9db0e321a9f4 | 601 | |
kenjiArai | 1:9db0e321a9f4 | 602 | template <class ForwardIterator, class Size> |
kenjiArai | 1:9db0e321a9f4 | 603 | ForwardIterator destroy_n(ForwardIterator first, Size n) |
kenjiArai | 1:9db0e321a9f4 | 604 | { |
kenjiArai | 1:9db0e321a9f4 | 605 | for (; n > 0; (void)++first, --n) { |
kenjiArai | 1:9db0e321a9f4 | 606 | destroy_at(addressof(*first)); |
kenjiArai | 1:9db0e321a9f4 | 607 | } |
kenjiArai | 1:9db0e321a9f4 | 608 | return first; |
kenjiArai | 1:9db0e321a9f4 | 609 | } |
kenjiArai | 1:9db0e321a9f4 | 610 | |
kenjiArai | 1:9db0e321a9f4 | 611 | using std::default_delete; |
kenjiArai | 1:9db0e321a9f4 | 612 | using std::unique_ptr; |
kenjiArai | 1:9db0e321a9f4 | 613 | using std::make_unique; |
kenjiArai | 1:9db0e321a9f4 | 614 | } |
kenjiArai | 1:9db0e321a9f4 | 615 | |
kenjiArai | 1:9db0e321a9f4 | 616 | #endif // MSTD_MEMORY_ |