bloaty/third_party/abseil-cpp/absl/base/invoke_test.cc
Go to the documentation of this file.
1 // Copyright 2017 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "absl/base/internal/invoke.h"
16 
17 #include <functional>
18 #include <memory>
19 #include <string>
20 #include <utility>
21 
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
24 #include "absl/memory/memory.h"
25 #include "absl/strings/str_cat.h"
26 
27 namespace absl {
29 namespace base_internal {
30 namespace {
31 
32 int Function(int a, int b) { return a - b; }
33 
34 int Sink(std::unique_ptr<int> p) {
35  return *p;
36 }
37 
38 std::unique_ptr<int> Factory(int n) {
39  return make_unique<int>(n);
40 }
41 
42 void NoOp() {}
43 
44 struct ConstFunctor {
45  int operator()(int a, int b) const { return a - b; }
46 };
47 
48 struct MutableFunctor {
49  int operator()(int a, int b) { return a - b; }
50 };
51 
52 struct EphemeralFunctor {
53  int operator()(int a, int b) && { return a - b; }
54 };
55 
56 struct OverloadedFunctor {
57  template <typename... Args>
58  std::string operator()(const Args&... args) & {
59  return StrCat("&", args...);
60  }
61  template <typename... Args>
62  std::string operator()(const Args&... args) const& {
63  return StrCat("const&", args...);
64  }
65  template <typename... Args>
66  std::string operator()(const Args&... args) && {
67  return StrCat("&&", args...);
68  }
69 };
70 
71 struct Class {
72  int Method(int a, int b) { return a - b; }
73  int ConstMethod(int a, int b) const { return a - b; }
74  int RefMethod(int a, int b) & { return a - b; }
75  int RefRefMethod(int a, int b) && { return a - b; }
76  int NoExceptMethod(int a, int b) noexcept { return a - b; }
77  int VolatileMethod(int a, int b) volatile { return a - b; }
78 
79  int member;
80 };
81 
82 struct FlipFlop {
83  int ConstMethod() const { return member; }
84  FlipFlop operator*() const { return {-member}; }
85 
86  int member;
87 };
88 
89 // CallMaybeWithArg(f) resolves either to invoke(f) or invoke(f, 42), depending
90 // on which one is valid.
91 template <typename F>
92 decltype(base_internal::invoke(std::declval<const F&>())) CallMaybeWithArg(
93  const F& f) {
94  return base_internal::invoke(f);
95 }
96 
97 template <typename F>
98 decltype(base_internal::invoke(std::declval<const F&>(), 42)) CallMaybeWithArg(
99  const F& f) {
100  return base_internal::invoke(f, 42);
101 }
102 
103 TEST(InvokeTest, Function) {
106 }
107 
108 TEST(InvokeTest, NonCopyableArgument) {
109  EXPECT_EQ(42, base_internal::invoke(Sink, make_unique<int>(42)));
110 }
111 
112 TEST(InvokeTest, NonCopyableResult) {
114 }
115 
116 TEST(InvokeTest, VoidResult) { base_internal::invoke(NoOp); }
117 
118 TEST(InvokeTest, ConstFunctor) {
119  EXPECT_EQ(1, base_internal::invoke(ConstFunctor(), 3, 2));
120 }
121 
122 TEST(InvokeTest, MutableFunctor) {
123  MutableFunctor f;
124  EXPECT_EQ(1, base_internal::invoke(f, 3, 2));
125  EXPECT_EQ(1, base_internal::invoke(MutableFunctor(), 3, 2));
126 }
127 
128 TEST(InvokeTest, EphemeralFunctor) {
129  EphemeralFunctor f;
131  EXPECT_EQ(1, base_internal::invoke(EphemeralFunctor(), 3, 2));
132 }
133 
134 TEST(InvokeTest, OverloadedFunctor) {
135  OverloadedFunctor f;
136  const OverloadedFunctor& cf = f;
137 
139  EXPECT_EQ("& 42", base_internal::invoke(f, " 42"));
140 
141  EXPECT_EQ("const&", base_internal::invoke(cf));
142  EXPECT_EQ("const& 42", base_internal::invoke(cf, " 42"));
143 
145 
146  OverloadedFunctor f2;
147  EXPECT_EQ("&& 42", base_internal::invoke(std::move(f2), " 42"));
148 }
149 
150 TEST(InvokeTest, ReferenceWrapper) {
151  ConstFunctor cf;
152  MutableFunctor mf;
153  EXPECT_EQ(1, base_internal::invoke(std::cref(cf), 3, 2));
156 }
157 
158 TEST(InvokeTest, MemberFunction) {
159  std::unique_ptr<Class> p(new Class);
160  std::unique_ptr<const Class> cp(new Class);
161  std::unique_ptr<volatile Class> vp(new Class);
162 
164  EXPECT_EQ(1, base_internal::invoke(&Class::Method, p.get(), 3, 2));
166  EXPECT_EQ(1, base_internal::invoke(&Class::RefMethod, p, 3, 2));
167  EXPECT_EQ(1, base_internal::invoke(&Class::RefMethod, p.get(), 3, 2));
168  EXPECT_EQ(1, base_internal::invoke(&Class::RefMethod, *p, 3, 2));
169  EXPECT_EQ(1, base_internal::invoke(&Class::RefRefMethod, std::move(*p), 3,
170  2)); // NOLINT
171  EXPECT_EQ(1, base_internal::invoke(&Class::NoExceptMethod, p, 3, 2));
172  EXPECT_EQ(1, base_internal::invoke(&Class::NoExceptMethod, p.get(), 3, 2));
173  EXPECT_EQ(1, base_internal::invoke(&Class::NoExceptMethod, *p, 3, 2));
174 
175  EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, p, 3, 2));
176  EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, p.get(), 3, 2));
177  EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, *p, 3, 2));
178 
179  EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, cp, 3, 2));
180  EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, cp.get(), 3, 2));
181  EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, *cp, 3, 2));
182 
183  EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, p, 3, 2));
184  EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, p.get(), 3, 2));
185  EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, *p, 3, 2));
186  EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, vp, 3, 2));
187  EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, vp.get(), 3, 2));
188  EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, *vp, 3, 2));
189 
190  EXPECT_EQ(1,
191  base_internal::invoke(&Class::Method, make_unique<Class>(), 3, 2));
192  EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, make_unique<Class>(),
193  3, 2));
194  EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod,
195  make_unique<const Class>(), 3, 2));
196 }
197 
198 TEST(InvokeTest, DataMember) {
199  std::unique_ptr<Class> p(new Class{42});
200  std::unique_ptr<const Class> cp(new Class{42});
204 
206  base_internal::invoke(&Class::member, p.get()) = 42;
207 
211 }
212 
213 TEST(InvokeTest, FlipFlop) {
214  FlipFlop obj = {42};
215  // This call could resolve to (obj.*&FlipFlop::ConstMethod)() or
216  // ((*obj).*&FlipFlop::ConstMethod)(). We verify that it's the former.
217  EXPECT_EQ(42, base_internal::invoke(&FlipFlop::ConstMethod, obj));
219 }
220 
221 TEST(InvokeTest, SfinaeFriendly) {
222  CallMaybeWithArg(NoOp);
223  EXPECT_THAT(CallMaybeWithArg(Factory), ::testing::Pointee(42));
224 }
225 
226 } // namespace
227 } // namespace base_internal
229 } // namespace absl
obj
OPENSSL_EXPORT const ASN1_OBJECT * obj
Definition: x509.h:1671
testing::Pointee
internal::PointeeMatcher< InnerMatcher > Pointee(const InnerMatcher &inner_matcher)
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:8691
const
#define const
Definition: bloaty/third_party/zlib/zconf.h:230
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
EXPECT_THAT
#define EXPECT_THAT(value, matcher)
NoOp
Definition: bm_call_create.cc:477
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
xds_manager.p
p
Definition: xds_manager.py:60
ABSL_NAMESPACE_END
#define ABSL_NAMESPACE_END
Definition: third_party/abseil-cpp/absl/base/config.h:171
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
absl::operator*
uint128 operator*(uint128 lhs, uint128 rhs)
Definition: abseil-cpp/absl/numeric/int128.h:977
ABSL_NAMESPACE_BEGIN
#define ABSL_NAMESPACE_BEGIN
Definition: third_party/abseil-cpp/absl/base/config.h:170
autogen_x86imm.f
f
Definition: autogen_x86imm.py:9
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
hpack_encoder_fixtures::Args
Args({0, 16384})
Method
struct Method Method
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:661
ref
unsigned ref
Definition: cxa_demangle.cpp:4909
absl::base_internal::TEST
TEST(ExponentialBiasedTest, CoinTossDemoWithGetSkipCount)
Definition: bloaty/third_party/abseil-cpp/absl/base/internal/exponential_biased_test.cc:117
benchmark::internal::Function
void() Function(State &)
Definition: benchmark/include/benchmark/benchmark.h:826
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
member
int member
Definition: bloaty/third_party/abseil-cpp/absl/base/invoke_test.cc:79
absl
Definition: abseil-cpp/absl/algorithm/algorithm.h:31
xds_manager.f2
f2
Definition: xds_manager.py:85
absl::base_internal::invoke
invoke_result_t< F, Args... > invoke(F &&f, Args &&... args)
Definition: abseil-cpp/absl/base/internal/invoke.h:211


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:08