xref: /llvm-project/libcxx/test/support/double_move_tracker.h (revision f73050e722dd2e484358d03674eb186f3a2f4799)
1*f73050e7SLouis Dionne //===----------------------------------------------------------------------===//
2*f73050e7SLouis Dionne //
3*f73050e7SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*f73050e7SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*f73050e7SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*f73050e7SLouis Dionne //
7*f73050e7SLouis Dionne //===----------------------------------------------------------------------===//
8*f73050e7SLouis Dionne 
9*f73050e7SLouis Dionne #ifndef TEST_SUPPORT_DOUBLE_MOVE_TRACKER_H
10*f73050e7SLouis Dionne #define TEST_SUPPORT_DOUBLE_MOVE_TRACKER_H
11*f73050e7SLouis Dionne 
12*f73050e7SLouis Dionne #include <cassert>
13*f73050e7SLouis Dionne 
14*f73050e7SLouis Dionne #include "test_macros.h"
15*f73050e7SLouis Dionne 
16*f73050e7SLouis Dionne namespace support {
17*f73050e7SLouis Dionne 
18*f73050e7SLouis Dionne struct double_move_tracker {
19*f73050e7SLouis Dionne   TEST_CONSTEXPR double_move_tracker() : moved_from_(false) {}
20*f73050e7SLouis Dionne 
21*f73050e7SLouis Dionne   double_move_tracker(double_move_tracker const&) = default;
22*f73050e7SLouis Dionne 
23*f73050e7SLouis Dionne   TEST_CONSTEXPR_CXX14 double_move_tracker(double_move_tracker&& other) : moved_from_(false) {
24*f73050e7SLouis Dionne     assert(!other.moved_from_);
25*f73050e7SLouis Dionne     other.moved_from_ = true;
26*f73050e7SLouis Dionne   }
27*f73050e7SLouis Dionne 
28*f73050e7SLouis Dionne   double_move_tracker& operator=(double_move_tracker const&) = default;
29*f73050e7SLouis Dionne 
30*f73050e7SLouis Dionne   TEST_CONSTEXPR_CXX14 double_move_tracker& operator=(double_move_tracker&& other) {
31*f73050e7SLouis Dionne     assert(!other.moved_from_);
32*f73050e7SLouis Dionne     other.moved_from_ = true;
33*f73050e7SLouis Dionne     moved_from_       = false;
34*f73050e7SLouis Dionne     return *this;
35*f73050e7SLouis Dionne   }
36*f73050e7SLouis Dionne 
37*f73050e7SLouis Dionne private:
38*f73050e7SLouis Dionne   bool moved_from_;
39*f73050e7SLouis Dionne };
40*f73050e7SLouis Dionne 
41*f73050e7SLouis Dionne } // namespace support
42*f73050e7SLouis Dionne 
43*f73050e7SLouis Dionne #endif // TEST_SUPPORT_DOUBLE_MOVE_TRACKER_H
44