74 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is dual licensed under the MIT and the University of Illinois Open
 | |
| // Source Licenses. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef TRANSPARENT_H
 | |
| #define TRANSPARENT_H
 | |
| 
 | |
| // testing transparent
 | |
| #if _LIBCPP_STD_VER > 11
 | |
| 
 | |
| struct transparent_less
 | |
| {
 | |
|     template <class T, class U>
 | |
|     constexpr auto operator()(T&& t, U&& u) const
 | |
|     noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
 | |
|     -> decltype      (std::forward<T>(t) < std::forward<U>(u))
 | |
|         { return      std::forward<T>(t) < std::forward<U>(u); }
 | |
|     typedef void is_transparent;  // correct
 | |
| };
 | |
| 
 | |
| struct transparent_less_no_type
 | |
| {
 | |
|     template <class T, class U>
 | |
|     constexpr auto operator()(T&& t, U&& u) const
 | |
|     noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
 | |
|     -> decltype      (std::forward<T>(t) < std::forward<U>(u))
 | |
|         { return      std::forward<T>(t) < std::forward<U>(u); }
 | |
| private:
 | |
| //    typedef void is_transparent;  // error - should exist
 | |
| };
 | |
| 
 | |
| struct transparent_less_private
 | |
| {
 | |
|     template <class T, class U>
 | |
|     constexpr auto operator()(T&& t, U&& u) const
 | |
|     noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
 | |
|     -> decltype      (std::forward<T>(t) < std::forward<U>(u))
 | |
|         { return      std::forward<T>(t) < std::forward<U>(u); }
 | |
| private:
 | |
|     typedef void is_transparent;  // error - should be accessible
 | |
| };
 | |
| 
 | |
| struct transparent_less_not_a_type
 | |
| {
 | |
|     template <class T, class U>
 | |
|     constexpr auto operator()(T&& t, U&& u) const
 | |
|     noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
 | |
|     -> decltype      (std::forward<T>(t) < std::forward<U>(u))
 | |
|         { return      std::forward<T>(t) < std::forward<U>(u); }
 | |
| 
 | |
|     int is_transparent;  // error - should be a type
 | |
| };
 | |
| 
 | |
| struct C2Int { // comparable to int
 | |
|     C2Int() : i_(0) {}
 | |
|     C2Int(int i): i_(i) {}
 | |
|     int get () const { return i_; }
 | |
| private:
 | |
|     int i_;
 | |
|     };
 | |
| 
 | |
| bool operator <(int          rhs,   const C2Int& lhs) { return rhs       < lhs.get(); }
 | |
| bool operator <(const C2Int& rhs,   const C2Int& lhs) { return rhs.get() < lhs.get(); }
 | |
| bool operator <(const C2Int& rhs,            int lhs) { return rhs.get() < lhs; }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif  // TRANSPARENT_H
 |