| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | /* *  Created by Joachim on 16/04/2019. *  Adapted from donated nonius code. * *  Distributed under the Boost Software License, Version 1.0. (See accompanying *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */// Invoke with a special case for void#ifndef TWOBLUECUBES_CATCH_DETAIL_COMPLETE_INVOKE_HPP_INCLUDED#define TWOBLUECUBES_CATCH_DETAIL_COMPLETE_INVOKE_HPP_INCLUDED#include "../../catch_enforce.h"#include "../../catch_meta.hpp"#include <type_traits>#include <utility>namespace Catch {    namespace Benchmark {        namespace Detail {            template <typename T>            struct CompleteType { using type = T; };            template <>            struct CompleteType<void> { struct type {}; };            template <typename T>            using CompleteType_t = typename CompleteType<T>::type;            template <typename Result>            struct CompleteInvoker {                template <typename Fun, typename... Args>                static Result invoke(Fun&& fun, Args&&... args) {                    return std::forward<Fun>(fun)(std::forward<Args>(args)...);                }            };            template <>            struct CompleteInvoker<void> {                template <typename Fun, typename... Args>                static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) {                    std::forward<Fun>(fun)(std::forward<Args>(args)...);                    return {};                }            };            // invoke and not return void :(            template <typename Fun, typename... Args>            CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(Fun&& fun, Args&&... args) {                return CompleteInvoker<FunctionReturnType<Fun, Args...>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...);            }            const std::string benchmarkErrorMsg = "a benchmark failed to run successfully";        } // namespace Detail        template <typename Fun>        Detail::CompleteType_t<FunctionReturnType<Fun>> user_code(Fun&& fun) {            CATCH_TRY{                return Detail::complete_invoke(std::forward<Fun>(fun));            } CATCH_CATCH_ALL{                getResultCapture().benchmarkFailed(translateActiveException());                CATCH_RUNTIME_ERROR(Detail::benchmarkErrorMsg);            }        }    } // namespace Benchmark} // namespace Catch#endif // TWOBLUECUBES_CATCH_DETAIL_COMPLETE_INVOKE_HPP_INCLUDED
 |