blob: b9653516cfdad026ee3a0cf9be71bae16639f473 [file] [log] [blame]
Marshall Clow354d39c2014-01-16 16:58:45 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Howard Hinnant3e519522010-05-11 19:42:16 +000010#ifndef MOVEONLY_H
11#define MOVEONLY_H
12
Howard Hinnant7609c9b2010-09-04 23:28:19 +000013#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:16 +000014
15#include <cstddef>
16#include <functional>
17
18class MoveOnly
19{
Marshall Clowafc9ff92016-01-05 19:32:41 +000020 friend class MoveOnly2;
Howard Hinnant3e519522010-05-11 19:42:16 +000021 MoveOnly(const MoveOnly&);
22 MoveOnly& operator=(const MoveOnly&);
23
24 int data_;
25public:
David Blaikiec6dbc222014-08-09 22:42:19 +000026 MoveOnly(int data = 1) : data_(data) {}
27 MoveOnly(MoveOnly&& x)
28 : data_(x.data_) {x.data_ = 0;}
29 MoveOnly& operator=(MoveOnly&& x)
30 {data_ = x.data_; x.data_ = 0; return *this;}
Howard Hinnant3e519522010-05-11 19:42:16 +000031
32 int get() const {return data_;}
33
Howard Hinnant8f2f7e72010-08-22 00:15:28 +000034 bool operator==(const MoveOnly& x) const {return data_ == x.data_;}
35 bool operator< (const MoveOnly& x) const {return data_ < x.data_;}
Howard Hinnant3e519522010-05-11 19:42:16 +000036};
37
Marshall Clowafc9ff92016-01-05 19:32:41 +000038class MoveOnly2
39{
40 MoveOnly2(const MoveOnly&);
41 MoveOnly2& operator=(const MoveOnly2&);
42
43 int data_;
44public:
45 MoveOnly2(int data = 1) : data_(data) {}
46 MoveOnly2(MoveOnly2&& x)
47 : data_(x.data_) {x.data_ = 0;}
48 MoveOnly2& operator=(MoveOnly2&& x)
49 {data_ = x.data_; x.data_ = 0; return *this;}
50 MoveOnly2(MoveOnly&& x)
51 : data_(x.data_) {x.data_ = 0;}
52 MoveOnly2& operator=(MoveOnly&& x)
53 {data_ = x.data_; x.data_ = 0; return *this;}
54
55 int get() const {return data_;}
56
57 bool operator==(const MoveOnly2& x) const {return data_ == x.data_;}
58 bool operator< (const MoveOnly2& x) const {return data_ < x.data_;}
59};
60
Howard Hinnant3e519522010-05-11 19:42:16 +000061namespace std {
62
63template <>
64struct hash<MoveOnly>
65 : public std::unary_function<MoveOnly, std::size_t>
66{
67 std::size_t operator()(const MoveOnly& x) const {return x.get();}
68};
69
Marshall Clowafc9ff92016-01-05 19:32:41 +000070template <>
71struct hash<MoveOnly2>
72 : public std::unary_function<MoveOnly, std::size_t>
73{
74 std::size_t operator()(const MoveOnly2& x) const {return x.get();}
75};
Howard Hinnant3e519522010-05-11 19:42:16 +000076}
77
Howard Hinnant7609c9b2010-09-04 23:28:19 +000078#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:16 +000079
Howard Hinnant8f2f7e72010-08-22 00:15:28 +000080#endif // MOVEONLY_H