62 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef _LIBCPP___ITERATOR_MOVE_SENTINEL_H10#define _LIBCPP___ITERATOR_MOVE_SENTINEL_H11 12#include <__concepts/assignable.h>13#include <__concepts/convertible_to.h>14#include <__concepts/semiregular.h>15#include <__config>16#include <__utility/move.h>17 18#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)19# pragma GCC system_header20#endif21 22_LIBCPP_PUSH_MACROS23#include <__undef_macros>24 25_LIBCPP_BEGIN_NAMESPACE_STD26 27#if _LIBCPP_STD_VER >= 2028 29template <semiregular _Sent>30class move_sentinel {31public:32 _LIBCPP_HIDE_FROM_ABI move_sentinel() = default;33 34 _LIBCPP_HIDE_FROM_ABI constexpr explicit move_sentinel(_Sent __s) : __last_(std::move(__s)) {}35 36 template <class _S2>37 requires convertible_to<const _S2&, _Sent>38 _LIBCPP_HIDE_FROM_ABI constexpr move_sentinel(const move_sentinel<_S2>& __s) : __last_(__s.base()) {}39 40 template <class _S2>41 requires assignable_from<_Sent&, const _S2&>42 _LIBCPP_HIDE_FROM_ABI constexpr move_sentinel& operator=(const move_sentinel<_S2>& __s) {43 __last_ = __s.base();44 return *this;45 }46 47 _LIBCPP_HIDE_FROM_ABI constexpr _Sent base() const { return __last_; }48 49private:50 _Sent __last_ = _Sent();51};52 53_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(move_sentinel);54 55#endif // _LIBCPP_STD_VER >= 2056 57_LIBCPP_END_NAMESPACE_STD58 59_LIBCPP_POP_MACROS60 61#endif // _LIBCPP___ITERATOR_MOVE_SENTINEL_H62