Skip to content

Commit 10cb35e

Browse files
Abseil Teammbxx
authored andcommitted
Export of internal Abseil changes
-- b548087c24ae7c2c709e8040a118b5e312d18e2e by Derek Mauro <[email protected]>: Remove the static initialization of global variables used by absl::Mutex as requested by Chromium PiperOrigin-RevId: 317676541 -- f198f5da1e966772efa978ba019bd23576899794 by Greg Miller <[email protected]>: fix: work around gcc-4.8 bug in disjunction See https://godbolt.org/z/i7-AmM for a repro of the bug. I realize that Abseil no longer supports gcc 4.8 officially (https://abseil.io/docs/cpp/platforms/platforms), but Cloud C++ still supports gcc 4.8 officially, and so it would be nice to get this simple fix in. fixes #718 PiperOrigin-RevId: 317484459 -- ed233f646530c6c0948213b643cc6919db1bee90 by Chris Kennelly <[email protected]>: Avoid determining the size of the duration unit at runtime. PiperOrigin-RevId: 317376300 -- 73d4011c17fcf747a990176924a7adc69d443533 by Greg Falcon <[email protected]>: Change spelling of internal detail from `Invoke`/`InvokeT` to `invoke`/`invoke_result_t`. This matches the spelling of the C++17 standard library names that perform the same operations. PiperOrigin-RevId: 317311527 GitOrigin-RevId: b548087c24ae7c2c709e8040a118b5e312d18e2e Change-Id: I131809ff0b92cfdb0d96dc94e94d9c6f751cb0ac
1 parent 4ccc0fc commit 10cb35e

File tree

12 files changed

+137
-138
lines changed

12 files changed

+137
-138
lines changed

