#pragma once /* * Copyright 2018-present Facebook, Inc. * * 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 #include #include namespace pushmi { PUSHMI_INLINE_VAR constexpr struct reduce_fn { private: template struct fn { BinaryOp binary_op_; template void operator()(Acc& acc, Cursor cursor) const { acc = binary_op_(acc, *cursor); } }; struct identity { template auto operator()(T&& t) const { return (T &&) t; } }; public: template T operator()( ExecutionPolicy&& policy, ForwardIt begin, ForwardIt end, T init, BinaryOp binary_op) const { return operators::just(std::move(init)) | operators::bulk( fn{binary_op}, begin, end, policy, identity{}, identity{}) | operators::get; } } reduce{}; } // namespace pushmi