Add support for C++17 noexcept as part of function type

This commit is contained in:
Alexander Grund 2025-04-21 19:24:24 +02:00
parent a6a1f7f291
commit 1367d827d5

View file

@ -1,6 +1,7 @@
// http://turtle.sourceforge.net
//
// Copyright Mathieu Champlon 2012
// Copyright 2020-2025 Alexander Grund
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
@ -10,36 +11,44 @@
#define MOCK_SIGNATURE_HPP_INCLUDED
#include "../config.hpp"
#include <boost/preprocessor/empty.hpp>
#include <type_traits>
namespace mock { namespace detail {
#define MOCK_NOARG
#define MOCK_STRIP_FUNCTION_QUALIFIERS(cv, ref) \
#define MOCK_STRIP_FUNCTION_QUALIFIERS(ne, cv, ref) \
template<typename R, typename... Args> \
struct strip_function_qualifiers<R(Args...) cv ref> \
struct strip_function_qualifiers<R(Args...) cv ref ne> \
{ \
using type = R(Args...); \
}; \
template<typename R, typename... Args> \
struct strip_function_qualifiers<R(Args..., ...) cv ref> \
struct strip_function_qualifiers<R(Args..., ...) cv ref ne> \
{ \
using type = R(Args..., ...); \
};
#define MOCK_STRIP_FUNCTION_QUALIFIERS_REF(cv) \
MOCK_STRIP_FUNCTION_QUALIFIERS(cv, ) \
MOCK_STRIP_FUNCTION_QUALIFIERS(cv, &) \
MOCK_STRIP_FUNCTION_QUALIFIERS(cv, &&)
#define MOCK_STRIP_FUNCTION_QUALIFIERS_REF(ne, cv) \
MOCK_STRIP_FUNCTION_QUALIFIERS(ne, cv, ) \
MOCK_STRIP_FUNCTION_QUALIFIERS(ne, cv, &) \
MOCK_STRIP_FUNCTION_QUALIFIERS(ne, cv, &&)
#define MOCK_STRIP_FUNCTION_QUALIFIERS_CV_REF(except_spec) \
MOCK_STRIP_FUNCTION_QUALIFIERS_REF(except_spec, BOOST_PP_EMPTY()) \
MOCK_STRIP_FUNCTION_QUALIFIERS_REF(except_spec, const) \
MOCK_STRIP_FUNCTION_QUALIFIERS_REF(except_spec, volatile) \
MOCK_STRIP_FUNCTION_QUALIFIERS_REF(except_spec, const volatile)
template<typename>
struct strip_function_qualifiers;
MOCK_STRIP_FUNCTION_QUALIFIERS_REF(MOCK_NOARG)
MOCK_STRIP_FUNCTION_QUALIFIERS_REF(const)
MOCK_STRIP_FUNCTION_QUALIFIERS_REF(volatile)
MOCK_STRIP_FUNCTION_QUALIFIERS_REF(const volatile)
#undef MOCK_NOARG
MOCK_STRIP_FUNCTION_QUALIFIERS_CV_REF(BOOST_PP_EMPTY())
// C++17 includes noexcept in the function type
#if MOCK_CXX_VERSION >= 201703L
MOCK_STRIP_FUNCTION_QUALIFIERS_CV_REF(noexcept)
#endif
#undef MOCK_STRIP_FUNCTION_QUALIFIERS
#undef MOCK_STRIP_FUNCTION_QUALIFIERS_REF
#undef MOCK_STRIP_FUNCTION_QUALIFIERS_CV_REF
template<typename M>
struct signature;