absl/base/call_once.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ void CallOnceImpl(std::atomic<uint32_t>* control,
175175
std::memory_order_relaxed) ||
176176
base_internal::SpinLockWait(control, ABSL_ARRAYSIZE(trans), trans,
177177
scheduling_mode) == kOnceInit) {
178-
base_internal::Invoke(std::forward<Callable>(fn),
178+
base_internal::invoke(std::forward<Callable>(fn),
179179
std::forward<Args>(args)...);
180180
// The call to SpinLockWake below is an optimization, because the waiter
181181
// in SpinLockWait is waiting with a short timeout. The atomic load/store

absl/base/internal/invoke.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414
//
15-
// absl::base_internal::Invoke(f, args...) is an implementation of
15+
// absl::base_internal::invoke(f, args...) is an implementation of
1616
// INVOKE(f, args...) from section [func.require] of the C++ standard.
1717
//
1818
// [func.require]
@@ -29,7 +29,7 @@
2929
// is not one of the types described in the previous item;
3030
// 5. f(t1, t2, ..., tN) in all other cases.
3131
//
32-
// The implementation is SFINAE-friendly: substitution failure within Invoke()
32+
// The implementation is SFINAE-friendly: substitution failure within invoke()
3333
// isn't an error.
3434

3535
#ifndef ABSL_BASE_INTERNAL_INVOKE_H_
@@ -170,13 +170,13 @@ struct Invoker {
170170

171171
// The result type of Invoke<F, Args...>.
172172
template <typename F, typename... Args>
173-
using InvokeT = decltype(Invoker<F, Args...>::type::Invoke(
173+
using invoke_result_t = decltype(Invoker<F, Args...>::type::Invoke(
174174
std::declval<F>(), std::declval<Args>()...));
175175

176176
// Invoke(f, args...) is an implementation of INVOKE(f, args...) from section
177177
// [func.require] of the C++ standard.
178178
template <typename F, typename... Args>
179-
InvokeT<F, Args...> Invoke(F&& f, Args&&... args) {
179+
invoke_result_t<F, Args...> invoke(F&& f, Args&&... args) {
180180
return Invoker<F, Args...>::type::Invoke(std::forward<F>(f),
181181
std::forward<Args>(args)...);
182182
}

absl/base/invoke_test.cc

Lines changed: 71 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -86,130 +86,136 @@ struct FlipFlop {
8686
int member;
8787
};
8888

89-
// CallMaybeWithArg(f) resolves either to Invoke(f) or Invoke(f, 42), depending
89+
// CallMaybeWithArg(f) resolves either to invoke(f) or invoke(f, 42), depending
9090
// on which one is valid.
9191
template <typename F>
92-
decltype(Invoke(std::declval<const F&>())) CallMaybeWithArg(const F& f) {
93-
return Invoke(f);
92+
decltype(base_internal::invoke(std::declval<const F&>())) CallMaybeWithArg(
93+
const F& f) {
94+
return base_internal::invoke(f);
9495
}
9596

9697
template <typename F>
97-
decltype(Invoke(std::declval<const F&>(), 42)) CallMaybeWithArg(const F& f) {
98-
return Invoke(f, 42);
98+
decltype(base_internal::invoke(std::declval<const F&>(), 42)) CallMaybeWithArg(
99+
const F& f) {
100+
return base_internal::invoke(f, 42);
99101
}
100102

101103
TEST(InvokeTest, Function) {
102-
EXPECT_EQ(1, Invoke(Function, 3, 2));
103-
EXPECT_EQ(1, Invoke(&Function, 3, 2));
104+
EXPECT_EQ(1, base_internal::invoke(Function, 3, 2));
105+
EXPECT_EQ(1, base_internal::invoke(&Function, 3, 2));
104106
}
105107

106108
TEST(InvokeTest, NonCopyableArgument) {
107-
EXPECT_EQ(42, Invoke(Sink, make_unique<int>(42)));
109+
EXPECT_EQ(42, base_internal::invoke(Sink, make_unique<int>(42)));
108110
}
109111

110112
TEST(InvokeTest, NonCopyableResult) {
111-
EXPECT_THAT(Invoke(Factory, 42), ::testing::Pointee(42));
113+
EXPECT_THAT(base_internal::invoke(Factory, 42), ::testing::Pointee(42));
112114
}
113115

114-
TEST(InvokeTest, VoidResult) {
115-
Invoke(NoOp);
116-
}
116+
TEST(InvokeTest, VoidResult) { base_internal::invoke(NoOp); }
117117

118118
TEST(InvokeTest, ConstFunctor) {
119-
EXPECT_EQ(1, Invoke(ConstFunctor(), 3, 2));
119+
EXPECT_EQ(1, base_internal::invoke(ConstFunctor(), 3, 2));
120120
}
121121

122122
TEST(InvokeTest, MutableFunctor) {
123123
MutableFunctor f;
124-
EXPECT_EQ(1, Invoke(f, 3, 2));
125-
EXPECT_EQ(1, Invoke(MutableFunctor(), 3, 2));
124+
EXPECT_EQ(1, base_internal::invoke(f, 3, 2));
125+
EXPECT_EQ(1, base_internal::invoke(MutableFunctor(), 3, 2));
126126
}
127127

128128
TEST(InvokeTest, EphemeralFunctor) {
129129
EphemeralFunctor f;
130-
EXPECT_EQ(1, Invoke(std::move(f), 3, 2));
131-
EXPECT_EQ(1, Invoke(EphemeralFunctor(), 3, 2));
130+
EXPECT_EQ(1, base_internal::invoke(std::move(f), 3, 2));
131+
EXPECT_EQ(1, base_internal::invoke(EphemeralFunctor(), 3, 2));
132132
}
133133

134134
TEST(InvokeTest, OverloadedFunctor) {
135135
OverloadedFunctor f;
136136
const OverloadedFunctor& cf = f;
137137

138-
EXPECT_EQ("&", Invoke(f));
139-
EXPECT_EQ("& 42", Invoke(f, " 42"));
138+
EXPECT_EQ("&", base_internal::invoke(f));
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"));
140143

141-
EXPECT_EQ("const&", Invoke(cf));
142-
EXPECT_EQ("const& 42", Invoke(cf, " 42"));
144+
EXPECT_EQ("&&", base_internal::invoke(std::move(f)));
143145

144-
EXPECT_EQ("&&", Invoke(std::move(f)));
145-
EXPECT_EQ("&& 42", Invoke(std::move(f), " 42"));
146+
OverloadedFunctor f2;
147+
EXPECT_EQ("&& 42", base_internal::invoke(std::move(f2), " 42"));
146148
}
147149

148150
TEST(InvokeTest, ReferenceWrapper) {
149151
ConstFunctor cf;
150152
MutableFunctor mf;
151-
EXPECT_EQ(1, Invoke(std::cref(cf), 3, 2));
152-
EXPECT_EQ(1, Invoke(std::ref(cf), 3, 2));
153-
EXPECT_EQ(1, Invoke(std::ref(mf), 3, 2));
153+
EXPECT_EQ(1, base_internal::invoke(std::cref(cf), 3, 2));
154+
EXPECT_EQ(1, base_internal::invoke(std::ref(cf), 3, 2));
155+
EXPECT_EQ(1, base_internal::invoke(std::ref(mf), 3, 2));
154156
}
155157

156158
TEST(InvokeTest, MemberFunction) {
157159
std::unique_ptr<Class> p(new Class);
158160
std::unique_ptr<const Class> cp(new Class);
159161
std::unique_ptr<volatile Class> vp(new Class);
160162

161-
EXPECT_EQ(1, Invoke(&Class::Method, p, 3, 2));
162-
EXPECT_EQ(1, Invoke(&Class::Method, p.get(), 3, 2));
163-
EXPECT_EQ(1, Invoke(&Class::Method, *p, 3, 2));
164-
EXPECT_EQ(1, Invoke(&Class::RefMethod, p, 3, 2));
165-
EXPECT_EQ(1, Invoke(&Class::RefMethod, p.get(), 3, 2));
166-
EXPECT_EQ(1, Invoke(&Class::RefMethod, *p, 3, 2));
167-
EXPECT_EQ(1, Invoke(&Class::RefRefMethod, std::move(*p), 3, 2)); // NOLINT
168-
EXPECT_EQ(1, Invoke(&Class::NoExceptMethod, p, 3, 2));
169-
EXPECT_EQ(1, Invoke(&Class::NoExceptMethod, p.get(), 3, 2));
170-
EXPECT_EQ(1, Invoke(&Class::NoExceptMethod, *p, 3, 2));
171-
172-
EXPECT_EQ(1, Invoke(&Class::ConstMethod, p, 3, 2));
173-
EXPECT_EQ(1, Invoke(&Class::ConstMethod, p.get(), 3, 2));
174-
EXPECT_EQ(1, Invoke(&Class::ConstMethod, *p, 3, 2));
175-
176-
EXPECT_EQ(1, Invoke(&Class::ConstMethod, cp, 3, 2));
177-
EXPECT_EQ(1, Invoke(&Class::ConstMethod, cp.get(), 3, 2));
178-
EXPECT_EQ(1, Invoke(&Class::ConstMethod, *cp, 3, 2));
179-
180-
EXPECT_EQ(1, Invoke(&Class::VolatileMethod, p, 3, 2));
181-
EXPECT_EQ(1, Invoke(&Class::VolatileMethod, p.get(), 3, 2));
182-
EXPECT_EQ(1, Invoke(&Class::VolatileMethod, *p, 3, 2));
183-
EXPECT_EQ(1, Invoke(&Class::VolatileMethod, vp, 3, 2));
184-
EXPECT_EQ(1, Invoke(&Class::VolatileMethod, vp.get(), 3, 2));
185-
EXPECT_EQ(1, Invoke(&Class::VolatileMethod, *vp, 3, 2));
186-
187-
EXPECT_EQ(1, Invoke(&Class::Method, make_unique<Class>(), 3, 2));
188-
EXPECT_EQ(1, Invoke(&Class::ConstMethod, make_unique<Class>(), 3, 2));
189-
EXPECT_EQ(1, Invoke(&Class::ConstMethod, make_unique<const Class>(), 3, 2));
163+
EXPECT_EQ(1, base_internal::invoke(&Class::Method, p, 3, 2));
164+
EXPECT_EQ(1, base_internal::invoke(&Class::Method, p.get(), 3, 2));
165+
EXPECT_EQ(1, base_internal::invoke(&Class::Method, *p, 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));
190196
}
191197

192198
TEST(InvokeTest, DataMember) {
193199
std::unique_ptr<Class> p(new Class{42});
194200
std::unique_ptr<const Class> cp(new Class{42});
195-
EXPECT_EQ(42, Invoke(&Class::member, p));
196-
EXPECT_EQ(42, Invoke(&Class::member, *p));
197-
EXPECT_EQ(42, Invoke(&Class::member, p.get()));
201+
EXPECT_EQ(42, base_internal::invoke(&Class::member, p));
202+
EXPECT_EQ(42, base_internal::invoke(&Class::member, *p));
203+
EXPECT_EQ(42, base_internal::invoke(&Class::member, p.get()));
198204

199-
Invoke(&Class::member, p) = 42;
200-
Invoke(&Class::member, p.get()) = 42;
205+
base_internal::invoke(&Class::member, p) = 42;
206+
base_internal::invoke(&Class::member, p.get()) = 42;
201207

202-
EXPECT_EQ(42, Invoke(&Class::member, cp));
203-
EXPECT_EQ(42, Invoke(&Class::member, *cp));
204-
EXPECT_EQ(42, Invoke(&Class::member, cp.get()));
208+
EXPECT_EQ(42, base_internal::invoke(&Class::member, cp));
209+
EXPECT_EQ(42, base_internal::invoke(&Class::member, *cp));
210+
EXPECT_EQ(42, base_internal::invoke(&Class::member, cp.get()));
205211
}
206212

207213
TEST(InvokeTest, FlipFlop) {
208214
FlipFlop obj = {42};
209215
// This call could resolve to (obj.*&FlipFlop::ConstMethod)() or
210216
// ((*obj).*&FlipFlop::ConstMethod)(). We verify that it's the former.
211-
EXPECT_EQ(42, Invoke(&FlipFlop::ConstMethod, obj));
212-
EXPECT_EQ(42, Invoke(&FlipFlop::member, obj));
217+
EXPECT_EQ(42, base_internal::invoke(&FlipFlop::ConstMethod, obj));
218+
EXPECT_EQ(42, base_internal::invoke(&FlipFlop::member, obj));
213219
}
214220

215221
TEST(InvokeTest, SfinaeFriendly) {

absl/functional/function_ref.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class FunctionRef<R(Args...)> {
9090
// Used to disable constructors for objects that are not compatible with the
9191
// signature of this FunctionRef.
9292
template <typename F,
93-
typename FR = absl::base_internal::InvokeT<F, Args&&...>>
93+
typename FR = absl::base_internal::invoke_result_t<F, Args&&...>>
9494
using EnableIfCompatible =
9595
typename std::enable_if<std::is_void<R>::value ||
9696
std::is_convertible<FR, R>::value>::type;

absl/functional/internal/front_binder.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ namespace functional_internal {
3333
// Invoke the method, expanding the tuple of bound arguments.
3434
template <class R, class Tuple, size_t... Idx, class... Args>
3535
R Apply(Tuple&& bound, absl::index_sequence<Idx...>, Args&&... free) {
36-
return base_internal::Invoke(
36+
return base_internal::invoke(
3737
absl::forward<Tuple>(bound).template get<Idx>()...,
3838
absl::forward<Args>(free)...);
3939
}
@@ -50,22 +50,22 @@ class FrontBinder {
5050
constexpr explicit FrontBinder(absl::in_place_t, Ts&&... ts)
5151
: bound_args_(absl::forward<Ts>(ts)...) {}
5252

53-
template <class... FreeArgs,
54-
class R = base_internal::InvokeT<F&, BoundArgs&..., FreeArgs&&...>>
53+
template <class... FreeArgs, class R = base_internal::invoke_result_t<
54+
F&, BoundArgs&..., FreeArgs&&...>>
5555
R operator()(FreeArgs&&... free_args) & {
5656
return functional_internal::Apply<R>(bound_args_, Idx(),
5757
absl::forward<FreeArgs>(free_args)...);
5858
}
5959

6060
template <class... FreeArgs,
61-
class R = base_internal::InvokeT<const F&, const BoundArgs&...,
62-
FreeArgs&&...>>
61+
class R = base_internal::invoke_result_t<
62+
const F&, const BoundArgs&..., FreeArgs&&...>>
6363
R operator()(FreeArgs&&... free_args) const& {
6464
return functional_internal::Apply<R>(bound_args_, Idx(),
6565
absl::forward<FreeArgs>(free_args)...);
6666
}
6767

68-
template <class... FreeArgs, class R = base_internal::InvokeT<
68+
template <class... FreeArgs, class R = base_internal::invoke_result_t<
6969
F&&, BoundArgs&&..., FreeArgs&&...>>
7070
R operator()(FreeArgs&&... free_args) && {
7171
// This overload is called when *this is an rvalue. If some of the bound
@@ -75,8 +75,8 @@ class FrontBinder {
7575
}
7676

7777
template <class... FreeArgs,
78-
class R = base_internal::InvokeT<const F&&, const BoundArgs&&...,
79-
FreeArgs&&...>>
78+
class R = base_internal::invoke_result_t<
79+
const F&&, const BoundArgs&&..., FreeArgs&&...>>
8080
R operator()(FreeArgs&&... free_args) const&& {
8181
// This overload is called when *this is an rvalue. If some of the bound
8282
// arguments are stored by value or rvalue reference, we move them.

absl/functional/internal/function_ref.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@ template <typename Obj, typename R, typename... Args>
7171
R InvokeObject(VoidPtr ptr, typename ForwardT<Args>::type... args) {
7272
auto o = static_cast<const Obj*>(ptr.obj);
7373
return static_cast<R>(
74-
absl::base_internal::Invoke(*o, std::forward<Args>(args)...));
74+
absl::base_internal::invoke(*o, std::forward<Args>(args)...));
7575
}
7676

7777
template <typename Fun, typename R, typename... Args>
7878
R InvokeFunction(VoidPtr ptr, typename ForwardT<Args>::type... args) {
7979
auto f = reinterpret_cast<Fun>(ptr.fun);
8080
return static_cast<R>(
81-
absl::base_internal::Invoke(f, std::forward<Args>(args)...));
81+
absl::base_internal::invoke(f, std::forward<Args>(args)...));
8282
}
8383

8484
template <typename Sig>

absl/meta/type_traits.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ using void_t = typename type_traits_internal::VoidTImpl<Ts...>::type;
219219
// This metafunction is designed to be a drop-in replacement for the C++17
220220
// `std::conjunction` metafunction.
221221
template <typename... Ts>
222-
struct conjunction;
222+
struct conjunction : std::true_type {};
223223

224224
template <typename T, typename... Ts>
225225
struct conjunction<T, Ts...>
@@ -228,9 +228,6 @@ struct conjunction<T, Ts...>
228228
template <typename T>
229229
struct conjunction<T> : T {};
230230

231-
template <>
232-
struct conjunction<> : std::true_type {};
233-
234231
// disjunction
235232
//
236233
// Performs a compile-time logical OR operation on the passed types (which
@@ -241,7 +238,7 @@ struct conjunction<> : std::true_type {};
241238
// This metafunction is designed to be a drop-in replacement for the C++17
242239
// `std::disjunction` metafunction.
243240
template <typename... Ts>
244-
struct disjunction;
241+
struct disjunction : std::false_type {};
245242

246243
template <typename T, typename... Ts>
247244
struct disjunction<T, Ts...> :
@@ -250,9 +247,6 @@ struct disjunction<T, Ts...> :
250247
template <typename T>
251248
struct disjunction<T> : T {};
252249

253-
template <>
254-
struct disjunction<> : std::false_type {};
255-
256250
// negation
257251
//
258252
// Performs a compile-time logical NOT operation on the passed type (which

absl/strings/cord.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -857,16 +857,16 @@ ExternalRepReleaserPair NewExternalWithUninitializedReleaser(
857857
struct Rank1 {};
858858
struct Rank0 : Rank1 {};
859859

860-
template <typename Releaser, typename = ::absl::base_internal::InvokeT<
860+
template <typename Releaser, typename = ::absl::base_internal::invoke_result_t<
861861
Releaser, absl::string_view>>
862862
void InvokeReleaser(Rank0, Releaser&& releaser, absl::string_view data) {
863-
::absl::base_internal::Invoke(std::forward<Releaser>(releaser), data);
863+
::absl::base_internal::invoke(std::forward<Releaser>(releaser), data);
864864
}
865865

866866
template <typename Releaser,
867-
typename = ::absl::base_internal::InvokeT<Releaser>>
867+
typename = ::absl::base_internal::invoke_result_t<Releaser>>
868868
void InvokeReleaser(Rank1, Releaser&& releaser, absl::string_view) {
869-
::absl::base_internal::Invoke(std::forward<Releaser>(releaser));
869+
::absl::base_internal::invoke(std::forward<Releaser>(releaser));
870870
}
871871

872872
// Creates a new `CordRep` that owns `data` and `releaser` and returns a pointer

0 commit comments

Comments
 (0)