• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2017 Paul Fultz II
3     is_invocable.cpp
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #include <boost/hof/is_invocable.hpp>
8 #include <ciso646>
9 #include "test.hpp"
10 
11 template<int N>
12 struct callable_rank : callable_rank<N-1>
13 {};
14 
15 template<>
16 struct callable_rank<0>
17 {};
18 
BOOST_HOF_STATIC_TEST_CASE()19 BOOST_HOF_STATIC_TEST_CASE()
20 {
21     struct is_callable_class
22     {
23         void operator()(int) const
24         {
25         }
26     };
27     struct callable_test_param {};
28 
29     void is_callable_function(int)
30     {
31     }
32 
33     struct is_callable_rank_class
34     {
35         void operator()(int, callable_rank<3>) const
36         {
37         }
38 
39         void operator()(int, callable_rank<4>) const
40         {
41         }
42     };
43 
44     static_assert(boost::hof::is_invocable<is_callable_class, int>::value, "Not callable");
45     static_assert(boost::hof::is_invocable<is_callable_class, long>::value, "Not callable");
46     static_assert(boost::hof::is_invocable<is_callable_class, double>::value, "Not callable");
47     static_assert(boost::hof::is_invocable<is_callable_class, const int&>::value, "Not callable");
48     static_assert(boost::hof::is_invocable<is_callable_class, const long&>::value, "Not callable");
49     static_assert(boost::hof::is_invocable<is_callable_class, const double&>::value, "Not callable");
50     static_assert(not boost::hof::is_invocable<is_callable_class, callable_test_param>::value, "callable failed");
51     static_assert(not boost::hof::is_invocable<is_callable_class>::value, "callable failed");
52     static_assert(not boost::hof::is_invocable<is_callable_class, int, int>::value, "callable failed");
53 
54     typedef void (*is_callable_function_pointer)(int);
55     static_assert(boost::hof::is_invocable<is_callable_function_pointer, int>::value, "Not callable");
56     static_assert(boost::hof::is_invocable<is_callable_function_pointer, long>::value, "Not callable");
57     static_assert(boost::hof::is_invocable<is_callable_function_pointer, double>::value, "Not callable");
58     static_assert(boost::hof::is_invocable<is_callable_function_pointer, const int&>::value, "Not callable");
59     static_assert(boost::hof::is_invocable<is_callable_function_pointer, const long&>::value, "Not callable");
60     static_assert(boost::hof::is_invocable<is_callable_function_pointer, const double&>::value, "Not callable");
61     static_assert(not boost::hof::is_invocable<is_callable_function_pointer, callable_test_param>::value, "callable failed");
62     static_assert(not boost::hof::is_invocable<is_callable_function_pointer>::value, "callable failed");
63     static_assert(not boost::hof::is_invocable<is_callable_function_pointer, int, int>::value, "callable failed");
64 
65     static_assert(boost::hof::is_invocable<is_callable_rank_class, int, callable_rank<3>>::value, "Not callable");
66     static_assert(boost::hof::is_invocable<is_callable_rank_class, long, callable_rank<3>>::value, "Not callable");
67     static_assert(boost::hof::is_invocable<is_callable_rank_class, double, callable_rank<3>>::value, "Not callable");
68     static_assert(boost::hof::is_invocable<is_callable_rank_class, const int&, callable_rank<3>>::value, "Not callable");
69     static_assert(boost::hof::is_invocable<is_callable_rank_class, const long&, callable_rank<3>>::value, "Not callable");
70     static_assert(boost::hof::is_invocable<is_callable_rank_class, const double&, callable_rank<3>>::value, "Not callable");
71 
72     static_assert(boost::hof::is_invocable<is_callable_rank_class, int, callable_rank<4>>::value, "Not callable");
73     static_assert(boost::hof::is_invocable<is_callable_rank_class, long, callable_rank<4>>::value, "Not callable");
74     static_assert(boost::hof::is_invocable<is_callable_rank_class, double, callable_rank<4>>::value, "Not callable");
75     static_assert(boost::hof::is_invocable<is_callable_rank_class, const int&, callable_rank<4>>::value, "Not callable");
76     static_assert(boost::hof::is_invocable<is_callable_rank_class, const long&, callable_rank<4>>::value, "Not callable");
77     static_assert(boost::hof::is_invocable<is_callable_rank_class, const double&, callable_rank<4>>::value, "Not callable");
78 
79     static_assert(boost::hof::is_invocable<is_callable_rank_class, int, callable_rank<5>>::value, "Not callable");
80     static_assert(boost::hof::is_invocable<is_callable_rank_class, long, callable_rank<5>>::value, "Not callable");
81     static_assert(boost::hof::is_invocable<is_callable_rank_class, double, callable_rank<5>>::value, "Not callable");
82     static_assert(boost::hof::is_invocable<is_callable_rank_class, const int&, callable_rank<5>>::value, "Not callable");
83     static_assert(boost::hof::is_invocable<is_callable_rank_class, const long&, callable_rank<5>>::value, "Not callable");
84     static_assert(boost::hof::is_invocable<is_callable_rank_class, const double&, callable_rank<5>>::value, "Not callable");
85 
86     static_assert(boost::hof::is_invocable<is_callable_rank_class, int, callable_rank<6>>::value, "Not callable");
87     static_assert(boost::hof::is_invocable<is_callable_rank_class, long, callable_rank<6>>::value, "Not callable");
88     static_assert(boost::hof::is_invocable<is_callable_rank_class, double, callable_rank<6>>::value, "Not callable");
89     static_assert(boost::hof::is_invocable<is_callable_rank_class, const int&, callable_rank<6>>::value, "Not callable");
90     static_assert(boost::hof::is_invocable<is_callable_rank_class, const long&, callable_rank<6>>::value, "Not callable");
91     static_assert(boost::hof::is_invocable<is_callable_rank_class, const double&, callable_rank<6>>::value, "Not callable");
92 
93     static_assert(not boost::hof::is_invocable<is_callable_rank_class, int, callable_rank<1>>::value, "callable failed");
94     static_assert(not boost::hof::is_invocable<is_callable_rank_class, long, callable_rank<1>>::value, "callable failed");
95     static_assert(not boost::hof::is_invocable<is_callable_rank_class, double, callable_rank<1>>::value, "callable failed");
96     static_assert(not boost::hof::is_invocable<is_callable_rank_class, const int&, callable_rank<1>>::value, "callable failed");
97     static_assert(not boost::hof::is_invocable<is_callable_rank_class, const long&, callable_rank<1>>::value, "callable failed");
98     static_assert(not boost::hof::is_invocable<is_callable_rank_class, const double&, callable_rank<1>>::value, "callable failed");
99 
100     static_assert(not boost::hof::is_invocable<is_callable_rank_class, callable_test_param, callable_test_param>::value, "callable failed");
101     static_assert(not boost::hof::is_invocable<is_callable_rank_class, callable_rank<3>, callable_test_param>::value, "callable failed");
102     static_assert(not boost::hof::is_invocable<is_callable_rank_class, callable_rank<4>, callable_test_param>::value, "callable failed");
103     static_assert(not boost::hof::is_invocable<is_callable_rank_class, callable_test_param, callable_rank<3>>::value, "callable failed");
104     static_assert(not boost::hof::is_invocable<is_callable_rank_class, callable_test_param, callable_rank<4>>::value, "callable failed");
105     static_assert(not boost::hof::is_invocable<is_callable_rank_class>::value, "callable failed");
106     static_assert(not boost::hof::is_invocable<is_callable_rank_class, int, int>::value, "callable failed");
107 };
108 
BOOST_HOF_STATIC_TEST_CASE()109 BOOST_HOF_STATIC_TEST_CASE()
110 {
111     typedef int(callable_rank<0>::*fn)(int);
112 
113     static_assert(boost::hof::is_invocable<fn, callable_rank<0>&, int>::value, "Failed");
114     static_assert(boost::hof::is_invocable<fn, callable_rank<1>&, int>::value, "Failed");
115     static_assert(!boost::hof::is_invocable<fn, callable_rank<0>&>::value, "Failed");
116     static_assert(!boost::hof::is_invocable<fn, callable_rank<0> const&, int>::value, "Failed");
117 };
118 
BOOST_HOF_STATIC_TEST_CASE()119 BOOST_HOF_STATIC_TEST_CASE()
120 {
121     typedef int(callable_rank<0>::*fn)(int);
122 
123     typedef callable_rank<0>* T;
124     typedef callable_rank<1>* DT;
125     typedef const callable_rank<0>* CT;
126     typedef std::unique_ptr<callable_rank<0>> ST;
127 
128     static_assert(boost::hof::is_invocable<fn, T&, int>::value, "Failed");
129     static_assert(boost::hof::is_invocable<fn, DT&, int>::value, "Failed");
130     static_assert(boost::hof::is_invocable<fn, const T&, int>::value, "Failed");
131     static_assert(boost::hof::is_invocable<fn, T&&, int>::value, "Failed");
132     static_assert(boost::hof::is_invocable<fn, ST, int>::value, "Failed");
133     static_assert(!boost::hof::is_invocable<fn, CT&, int>::value, "Failed");
134 
135 };
136 
BOOST_HOF_STATIC_TEST_CASE()137 BOOST_HOF_STATIC_TEST_CASE()
138 {
139     typedef int(callable_rank<0>::*fn);
140 
141     static_assert(!boost::hof::is_invocable<fn>::value, "Failed");
142 };
143 
BOOST_HOF_STATIC_TEST_CASE()144 BOOST_HOF_STATIC_TEST_CASE()
145 {
146     typedef int(callable_rank<0>::*fn);
147 
148     static_assert(boost::hof::is_invocable<fn, callable_rank<0>&>::value, "Failed");
149     static_assert(boost::hof::is_invocable<fn, callable_rank<0>&&>::value, "Failed");
150     static_assert(boost::hof::is_invocable<fn, const callable_rank<0>&>::value, "Failed");
151     static_assert(boost::hof::is_invocable<fn, callable_rank<1>&>::value, "Failed");
152 };
153 
BOOST_HOF_STATIC_TEST_CASE()154 BOOST_HOF_STATIC_TEST_CASE()
155 {
156     typedef int(callable_rank<0>::*fn);
157 
158     typedef callable_rank<0>* T;
159     typedef callable_rank<1>* DT;
160     typedef const callable_rank<0>* CT;
161     typedef std::unique_ptr<callable_rank<0>> ST;
162 
163     static_assert(boost::hof::is_invocable<fn, T&>::value, "Failed");
164     static_assert(boost::hof::is_invocable<fn, DT&>::value, "Failed");
165     static_assert(boost::hof::is_invocable<fn, const T&>::value, "Failed");
166     static_assert(boost::hof::is_invocable<fn, T&&>::value, "Failed");
167     static_assert(boost::hof::is_invocable<fn, ST>::value, "Failed");
168     static_assert(boost::hof::is_invocable<fn, CT&>::value, "Failed");
169 
170 };
171 
BOOST_HOF_STATIC_TEST_CASE()172 BOOST_HOF_STATIC_TEST_CASE()
173 {
174     typedef void(*fp)(callable_rank<0>&, int);
175 
176     static_assert(boost::hof::is_invocable<fp, callable_rank<0>&, int>::value, "Failed");
177     static_assert(boost::hof::is_invocable<fp, callable_rank<1>&, int>::value, "Failed");
178     static_assert(!boost::hof::is_invocable<fp, const callable_rank<0>&, int>::value, "Failed");
179     static_assert(!boost::hof::is_invocable<fp>::value, "Failed");
180     static_assert(!boost::hof::is_invocable<fp, callable_rank<0>&>::value, "Failed");
181 };
182 
BOOST_HOF_STATIC_TEST_CASE()183 BOOST_HOF_STATIC_TEST_CASE()
184 {
185     typedef void(&fp)(callable_rank<0>&, int);
186 
187     static_assert(boost::hof::is_invocable<fp, callable_rank<0>&, int>::value, "Failed");
188     static_assert(boost::hof::is_invocable<fp, callable_rank<1>&, int>::value, "Failed");
189     static_assert(!boost::hof::is_invocable<fp, const callable_rank<0>&, int>::value, "Failed");
190     static_assert(!boost::hof::is_invocable<fp>::value, "Failed");
191     static_assert(!boost::hof::is_invocable<fp, callable_rank<0>&>::value, "Failed");
192 };
193