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 EMPLACEABLE_H 11*58b9f456SAndroid Build Coastguard Worker #define EMPLACEABLE_H 12*58b9f456SAndroid Build Coastguard Worker 13*58b9f456SAndroid Build Coastguard Worker #include <functional> 14*58b9f456SAndroid Build Coastguard Worker #include "test_macros.h" 15*58b9f456SAndroid Build Coastguard Worker 16*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 11 17*58b9f456SAndroid Build Coastguard Worker 18*58b9f456SAndroid Build Coastguard Worker class Emplaceable 19*58b9f456SAndroid Build Coastguard Worker { 20*58b9f456SAndroid Build Coastguard Worker Emplaceable(const Emplaceable&); 21*58b9f456SAndroid Build Coastguard Worker Emplaceable& operator=(const Emplaceable&); 22*58b9f456SAndroid Build Coastguard Worker 23*58b9f456SAndroid Build Coastguard Worker int int_; 24*58b9f456SAndroid Build Coastguard Worker double double_; 25*58b9f456SAndroid Build Coastguard Worker public: Emplaceable()26*58b9f456SAndroid Build Coastguard Worker Emplaceable() : int_(0), double_(0) {} Emplaceable(int i,double d)27*58b9f456SAndroid Build Coastguard Worker Emplaceable(int i, double d) : int_(i), double_(d) {} Emplaceable(Emplaceable && x)28*58b9f456SAndroid Build Coastguard Worker Emplaceable(Emplaceable&& x) 29*58b9f456SAndroid Build Coastguard Worker : int_(x.int_), double_(x.double_) 30*58b9f456SAndroid Build Coastguard Worker {x.int_ = 0; x.double_ = 0;} 31*58b9f456SAndroid Build Coastguard Worker Emplaceable& operator=(Emplaceable&& x) 32*58b9f456SAndroid Build Coastguard Worker {int_ = x.int_; x.int_ = 0; 33*58b9f456SAndroid Build Coastguard Worker double_ = x.double_; x.double_ = 0; 34*58b9f456SAndroid Build Coastguard Worker return *this;} 35*58b9f456SAndroid Build Coastguard Worker 36*58b9f456SAndroid Build Coastguard Worker bool operator==(const Emplaceable& x) const 37*58b9f456SAndroid Build Coastguard Worker {return int_ == x.int_ && double_ == x.double_;} 38*58b9f456SAndroid Build Coastguard Worker bool operator<(const Emplaceable& x) const 39*58b9f456SAndroid Build Coastguard Worker {return int_ < x.int_ || (int_ == x.int_ && double_ < x.double_);} 40*58b9f456SAndroid Build Coastguard Worker get()41*58b9f456SAndroid Build Coastguard Worker int get() const {return int_;} 42*58b9f456SAndroid Build Coastguard Worker }; 43*58b9f456SAndroid Build Coastguard Worker 44*58b9f456SAndroid Build Coastguard Worker namespace std { 45*58b9f456SAndroid Build Coastguard Worker 46*58b9f456SAndroid Build Coastguard Worker template <> 47*58b9f456SAndroid Build Coastguard Worker struct hash<Emplaceable> 48*58b9f456SAndroid Build Coastguard Worker { 49*58b9f456SAndroid Build Coastguard Worker typedef Emplaceable argument_type; 50*58b9f456SAndroid Build Coastguard Worker typedef std::size_t result_type; 51*58b9f456SAndroid Build Coastguard Worker 52*58b9f456SAndroid Build Coastguard Worker std::size_t operator()(const Emplaceable& x) const {return x.get();} 53*58b9f456SAndroid Build Coastguard Worker }; 54*58b9f456SAndroid Build Coastguard Worker 55*58b9f456SAndroid Build Coastguard Worker } 56*58b9f456SAndroid Build Coastguard Worker 57*58b9f456SAndroid Build Coastguard Worker #endif // TEST_STD_VER >= 11 58*58b9f456SAndroid Build Coastguard Worker #endif // EMPLACEABLE_H 59