1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors. 2*9356374aSAndroid Build Coastguard Worker // 3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*9356374aSAndroid Build Coastguard Worker // 7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*9356374aSAndroid Build Coastguard Worker // 9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*9356374aSAndroid Build Coastguard Worker // limitations under the License. 14*9356374aSAndroid Build Coastguard Worker // 15*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 16*9356374aSAndroid Build Coastguard Worker // File: bind_front.h 17*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 18*9356374aSAndroid Build Coastguard Worker // 19*9356374aSAndroid Build Coastguard Worker // `absl::bind_front()` returns a functor by binding a number of arguments to 20*9356374aSAndroid Build Coastguard Worker // the front of a provided (usually more generic) functor. Unlike `std::bind`, 21*9356374aSAndroid Build Coastguard Worker // it does not require the use of argument placeholders. The simpler syntax of 22*9356374aSAndroid Build Coastguard Worker // `absl::bind_front()` allows you to avoid known misuses with `std::bind()`. 23*9356374aSAndroid Build Coastguard Worker // 24*9356374aSAndroid Build Coastguard Worker // `absl::bind_front()` is meant as a drop-in replacement for C++20's upcoming 25*9356374aSAndroid Build Coastguard Worker // `std::bind_front()`, which similarly resolves these issues with 26*9356374aSAndroid Build Coastguard Worker // `std::bind()`. Both `bind_front()` alternatives, unlike `std::bind()`, allow 27*9356374aSAndroid Build Coastguard Worker // partial function application. (See 28*9356374aSAndroid Build Coastguard Worker // https://en.wikipedia.org/wiki/Partial_application). 29*9356374aSAndroid Build Coastguard Worker 30*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_FUNCTIONAL_BIND_FRONT_H_ 31*9356374aSAndroid Build Coastguard Worker #define ABSL_FUNCTIONAL_BIND_FRONT_H_ 32*9356374aSAndroid Build Coastguard Worker 33*9356374aSAndroid Build Coastguard Worker #if defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L 34*9356374aSAndroid Build Coastguard Worker #include <functional> // For std::bind_front. 35*9356374aSAndroid Build Coastguard Worker #endif // defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L 36*9356374aSAndroid Build Coastguard Worker 37*9356374aSAndroid Build Coastguard Worker #include <utility> 38*9356374aSAndroid Build Coastguard Worker 39*9356374aSAndroid Build Coastguard Worker #include "absl/functional/internal/front_binder.h" 40*9356374aSAndroid Build Coastguard Worker #include "absl/utility/utility.h" 41*9356374aSAndroid Build Coastguard Worker 42*9356374aSAndroid Build Coastguard Worker namespace absl { 43*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN 44*9356374aSAndroid Build Coastguard Worker 45*9356374aSAndroid Build Coastguard Worker // bind_front() 46*9356374aSAndroid Build Coastguard Worker // 47*9356374aSAndroid Build Coastguard Worker // Binds the first N arguments of an invocable object and stores them by value. 48*9356374aSAndroid Build Coastguard Worker // 49*9356374aSAndroid Build Coastguard Worker // Like `std::bind()`, `absl::bind_front()` is implicitly convertible to 50*9356374aSAndroid Build Coastguard Worker // `std::function`. In particular, it may be used as a simpler replacement for 51*9356374aSAndroid Build Coastguard Worker // `std::bind()` in most cases, as it does not require placeholders to be 52*9356374aSAndroid Build Coastguard Worker // specified. More importantly, it provides more reliable correctness guarantees 53*9356374aSAndroid Build Coastguard Worker // than `std::bind()`; while `std::bind()` will silently ignore passing more 54*9356374aSAndroid Build Coastguard Worker // parameters than expected, for example, `absl::bind_front()` will report such 55*9356374aSAndroid Build Coastguard Worker // mis-uses as errors. In C++20, `absl::bind_front` is replaced by 56*9356374aSAndroid Build Coastguard Worker // `std::bind_front`. 57*9356374aSAndroid Build Coastguard Worker // 58*9356374aSAndroid Build Coastguard Worker // absl::bind_front(a...) can be seen as storing the results of 59*9356374aSAndroid Build Coastguard Worker // std::make_tuple(a...). 60*9356374aSAndroid Build Coastguard Worker // 61*9356374aSAndroid Build Coastguard Worker // Example: Binding a free function. 62*9356374aSAndroid Build Coastguard Worker // 63*9356374aSAndroid Build Coastguard Worker // int Minus(int a, int b) { return a - b; } 64*9356374aSAndroid Build Coastguard Worker // 65*9356374aSAndroid Build Coastguard Worker // assert(absl::bind_front(Minus)(3, 2) == 3 - 2); 66*9356374aSAndroid Build Coastguard Worker // assert(absl::bind_front(Minus, 3)(2) == 3 - 2); 67*9356374aSAndroid Build Coastguard Worker // assert(absl::bind_front(Minus, 3, 2)() == 3 - 2); 68*9356374aSAndroid Build Coastguard Worker // 69*9356374aSAndroid Build Coastguard Worker // Example: Binding a member function. 70*9356374aSAndroid Build Coastguard Worker // 71*9356374aSAndroid Build Coastguard Worker // struct Math { 72*9356374aSAndroid Build Coastguard Worker // int Double(int a) const { return 2 * a; } 73*9356374aSAndroid Build Coastguard Worker // }; 74*9356374aSAndroid Build Coastguard Worker // 75*9356374aSAndroid Build Coastguard Worker // Math math; 76*9356374aSAndroid Build Coastguard Worker // 77*9356374aSAndroid Build Coastguard Worker // assert(absl::bind_front(&Math::Double)(&math, 3) == 2 * 3); 78*9356374aSAndroid Build Coastguard Worker // // Stores a pointer to math inside the functor. 79*9356374aSAndroid Build Coastguard Worker // assert(absl::bind_front(&Math::Double, &math)(3) == 2 * 3); 80*9356374aSAndroid Build Coastguard Worker // // Stores a copy of math inside the functor. 81*9356374aSAndroid Build Coastguard Worker // assert(absl::bind_front(&Math::Double, math)(3) == 2 * 3); 82*9356374aSAndroid Build Coastguard Worker // // Stores std::unique_ptr<Math> inside the functor. 83*9356374aSAndroid Build Coastguard Worker // assert(absl::bind_front(&Math::Double, 84*9356374aSAndroid Build Coastguard Worker // std::unique_ptr<Math>(new Math))(3) == 2 * 3); 85*9356374aSAndroid Build Coastguard Worker // 86*9356374aSAndroid Build Coastguard Worker // Example: Using `absl::bind_front()`, instead of `std::bind()`, with 87*9356374aSAndroid Build Coastguard Worker // `std::function`. 88*9356374aSAndroid Build Coastguard Worker // 89*9356374aSAndroid Build Coastguard Worker // class FileReader { 90*9356374aSAndroid Build Coastguard Worker // public: 91*9356374aSAndroid Build Coastguard Worker // void ReadFileAsync(const std::string& filename, std::string* content, 92*9356374aSAndroid Build Coastguard Worker // const std::function<void()>& done) { 93*9356374aSAndroid Build Coastguard Worker // // Calls Executor::Schedule(std::function<void()>). 94*9356374aSAndroid Build Coastguard Worker // Executor::DefaultExecutor()->Schedule( 95*9356374aSAndroid Build Coastguard Worker // absl::bind_front(&FileReader::BlockingRead, this, 96*9356374aSAndroid Build Coastguard Worker // filename, content, done)); 97*9356374aSAndroid Build Coastguard Worker // } 98*9356374aSAndroid Build Coastguard Worker // 99*9356374aSAndroid Build Coastguard Worker // private: 100*9356374aSAndroid Build Coastguard Worker // void BlockingRead(const std::string& filename, std::string* content, 101*9356374aSAndroid Build Coastguard Worker // const std::function<void()>& done) { 102*9356374aSAndroid Build Coastguard Worker // CHECK_OK(file::GetContents(filename, content, {})); 103*9356374aSAndroid Build Coastguard Worker // done(); 104*9356374aSAndroid Build Coastguard Worker // } 105*9356374aSAndroid Build Coastguard Worker // }; 106*9356374aSAndroid Build Coastguard Worker // 107*9356374aSAndroid Build Coastguard Worker // `absl::bind_front()` stores bound arguments explicitly using the type passed 108*9356374aSAndroid Build Coastguard Worker // rather than implicitly based on the type accepted by its functor. 109*9356374aSAndroid Build Coastguard Worker // 110*9356374aSAndroid Build Coastguard Worker // Example: Binding arguments explicitly. 111*9356374aSAndroid Build Coastguard Worker // 112*9356374aSAndroid Build Coastguard Worker // void LogStringView(absl::string_view sv) { 113*9356374aSAndroid Build Coastguard Worker // LOG(INFO) << sv; 114*9356374aSAndroid Build Coastguard Worker // } 115*9356374aSAndroid Build Coastguard Worker // 116*9356374aSAndroid Build Coastguard Worker // Executor* e = Executor::DefaultExecutor(); 117*9356374aSAndroid Build Coastguard Worker // std::string s = "hello"; 118*9356374aSAndroid Build Coastguard Worker // absl::string_view sv = s; 119*9356374aSAndroid Build Coastguard Worker // 120*9356374aSAndroid Build Coastguard Worker // // absl::bind_front(LogStringView, arg) makes a copy of arg and stores it. 121*9356374aSAndroid Build Coastguard Worker // e->Schedule(absl::bind_front(LogStringView, sv)); // ERROR: dangling 122*9356374aSAndroid Build Coastguard Worker // // string_view. 123*9356374aSAndroid Build Coastguard Worker // 124*9356374aSAndroid Build Coastguard Worker // e->Schedule(absl::bind_front(LogStringView, s)); // OK: stores a copy of 125*9356374aSAndroid Build Coastguard Worker // // s. 126*9356374aSAndroid Build Coastguard Worker // 127*9356374aSAndroid Build Coastguard Worker // To store some of the arguments passed to `absl::bind_front()` by reference, 128*9356374aSAndroid Build Coastguard Worker // use std::ref()` and `std::cref()`. 129*9356374aSAndroid Build Coastguard Worker // 130*9356374aSAndroid Build Coastguard Worker // Example: Storing some of the bound arguments by reference. 131*9356374aSAndroid Build Coastguard Worker // 132*9356374aSAndroid Build Coastguard Worker // class Service { 133*9356374aSAndroid Build Coastguard Worker // public: 134*9356374aSAndroid Build Coastguard Worker // void Serve(const Request& req, std::function<void()>* done) { 135*9356374aSAndroid Build Coastguard Worker // // The request protocol buffer won't be deleted until done is called. 136*9356374aSAndroid Build Coastguard Worker // // It's safe to store a reference to it inside the functor. 137*9356374aSAndroid Build Coastguard Worker // Executor::DefaultExecutor()->Schedule( 138*9356374aSAndroid Build Coastguard Worker // absl::bind_front(&Service::BlockingServe, this, std::cref(req), 139*9356374aSAndroid Build Coastguard Worker // done)); 140*9356374aSAndroid Build Coastguard Worker // } 141*9356374aSAndroid Build Coastguard Worker // 142*9356374aSAndroid Build Coastguard Worker // private: 143*9356374aSAndroid Build Coastguard Worker // void BlockingServe(const Request& req, std::function<void()>* done); 144*9356374aSAndroid Build Coastguard Worker // }; 145*9356374aSAndroid Build Coastguard Worker // 146*9356374aSAndroid Build Coastguard Worker // Example: Storing bound arguments by reference. 147*9356374aSAndroid Build Coastguard Worker // 148*9356374aSAndroid Build Coastguard Worker // void Print(const std::string& a, const std::string& b) { 149*9356374aSAndroid Build Coastguard Worker // std::cerr << a << b; 150*9356374aSAndroid Build Coastguard Worker // } 151*9356374aSAndroid Build Coastguard Worker // 152*9356374aSAndroid Build Coastguard Worker // std::string hi = "Hello, "; 153*9356374aSAndroid Build Coastguard Worker // std::vector<std::string> names = {"Chuk", "Gek"}; 154*9356374aSAndroid Build Coastguard Worker // // Doesn't copy hi. 155*9356374aSAndroid Build Coastguard Worker // for_each(names.begin(), names.end(), 156*9356374aSAndroid Build Coastguard Worker // absl::bind_front(Print, std::ref(hi))); 157*9356374aSAndroid Build Coastguard Worker // 158*9356374aSAndroid Build Coastguard Worker // // DO NOT DO THIS: the functor may outlive "hi", resulting in 159*9356374aSAndroid Build Coastguard Worker // // dangling references. 160*9356374aSAndroid Build Coastguard Worker // foo->DoInFuture(absl::bind_front(Print, std::ref(hi), "Guest")); // BAD! 161*9356374aSAndroid Build Coastguard Worker // auto f = absl::bind_front(Print, std::ref(hi), "Guest"); // BAD! 162*9356374aSAndroid Build Coastguard Worker // 163*9356374aSAndroid Build Coastguard Worker // Example: Storing reference-like types. 164*9356374aSAndroid Build Coastguard Worker // 165*9356374aSAndroid Build Coastguard Worker // void Print(absl::string_view a, const std::string& b) { 166*9356374aSAndroid Build Coastguard Worker // std::cerr << a << b; 167*9356374aSAndroid Build Coastguard Worker // } 168*9356374aSAndroid Build Coastguard Worker // 169*9356374aSAndroid Build Coastguard Worker // std::string hi = "Hello, "; 170*9356374aSAndroid Build Coastguard Worker // // Copies "hi". 171*9356374aSAndroid Build Coastguard Worker // absl::bind_front(Print, hi)("Chuk"); 172*9356374aSAndroid Build Coastguard Worker // 173*9356374aSAndroid Build Coastguard Worker // // Compile error: std::reference_wrapper<const string> is not implicitly 174*9356374aSAndroid Build Coastguard Worker // // convertible to string_view. 175*9356374aSAndroid Build Coastguard Worker // // absl::bind_front(Print, std::cref(hi))("Chuk"); 176*9356374aSAndroid Build Coastguard Worker // 177*9356374aSAndroid Build Coastguard Worker // // Doesn't copy "hi". 178*9356374aSAndroid Build Coastguard Worker // absl::bind_front(Print, absl::string_view(hi))("Chuk"); 179*9356374aSAndroid Build Coastguard Worker // 180*9356374aSAndroid Build Coastguard Worker #if defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L 181*9356374aSAndroid Build Coastguard Worker using std::bind_front; 182*9356374aSAndroid Build Coastguard Worker #else // defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L 183*9356374aSAndroid Build Coastguard Worker template <class F, class... BoundArgs> 184*9356374aSAndroid Build Coastguard Worker constexpr functional_internal::bind_front_t<F, BoundArgs...> bind_front( 185*9356374aSAndroid Build Coastguard Worker F&& func, BoundArgs&&... args) { 186*9356374aSAndroid Build Coastguard Worker return functional_internal::bind_front_t<F, BoundArgs...>( 187*9356374aSAndroid Build Coastguard Worker absl::in_place, std::forward<F>(func), std::forward<BoundArgs>(args)...); 188*9356374aSAndroid Build Coastguard Worker } 189*9356374aSAndroid Build Coastguard Worker #endif // defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L 190*9356374aSAndroid Build Coastguard Worker 191*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END 192*9356374aSAndroid Build Coastguard Worker } // namespace absl 193*9356374aSAndroid Build Coastguard Worker 194*9356374aSAndroid Build Coastguard Worker #endif // ABSL_FUNCTIONAL_BIND_FRONT_H_ 195