1 //===----------------------------------------------------------------------===//
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 
10 #ifndef MOVEONLY_H
11 #define MOVEONLY_H
12 
13 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
14 
15 #include <cstddef>
16 #include <functional>
17 
18 class MoveOnly
19 {
20     MoveOnly(const MoveOnly&);
21     MoveOnly& operator=(const MoveOnly&);
22 
23     int data_;
24 public:
data_(data)25     MoveOnly(int data = 1) : data_(data) {}
MoveOnly(MoveOnly && x)26     MoveOnly(MoveOnly&& x)
27         : data_(x.data_) {x.data_ = 0;}
28     MoveOnly& operator=(MoveOnly&& x)
29         {data_ = x.data_; x.data_ = 0; return *this;}
30 
get()31     int get() const {return data_;}
32 
33     bool operator==(const MoveOnly& x) const {return data_ == x.data_;}
34     bool operator< (const MoveOnly& x) const {return data_ <  x.data_;}
35 };
36 
37 namespace std {
38 
39 template <>
40 struct hash<MoveOnly>
41     : public std::unary_function<MoveOnly, std::size_t>
42 {
43     std::size_t operator()(const MoveOnly& x) const {return x.get();}
44 };
45 
46 }
47 
48 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
49 
50 #endif  // MOVEONLY_H
51