1 #ifndef MOVEONLY_H 2 #define MOVEONLY_H 3 4 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5 6 #include <cstddef> 7 #include <functional> 8 9 class MoveOnly 10 { 11 MoveOnly(const MoveOnly&); 12 MoveOnly& operator=(const MoveOnly&); 13 14 int data_; 15 public: data_(data)16 MoveOnly(int data = 1) : data_(data) {} MoveOnly(MoveOnly && x)17 MoveOnly(MoveOnly&& x) 18 : data_(x.data_) {x.data_ = 0;} 19 MoveOnly& operator=(MoveOnly&& x) 20 {data_ = x.data_; x.data_ = 0; return *this;} 21 get()22 int get() const {return data_;} 23 24 bool operator==(const MoveOnly& x) const {return data_ == x.data_;} 25 bool operator< (const MoveOnly& x) const {return data_ < x.data_;} 26 }; 27 28 namespace std { 29 30 template <> 31 struct hash<MoveOnly> 32 : public std::unary_function<MoveOnly, std::size_t> 33 { 34 std::size_t operator()(const MoveOnly& x) const {return x.get();} 35 }; 36 37 } 38 39 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 40 41 #endif // MOVEONLY_H 42