{
        if (N > in.size())
        {
            OperationApplier<Op, OperationApplierImpl, N - 1>
                ::template doBatchedApply<CarryResult>(in, result_data);
            return;
        }
        const OperationApplierImpl<Op, N> operation_applier_impl(in);
        size_t i = 0;
        for (auto & res : result_data)
            if constexpr (CarryResult)
                res = Op::apply(res, operation_applier_impl.apply(i++));
            else
                res = operation_applier_impl.apply(i++);
        in.erase(in.end() - N, in.end());
    }
};
template <
    typename Op, template <typename, size_t> typename OperationApplierImpl>
struct OperationApplier<Op, OperationApplierImpl, 0>
{
    template <bool, typename Columns, typename Result>
    static void NO_INLINE doBatchedApply(Columns &, Result &)