mirror of https://github.com/grpc/grpc.git
This reverts commit d4aed9e615
.
pull/29763/head
parent
2f6277c1fb
commit
9a46171833
19 changed files with 10 additions and 249 deletions
@ -1,76 +0,0 @@ |
||||
// Copyright 2021 gRPC authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#ifndef GRPC_CORE_LIB_GPRPP_CAPTURE_H |
||||
#define GRPC_CORE_LIB_GPRPP_CAPTURE_H |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include <tuple> |
||||
#include <type_traits> |
||||
|
||||
#include "absl/utility/utility.h" |
||||
|
||||
namespace grpc_core { |
||||
|
||||
namespace detail { |
||||
|
||||
template <typename F, typename... Captures> |
||||
class Capture { |
||||
public: |
||||
explicit Capture(F f, Captures... captures) |
||||
: f_(std::move(f)), captures_(std::move(captures)...) {} |
||||
|
||||
template <typename... Args> |
||||
decltype(std::declval<F>()(static_cast<Captures*>(nullptr)..., |
||||
std::declval<Args>()...)) |
||||
operator()(Args... args) { |
||||
auto f = &f_; |
||||
return absl::apply( |
||||
[f, &args...](Captures&... captures) { |
||||
return (*f)(&captures..., std::move(args)...); |
||||
}, |
||||
captures_); |
||||
} |
||||
|
||||
private: |
||||
GPR_NO_UNIQUE_ADDRESS F f_; |
||||
GPR_NO_UNIQUE_ADDRESS std::tuple<Captures...> captures_; |
||||
}; |
||||
|
||||
} // namespace detail
|
||||
|
||||
// C++11 helper - best explained by usage:
|
||||
//
|
||||
// BigThing big_thing;
|
||||
// auto f = Capture(
|
||||
// [](BigThing* c, int a, int b) { /*...*/ },
|
||||
// std::move(big_thing));
|
||||
//
|
||||
// results in: f being a callable that takes arguments (int a, int b), and
|
||||
// captures the original value of big_thing by move. Each call, a pointer to
|
||||
// each captured thing is inserted into the argument list at the beginning so it
|
||||
// can be manipulated.
|
||||
//
|
||||
// Captured values are mutable, and it's the users responsibility to ensure,
|
||||
// should this callable be invoked from different threads, that proper locking
|
||||
// is implemented.
|
||||
template <typename F, typename... Captures> |
||||
detail::Capture<F, Captures...> Capture(F f, Captures... captures) { |
||||
return detail::Capture<F, Captures...>(std::move(f), std::move(captures)...); |
||||
} |
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif // GRPC_CORE_LIB_GPRPP_CAPTURE_H
|
@ -1,39 +0,0 @@ |
||||
// Copyright 2021 gRPC authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "src/core/lib/gprpp/capture.h" |
||||
|
||||
#include <gtest/gtest.h> |
||||
|
||||
namespace grpc_core { |
||||
|
||||
TEST(CaptureTest, Capture) { |
||||
auto f = Capture([](int* p) { EXPECT_EQ(*p, 42); }, 42); |
||||
f(); |
||||
} |
||||
|
||||
TEST(CaptureTest, WithArgsAndReturn) { |
||||
int captured = 1; |
||||
auto f = |
||||
Capture([captured](int* p, int arg) { return (captured + *p) * arg; }, 2); |
||||
EXPECT_EQ(f(2), 6); |
||||
EXPECT_EQ(f(3), 9); |
||||
} |
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
int main(int argc, char** argv) { |
||||
::testing::InitGoogleTest(&argc, argv); |
||||
return RUN_ALL_TESTS(); |
||||
} |
Loading…
Reference in new issue