• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef TRANSPARENT_H
11 #define TRANSPARENT_H
12 
13 #include "test_macros.h"
14 
15 // testing transparent
16 #if TEST_STD_VER > 11
17 
18 struct transparent_less
19 {
20     template <class T, class U>
21     constexpr auto operator()(T&& t, U&& u) const
22     noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
23     -> decltype      (std::forward<T>(t) < std::forward<U>(u))
24         { return      std::forward<T>(t) < std::forward<U>(u); }
25     using is_transparent = void;  // correct
26 };
27 
28 struct transparent_less_not_referenceable
29 {
30     template <class T, class U>
31     constexpr auto operator()(T&& t, U&& u) const
32     noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
33     -> decltype      (std::forward<T>(t) < std::forward<U>(u))
34         { return      std::forward<T>(t) < std::forward<U>(u); }
35     using is_transparent = void () const &;  // it's a type; a weird one, but a type
36 };
37 
38 struct transparent_less_no_type
39 {
40     template <class T, class U>
41     constexpr auto operator()(T&& t, U&& u) const
42     noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
43     -> decltype      (std::forward<T>(t) < std::forward<U>(u))
44         { return      std::forward<T>(t) < std::forward<U>(u); }
45 private:
46 //    using is_transparent = void;  // error - should exist
47 };
48 
49 struct transparent_less_private
50 {
51     template <class T, class U>
52     constexpr auto operator()(T&& t, U&& u) const
53     noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
54     -> decltype      (std::forward<T>(t) < std::forward<U>(u))
55         { return      std::forward<T>(t) < std::forward<U>(u); }
56 private:
57     using is_transparent = void;  // error - should be accessible
58 };
59 
60 struct transparent_less_not_a_type
61 {
62     template <class T, class U>
63     constexpr auto operator()(T&& t, U&& u) const
64     noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
65     -> decltype      (std::forward<T>(t) < std::forward<U>(u))
66         { return      std::forward<T>(t) < std::forward<U>(u); }
67 
68     int is_transparent;  // error - should be a type
69 };
70 
71 struct C2Int { // comparable to int
C2IntC2Int72     C2Int() : i_(0) {}
C2IntC2Int73     C2Int(int i): i_(i) {}
getC2Int74     int get () const { return i_; }
75 private:
76     int i_;
77     };
78 
79 bool operator <(int          rhs,   const C2Int& lhs) { return rhs       < lhs.get(); }
80 bool operator <(const C2Int& rhs,   const C2Int& lhs) { return rhs.get() < lhs.get(); }
81 bool operator <(const C2Int& rhs,            int lhs) { return rhs.get() < lhs; }
82 
83 #endif
84 
85 #endif  // TRANSPARENT_H
86