/* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ /** @file y_combinator.hpp Y-combinator template implementation to support recursive lambdas and similar. */ #ifndef Y_COMBINATOR_HPP #define Y_COMBINATOR_HPP #include #include /* Based on C++ std library proposal: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0200r0.html */ template class y_combinator_result { F func_; public: template explicit y_combinator_result(T &&func): func_(std::forward(func)) {} template decltype(auto) operator()(Args &&...args) { return func_(std::ref(*this), std::forward(args)...); } }; template decltype(auto) y_combinator(F &&func) { return y_combinator_result>(std::forward(func)); } #endif /* Y_COMBINATOR_HPP */