45namespace gmock_generated_actions_test {
61inline short Short(
short n) {
return n; }
69bool ByConstRef(
const std::string& s) {
return s ==
"Hi"; }
78const char*
Binary(
const char* input,
short n) {
return input + n; }
80int SumOf5(
int a,
int b,
int c,
int d,
int e) {
return a + b +
c + d + e; }
84 return a + b +
c + d + e;
88std::string
Concat5(
const char* s1,
const char* s2,
const char* s3,
89 const char* s4,
const char* s5) {
90 return std::string(s1) + s2 + s3 + s4 + s5;
93int SumOf6(
int a,
int b,
int c,
int d,
int e,
int f) {
94 return a + b +
c + d + e + f;
99 return a + b +
c + d + e + f;
103std::string
Concat6(
const char* s1,
const char* s2,
const char* s3,
104 const char* s4,
const char* s5,
const char* s6) {
105 return std::string(s1) + s2 + s3 + s4 + s5 + s6;
108std::string
Concat7(
const char* s1,
const char* s2,
const char* s3,
109 const char* s4,
const char* s5,
const char* s6,
111 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7;
114std::string
Concat8(
const char* s1,
const char* s2,
const char* s3,
115 const char* s4,
const char* s5,
const char* s6,
116 const char* s7,
const char* s8) {
117 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;
120std::string
Concat9(
const char* s1,
const char* s2,
const char* s3,
121 const char* s4,
const char* s5,
const char* s6,
122 const char* s7,
const char* s8,
const char* s9) {
123 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;
126std::string
Concat10(
const char* s1,
const char* s2,
const char* s3,
127 const char* s4,
const char* s5,
const char* s6,
128 const char* s7,
const char* s8,
const char* s9,
130 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
135inline const char*
CharPtr(
const char* s) {
return s; }
140TEST(InvokeArgumentTest, Function0) {
141 Action<int(
int,
int(*)())>
a = InvokeArgument<1>();
146TEST(InvokeArgumentTest, Functor1) {
152TEST(InvokeArgumentTest, Function5) {
153 Action<int(
int(*)(
int,
int,
int,
int,
int))>
a =
154 InvokeArgument<0>(10000, 2000, 300, 40, 5);
159TEST(InvokeArgumentTest, Functor5) {
161 InvokeArgument<0>(10000, 2000, 300, 40, 5);
166TEST(InvokeArgumentTest, Function6) {
167 Action<int(
int(*)(
int,
int,
int,
int,
int,
int))>
a =
168 InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);
173TEST(InvokeArgumentTest, Functor6) {
175 InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);
180TEST(InvokeArgumentTest, Function7) {
181 Action<std::string(std::string(*)(
const char*,
const char*,
const char*,
182 const char*,
const char*,
const char*,
184 a = InvokeArgument<0>(
"1",
"2",
"3",
"4",
"5",
"6",
"7");
189TEST(InvokeArgumentTest, Function8) {
190 Action<std::string(std::string(*)(
const char*,
const char*,
const char*,
191 const char*,
const char*,
const char*,
192 const char*,
const char*))>
193 a = InvokeArgument<0>(
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8");
198TEST(InvokeArgumentTest, Function9) {
199 Action<std::string(std::string(*)(
const char*,
const char*,
const char*,
200 const char*,
const char*,
const char*,
201 const char*,
const char*,
const char*))>
202 a = InvokeArgument<0>(
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9");
207TEST(InvokeArgumentTest, Function10) {
208 Action<std::string(std::string(*)(
209 const char*,
const char*,
const char*,
const char*,
const char*,
210 const char*,
const char*,
const char*,
const char*,
const char*))>
211 a = InvokeArgument<0>(
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"0");
216TEST(InvokeArgumentTest, ByPointerFunction) {
217 Action<
const char*(
const char*(*)(
const char* input,
short n))>
a =
218 InvokeArgument<0>(
static_cast<const char*
>(
"Hi"),
Short(1));
224TEST(InvokeArgumentTest, FunctionWithCStringLiteral) {
225 Action<
const char*(
const char*(*)(
const char* input,
short n))>
a =
226 InvokeArgument<0>(
"Hi",
Short(1));
231TEST(InvokeArgumentTest, ByConstReferenceFunction) {
232 Action<bool(
bool (*function)(
const std::string& s))>
a =
233 InvokeArgument<0>(std::string(
"Hi"));
242TEST(InvokeArgumentTest, ByExplicitConstReferenceFunction) {
243 Action<bool(
bool(*)(
const double&
x))>
a =
249 a = InvokeArgument<0>(
ByRef(
x));
268 EXPECT_EQ(3,
a.Perform(std::make_tuple(&m, &n)));
277 Action<int(
int*,
int*,
char*)>
a =
278 DoAll(SetArgPointee<0>(1),
280 SetArgPointee<2>(
'a'),
291 char a =
'\0', b =
'\0';
292 Action<int(
int*,
int*,
char*,
char*)> action =
293 DoAll(SetArgPointee<0>(1),
295 SetArgPointee<2>(
'a'),
296 SetArgPointee<3>(
'b'),
308 char a =
'\0', b =
'\0',
c =
'\0';
309 Action<int(
int*,
int*,
char*,
char*,
char*)> action =
310 DoAll(SetArgPointee<0>(1),
312 SetArgPointee<2>(
'a'),
313 SetArgPointee<3>(
'b'),
314 SetArgPointee<4>(
'c'),
327 char a =
'\0', b =
'\0',
c =
'\0', d =
'\0';
328 Action<int(
int*,
int*,
char*,
char*,
char*,
char*)> action =
329 DoAll(SetArgPointee<0>(1),
331 SetArgPointee<2>(
'a'),
332 SetArgPointee<3>(
'b'),
333 SetArgPointee<4>(
'c'),
334 SetArgPointee<5>(
'd'),
348 char a =
'\0', b =
'\0',
c =
'\0', d =
'\0', e =
'\0';
349 Action<int(
int*,
int*,
char*,
char*,
char*,
char*,
351 DoAll(SetArgPointee<0>(1),
353 SetArgPointee<2>(
'a'),
354 SetArgPointee<3>(
'b'),
355 SetArgPointee<4>(
'c'),
356 SetArgPointee<5>(
'd'),
357 SetArgPointee<6>(
'e'),
372 char a =
'\0', b =
'\0',
c =
'\0', d =
'\0', e =
'\0', f =
'\0';
373 Action<int(
int*,
int*,
char*,
char*,
char*,
char*,
374 char*,
char*)> action =
375 DoAll(SetArgPointee<0>(1),
377 SetArgPointee<2>(
'a'),
378 SetArgPointee<3>(
'b'),
379 SetArgPointee<4>(
'c'),
380 SetArgPointee<5>(
'd'),
381 SetArgPointee<6>(
'e'),
382 SetArgPointee<7>(
'f'),
398 char a =
'\0', b =
'\0',
c =
'\0', d =
'\0';
399 char e =
'\0', f =
'\0', g =
'\0';
400 Action<int(
int*,
int*,
char*,
char*,
char*,
char*,
401 char*,
char*,
char*)> action =
402 DoAll(SetArgPointee<0>(1),
404 SetArgPointee<2>(
'a'),
405 SetArgPointee<3>(
'b'),
406 SetArgPointee<4>(
'c'),
407 SetArgPointee<5>(
'd'),
408 SetArgPointee<6>(
'e'),
409 SetArgPointee<7>(
'f'),
410 SetArgPointee<8>(
'g'),
413 3, action.
Perform(std::make_tuple(&m, &n, &
a, &b, &
c, &d, &e, &f, &g)));
432# pragma warning(push)
433# pragma warning(disable:4100)
434# pragma warning(disable:4503)
442TEST(ActionMacroTest, WorksWhenNotReferencingArguments) {
443 Action<double()> a1 = Return5();
446 Action<int(
double,
bool)> a2 = Return5();
453TEST(ActionMacroTest, WorksWhenReturningVoid) {
454 Action<void(
int,
int*)> a1 = IncrementArg1();
456 a1.
Perform(std::make_tuple(5, &n));
463 StaticAssertTypeEq<int*, arg2_type>();
464 arg2_type temp = arg2;
468TEST(ActionMacroTest, CanReferenceArgumentType) {
469 Action<void(
int,
bool,
int*)> a1 = IncrementArg2();
471 a1.
Perform(std::make_tuple(5,
false, &n));
478 StaticAssertTypeEq<std::tuple<int, char, int*>, args_type>();
479 args_type args_copy = args;
480 return std::get<0>(args_copy) + std::get<1>(args_copy);
483TEST(ActionMacroTest, CanReferenceArgumentTuple) {
484 Action<int(
int,
char,
int*)> a1 = Sum2();
491int Dummy(
bool flag) {
return flag? 1 : 0; }
494 StaticAssertTypeEq<int(bool), function_type>();
495 function_type* fp = &
Dummy;
499TEST(ActionMacroTest, CanReferenceMockFunctionType) {
500 Action<int(
bool)> a1 = InvokeDummy();
508 StaticAssertTypeEq<int, return_type>();
509 return_type result =
Dummy(
true);
513TEST(ActionMacroTest, CanReferenceMockFunctionReturnType) {
514 Action<int(
bool)> a1 = InvokeDummy2();
520ACTION(ReturnAddrOfConstBoolReferenceArg) {
521 StaticAssertTypeEq<const bool&, arg1_type>();
525TEST(ActionMacroTest, WorksForConstReferenceArg) {
526 Action<
const bool*(int,
const bool&)>
a = ReturnAddrOfConstBoolReferenceArg();
527 const bool b =
false;
528 EXPECT_EQ(&b,
a.Perform(std::tuple<int, const bool&>(0, b)));
533 StaticAssertTypeEq<int&, arg0_type>();
537TEST(ActionMacroTest, WorksForNonConstReferenceArg) {
538 Action<
int*(
int&, bool, int)>
a = ReturnAddrOfIntReferenceArg();
540 EXPECT_EQ(&n,
a.Perform(std::tuple<int&, bool, int>(n,
true, 1)));
544namespace action_test {
548TEST(ActionMacroTest, WorksInNamespace) {
549 Action<int(
int,
int)> a1 = action_test::Sum();
557TEST(ActionMacroTest, WorksForDifferentArgumentNumbers) {
558 Action<int(
int)> a1 = PlusTwo();
561 Action<double(
float,
void*)> a2 = PlusTwo();
569TEST(ActionPMacroTest, DefinesParameterizedAction) {
570 Action<int(
int m,
bool t)> a1 = Plus(9);
582TEST(ActionPMacroTest, CanReferenceArgumentAndParameterTypes) {
583 Action<int(
char m,
bool t)> a1 = TypedPlus(9);
589TEST(ActionPMacroTest, WorksInCompatibleMockFunction) {
590 Action<std::string(
const std::string& s)> a1 = Plus(
"tail");
591 const std::string re =
"re";
592 std::tuple<const std::string> dummy = std::make_tuple(re);
599ACTION(OverloadedAction) {
return arg0 ? arg1 :
"hello"; }
602 return arg0 ? arg1 : default_value;
606 return arg0 ? true_value : false_value;
609TEST(ActionMacroTest, CanDefineOverloadedActions) {
610 typedef Action<
const char*(bool,
const char*)> MyAction;
612 const MyAction a1 = OverloadedAction();
616 const MyAction a2 = OverloadedAction(
"hi");
620 const MyAction a3 = OverloadedAction(
"hi",
"you");
629TEST(ActionPnMacroTest, WorksFor3Parameters) {
630 Action<double(
int m,
bool t)> a1 = Plus(100, 20, 3.4);
633 Action<std::string(
const std::string& s)> a2 = Plus(
"tail",
"-",
">");
634 const std::string re =
"re";
635 std::tuple<const std::string> dummy = std::make_tuple(re);
639ACTION_P4(Plus, p0, p1, p2, p3) {
return arg0 + p0 + p1 + p2 + p3; }
641TEST(ActionPnMacroTest, WorksFor4Parameters) {
642 Action<int(
int)> a1 = Plus(1, 2, 3, 4);
646ACTION_P5(Plus, p0, p1, p2, p3, p4) {
return arg0 + p0 + p1 + p2 + p3 + p4; }
648TEST(ActionPnMacroTest, WorksFor5Parameters) {
649 Action<int(
int)> a1 = Plus(1, 2, 3, 4, 5);
654 return arg0 + p0 + p1 + p2 + p3 + p4 + p5;
657TEST(ActionPnMacroTest, WorksFor6Parameters) {
658 Action<int(
int)> a1 = Plus(1, 2, 3, 4, 5, 6);
663 return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6;
666TEST(ActionPnMacroTest, WorksFor7Parameters) {
667 Action<int(
int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7);
672 return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7;
675TEST(ActionPnMacroTest, WorksFor8Parameters) {
676 Action<int(
int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8);
677 EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8,
678 a1.
Perform(std::make_tuple(10)));
682 return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8;
685TEST(ActionPnMacroTest, WorksFor9Parameters) {
686 Action<int(
int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9);
687 EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9,
688 a1.
Perform(std::make_tuple(10)));
691ACTION_P10(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8, last_param) {
693 last_param_type t9 = last_param;
694 return t0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + t9;
697TEST(ActionPnMacroTest, WorksFor10Parameters) {
698 Action<int(
int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
699 EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10,
700 a1.
Perform(std::make_tuple(10)));
707 std::string prefix_str(prefix);
708 char suffix_char =
static_cast<char>(suffix);
709 return prefix_str + arg0 + suffix_char;
712TEST(ActionPnMacroTest, SimpleTypePromotion) {
713 Action<std::string(
const char*)> no_promo =
714 PadArgument(std::string(
"foo"),
'r');
715 Action<std::string(
const char*)> promo =
716 PadArgument(
"foo",
static_cast<int>(
'r'));
727 std::stringstream ss;
737template <
typename T1,
typename T2>
741ConcatImplActionP3<std::string, T1, T2>
748 return ConcatImpl(
a, b,
c);
753 return ConcatImpl<std::string, T1, T2>(
a, b,
c);
759template <
typename T1,
typename T2>
760ConcatImplActionP3<T1, int, T2>
762 return ConcatImpl(
a, b,
c);
765TEST(ActionPnMacroTest, CanPartiallyRestrictParameterTypes) {
766 Action<
const std::string()> a1 =
Concat(
"Hello",
"1", 2);
779TEST(ActionPnMacroTest, TypesAreCorrect) {
781 DoFooAction a0 = DoFoo();
784 DoFooActionP<int> a1 = DoFoo(1);
788 DoFooActionP2<int, char> a2 = DoFoo(1,
'2');
789 PlusActionP3<int, int, char> a3 = Plus(1, 2,
'3');
790 PlusActionP4<int, int, int, char> a4 = Plus(1, 2, 3,
'4');
791 PlusActionP5<int, int, int, int, char> a5 = Plus(1, 2, 3, 4,
'5');
792 PlusActionP6<int, int, int, int, int, char> a6 = Plus(1, 2, 3, 4, 5,
'6');
793 PlusActionP7<int, int, int, int, int, int, char> a7 =
794 Plus(1, 2, 3, 4, 5, 6,
'7');
795 PlusActionP8<int, int, int, int, int, int, int, char> a8 =
796 Plus(1, 2, 3, 4, 5, 6, 7,
'8');
797 PlusActionP9<int, int, int, int, int, int, int, int, char> a9 =
798 Plus(1, 2, 3, 4, 5, 6, 7, 8,
'9');
799 PlusActionP10<int, int, int, int, int, int, int, int, int, char> a10 =
800 Plus(1, 2, 3, 4, 5, 6, 7, 8, 9,
'0');
822ACTION_P10(Plus10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
823 return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9;
826TEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) {
827 int x = 1,
y = 2,
z = 3;
828 const std::tuple<> empty = std::make_tuple();
833 a = Plus2<const int&, int&>(
x,
y);
836 a = Plus3<int&, const int&, int&>(
x,
y,
z);
839 int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
840 a = Plus10<
const int&,
int&,
const int&,
int&,
const int&,
int&,
const int&,
841 int&,
const int&,
int&>(n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7],
850 int a6,
int a7,
int a8,
int a9,
int a10)
851 :
value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {
858 HAS_1_TEMPLATE_PARAMS(
typename,
T),
859 AND_0_VALUE_PARAMS()) {
863TEST(ActionTemplateTest, WorksWithoutValueParam) {
864 const Action<
int*()>
a = CreateNew<int>();
865 int*
p =
a.Perform(std::make_tuple());
871 HAS_1_TEMPLATE_PARAMS(
typename,
T),
872 AND_1_VALUE_PARAMS(a0)) {
876TEST(ActionTemplateTest, WorksWithValueParams) {
877 const Action<
int*()>
a = CreateNew<int>(42);
878 int*
p =
a.Perform(std::make_tuple());
885 HAS_1_TEMPLATE_PARAMS(
int, k),
886 AND_0_VALUE_PARAMS()) {
887 delete std::get<k>(args);
899TEST(ActionTemplateTest, WorksForIntegralTemplateParams) {
904 a.Perform(std::make_tuple(&n, resetter));
910 HAS_1_TEMPLATE_PARAMS(template <typename Pointee>
class,
912 AND_1_VALUE_PARAMS(pointee)) {
913 return Pointer<pointee_type>(
new pointee_type(pointee));
916TEST(ActionTemplateTest, WorksForTemplateTemplateParameters) {
918 ReturnSmartPointer<std::shared_ptr>(42);
919 std::shared_ptr<int>
p =
a.Perform(std::make_tuple());
924template <
typename T1,
typename T2,
typename T3,
int k4,
bool k5,
925 unsigned int k6,
typename T7,
typename T8,
typename T9>
933 HAS_10_TEMPLATE_PARAMS(
943 template <typename T>
class, T10),
944 AND_1_VALUE_PARAMS(
value)) {
948TEST(ActionTemplateTest, WorksFor10TemplateParameters) {
950 char, unsigned,
int>;
951 const Action<Giant()>
a = ReturnGiant<int, bool, double, 5,
true, 6, char,
952 unsigned, int, std::shared_ptr>(42);
953 Giant giant =
a.Perform(std::make_tuple());
959 HAS_1_TEMPLATE_PARAMS(
typename, Number),
960 AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) {
961 return static_cast<Number
>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10;
964TEST(ActionTemplateTest, WorksFor10ValueParameters) {
965 const Action<int()>
a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
977 HAS_1_TEMPLATE_PARAMS(
typename, Number),
978 AND_2_VALUE_PARAMS(v1, v2)) {
979 return static_cast<Number
>(v1) + v2;
983 HAS_1_TEMPLATE_PARAMS(
typename, Number),
984 AND_3_VALUE_PARAMS(v1, v2, v3)) {
985 return static_cast<Number
>(v1) + v2 + v3;
989 HAS_2_TEMPLATE_PARAMS(
typename, Number,
int, k),
990 AND_4_VALUE_PARAMS(v1, v2, v3, v4)) {
991 return static_cast<Number
>(v1) + v2 + v3 + v4 + k;
994TEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) {
995 const Action<int()> a0 = ReturnSum();
996 const Action<int()> a1 = ReturnSum(1);
997 const Action<int()> a2 = ReturnSum<int>(1, 2);
998 const Action<int()> a3 = ReturnSum<int>(1, 2, 3);
999 const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5);
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
Result Perform(ArgumentTuple args) const
BoolResetter(bool *value)
TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10)
#define ACTION_P9(name,...)
#define ACTION_P5(name,...)
#define ACTION_P8(name,...)
#define ACTION_P7(name,...)
#define ACTION_P3(name,...)
#define ACTION_P6(name,...)
#define ACTION_P10(name,...)
#define ACTION_P2(name,...)
#define ACTION_P4(name,...)
#define ACTION_P(name,...)
#define ACTION_TEMPLATE(name, template_params, value_params)
#define GTEST_INTENTIONAL_CONST_COND_PUSH_()
#define GTEST_INTENTIONAL_CONST_COND_POP_()
#define EXPECT_EQ(val1, val2)
#define EXPECT_DOUBLE_EQ(val1, val2)
#define TEST(test_suite_name, test_name)
#define EXPECT_TRUE(condition)
#define EXPECT_STREQ(s1, s2)
#define EXPECT_FALSE(condition)
std::string Concat8(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6, const char *s7, const char *s8)
std::string Concat6(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6)
bool ReferencesGlobalDouble(const double &x)
int SumOf6(int a, int b, int c, int d, int e, int f)
const char * CharPtr(const char *s)
std::string Concat5(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5)
int SumOf5(int a, int b, int c, int d, int e)
std::string Concat9(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6, const char *s7, const char *s8, const char *s9)
std::string Concat10(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6, const char *s7, const char *s8, const char *s9, const char *s10)
std::string Concat7(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6, const char *s7)
ConcatImplActionP3< std::string, T1, T2 > Concat(const std::string &a, T1 b, T2 c)
const char * Binary(const char *input, short n)
bool ByConstRef(const std::string &s)
inline ::std::reference_wrapper< T > ByRef(T &l_value)
internal::DoAllAction< typename std::decay< Action >::type... > DoAll(Action &&... action)
PolymorphicAction< internal::ReturnVoidAction > Return()
internal::SetArgumentPointeeAction< N, T > SetArgPointee(T value)
constexpr bool StaticAssertTypeEq() noexcept
internal::ReturnAction< R > Return(R value)
std::decay< FunctionImpl >::type Invoke(FunctionImpl &&function_impl)
GiantTemplate(int a_value)
int operator()(int a, int b, int c, int d, int e)
int operator()(int a, int b, int c, int d, int e, int f)