You can find unit tests covering the whole API in
unittests/function-view-selftests.c. */
+#include "invoke-result.h"
namespace gdb {
namespace fv_detail {
/* True if Func can be called with Args, and either the result is
Res, convertible to Res or Res is void. */
template<typename Callable,
- typename Res2 = typename std::result_of<Callable &(Args...)>::type>
+ typename Res2 = typename gdb::invoke_result<Callable &, Args...>::type>
struct IsCompatibleCallable : CompatibleReturnType<Res2, Res>
{};
--- /dev/null
+/* Compatibility wrapper around std::result_of and std::invoke_result.
+
+ Copyright (C) 2022 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program 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; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef GDBSUPPORT_INVOKE_RESULT_H
+#define GDBSUPPORT_INVOKE_RESULT_H
+
+#include <type_traits>
+
+namespace gdb
+{
+#if __cplusplus >= 201703L
+template<typename Callable, class... Args>
+using invoke_result = std::invoke_result<Callable, Args...>;
+#else
+template<typename Callable, typename... Args>
+using invoke_result = std::result_of<Callable (Args...)>;
+#endif
+
+} /* namespace gdb */
+
+#endif /* GDBSUPPORT_INVOKE_RESULT_H */
#include <algorithm>
#include <type_traits>
+#include "gdbsupport/invoke-result.h"
#include "gdbsupport/thread-pool.h"
#include "gdbsupport/function-view.h"
template<class RandomIt, class RangeFunction>
typename gdb::detail::par_for_accumulator<
- typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type
+ typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type
>::result_type
parallel_for_each (unsigned n, RandomIt first, RandomIt last,
RangeFunction callback,
gdb::function_view<size_t(RandomIt)> task_size = nullptr)
{
using result_type
- = typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type;
+ = typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type;
/* If enabled, print debug info about how the work is distributed across
the threads. */
template<class RandomIt, class RangeFunction>
typename gdb::detail::par_for_accumulator<
- typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type
+ typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type
>::result_type
sequential_for_each (unsigned n, RandomIt first, RandomIt last,
RangeFunction callback,
gdb::function_view<size_t(RandomIt)> task_size = nullptr)
{
- using result_type
- = typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type;
+ using result_type = typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type;
gdb::detail::par_for_accumulator<result_type> results (0);