1*0a6a1f1dSLionel Sambuc //===----------------------------------------------------------------------===// 2*0a6a1f1dSLionel Sambuc // 3*0a6a1f1dSLionel Sambuc // The LLVM Compiler Infrastructure 4*0a6a1f1dSLionel Sambuc // 5*0a6a1f1dSLionel Sambuc // This file is dual licensed under the MIT and the University of Illinois Open 6*0a6a1f1dSLionel Sambuc // Source Licenses. See LICENSE.TXT for details. 7*0a6a1f1dSLionel Sambuc // 8*0a6a1f1dSLionel Sambuc //===----------------------------------------------------------------------===// 9*0a6a1f1dSLionel Sambuc 10*0a6a1f1dSLionel Sambuc #ifndef MOVEONLY_H 11*0a6a1f1dSLionel Sambuc #define MOVEONLY_H 12*0a6a1f1dSLionel Sambuc 13*0a6a1f1dSLionel Sambuc #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 14*0a6a1f1dSLionel Sambuc 15*0a6a1f1dSLionel Sambuc #include <cstddef> 16*0a6a1f1dSLionel Sambuc #include <functional> 17*0a6a1f1dSLionel Sambuc 18*0a6a1f1dSLionel Sambuc class MoveOnly 19*0a6a1f1dSLionel Sambuc { 20*0a6a1f1dSLionel Sambuc MoveOnly(const MoveOnly&); 21*0a6a1f1dSLionel Sambuc MoveOnly& operator=(const MoveOnly&); 22*0a6a1f1dSLionel Sambuc 23*0a6a1f1dSLionel Sambuc int data_; 24*0a6a1f1dSLionel Sambuc public: data_(data)25*0a6a1f1dSLionel Sambuc MoveOnly(int data = 1) : data_(data) {} MoveOnly(MoveOnly && x)26*0a6a1f1dSLionel Sambuc MoveOnly(MoveOnly&& x) 27*0a6a1f1dSLionel Sambuc : data_(x.data_) {x.data_ = 0;} 28*0a6a1f1dSLionel Sambuc MoveOnly& operator=(MoveOnly&& x) 29*0a6a1f1dSLionel Sambuc {data_ = x.data_; x.data_ = 0; return *this;} 30*0a6a1f1dSLionel Sambuc get()31*0a6a1f1dSLionel Sambuc int get() const {return data_;} 32*0a6a1f1dSLionel Sambuc 33*0a6a1f1dSLionel Sambuc bool operator==(const MoveOnly& x) const {return data_ == x.data_;} 34*0a6a1f1dSLionel Sambuc bool operator< (const MoveOnly& x) const {return data_ < x.data_;} 35*0a6a1f1dSLionel Sambuc }; 36*0a6a1f1dSLionel Sambuc 37*0a6a1f1dSLionel Sambuc namespace std { 38*0a6a1f1dSLionel Sambuc 39*0a6a1f1dSLionel Sambuc template <> 40*0a6a1f1dSLionel Sambuc struct hash<MoveOnly> 41*0a6a1f1dSLionel Sambuc : public std::unary_function<MoveOnly, std::size_t> 42*0a6a1f1dSLionel Sambuc { 43*0a6a1f1dSLionel Sambuc std::size_t operator()(const MoveOnly& x) const {return x.get();} 44*0a6a1f1dSLionel Sambuc }; 45*0a6a1f1dSLionel Sambuc 46*0a6a1f1dSLionel Sambuc } 47*0a6a1f1dSLionel Sambuc 48*0a6a1f1dSLionel Sambuc #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 49*0a6a1f1dSLionel Sambuc 50*0a6a1f1dSLionel Sambuc #endif // MOVEONLY_H 51