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