mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

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?

UserRevisionLine numberNew 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_