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