[libcxx-commits] [PATCH] D102639: [libcxx][ranges] Add `indirectly_­movable`.

Zoe Carver via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon May 17 10:30:58 PDT 2021


zoecarver created this revision.
zoecarver added reviewers: cjdb, Quuxplusone, EricWF, ldionne.
zoecarver requested review of this revision.
Herald added a project: libc++.
Herald added a subscriber: libcxx-commits.
Herald added a reviewer: libc++.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D102639

Files:
  libcxx/include/__iterator/concepts.h
  libcxx/test/std/iterators/iterator.requirements/alg.req/ind.move.pass.cpp


Index: libcxx/test/std/iterators/iterator.requirements/alg.req/ind.move.pass.cpp
===================================================================
--- /dev/null
+++ libcxx/test/std/iterators/iterator.requirements/alg.req/ind.move.pass.cpp
@@ -0,0 +1,49 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+// UNSUPPORTED: gcc-10
+
+// template<class I>
+// unspecified indirectly_movable;
+
+#include <iterator>
+
+#include "test_macros.h"
+
+struct IndirectlyMovableWithInt {
+  int& operator*() const;
+};
+
+struct Empty {};
+
+struct MoveOnly {
+  MoveOnly(MoveOnly&&) = default;
+  MoveOnly(MoveOnly const&) = delete;
+  MoveOnly& operator=(MoveOnly&&) = default;
+  MoveOnly& operator=(MoveOnly const&) = delete;
+  MoveOnly() = default;
+};
+
+struct MoveOnlyWrapper {
+  using value_type = MoveOnly;
+  MoveOnly& operator*() const;
+};
+
+static_assert( std::indirectly_movable<int*, int*>);
+static_assert(!std::indirectly_movable<int[2], int*>);
+static_assert(!std::indirectly_movable<int[2], int[2]>);
+static_assert(!std::indirectly_movable<int, int*>);
+static_assert(!std::indirectly_movable<int, int>);
+static_assert( std::indirectly_movable<Empty*, Empty*>);
+static_assert(!std::indirectly_movable<Empty*, IndirectlyMovableWithInt>);
+static_assert( std::indirectly_movable<int*, IndirectlyMovableWithInt>);
+static_assert( std::indirectly_movable<MoveOnly*, MoveOnly*>);
+static_assert( std::indirectly_movable<MoveOnlyWrapper, MoveOnlyWrapper>);
+static_assert( std::indirectly_movable<MoveOnly*, MoveOnlyWrapper>);
Index: libcxx/include/__iterator/concepts.h
===================================================================
--- libcxx/include/__iterator/concepts.h
+++ libcxx/include/__iterator/concepts.h
@@ -164,6 +164,11 @@
     { _VSTD::to_address(__i) } -> same_as<add_pointer_t<iter_reference_t<_Ip>>>;
   };
 
+template<class _In, class _Out>
+concept indirectly_movable =
+  indirectly_readable<_In> &&
+  indirectly_writable<_Out, iter_rvalue_reference_t<_In>>;
+
 // clang-format on
 
 #endif // !defined(_LIBCPP_HAS_NO_RANGES)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102639.345929.patch
Type: text/x-patch
Size: 2474 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20210517/2d42a329/attachment.bin>


More information about the libcxx-commits mailing list