mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-25 23:06:10 +01:00
Add logical trait polyfills
This commit is contained in:
parent
65cc7fd2ae
commit
ae1644e7e9
@ -91,6 +91,7 @@ set(IMPL_HEADERS
|
|||||||
${SOURCES_DIR}/internal/catch_lazy_expr.hpp
|
${SOURCES_DIR}/internal/catch_lazy_expr.hpp
|
||||||
${SOURCES_DIR}/internal/catch_leak_detector.hpp
|
${SOURCES_DIR}/internal/catch_leak_detector.hpp
|
||||||
${SOURCES_DIR}/internal/catch_list.hpp
|
${SOURCES_DIR}/internal/catch_list.hpp
|
||||||
|
${SOURCES_DIR}/internal/catch_logical_traits.hpp
|
||||||
${SOURCES_DIR}/internal/catch_message_info.hpp
|
${SOURCES_DIR}/internal/catch_message_info.hpp
|
||||||
${SOURCES_DIR}/internal/catch_meta.hpp
|
${SOURCES_DIR}/internal/catch_meta.hpp
|
||||||
${SOURCES_DIR}/internal/catch_move_and_forward.hpp
|
${SOURCES_DIR}/internal/catch_move_and_forward.hpp
|
||||||
|
@ -74,6 +74,7 @@
|
|||||||
#include <catch2/internal/catch_lazy_expr.hpp>
|
#include <catch2/internal/catch_lazy_expr.hpp>
|
||||||
#include <catch2/internal/catch_leak_detector.hpp>
|
#include <catch2/internal/catch_leak_detector.hpp>
|
||||||
#include <catch2/internal/catch_list.hpp>
|
#include <catch2/internal/catch_list.hpp>
|
||||||
|
#include <catch2/internal/catch_logical_traits.hpp>
|
||||||
#include <catch2/internal/catch_message_info.hpp>
|
#include <catch2/internal/catch_message_info.hpp>
|
||||||
#include <catch2/internal/catch_meta.hpp>
|
#include <catch2/internal/catch_meta.hpp>
|
||||||
#include <catch2/internal/catch_move_and_forward.hpp>
|
#include <catch2/internal/catch_move_and_forward.hpp>
|
||||||
|
44
src/catch2/internal/catch_logical_traits.hpp
Normal file
44
src/catch2/internal/catch_logical_traits.hpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
// Copyright Catch2 Authors
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
// (See accompanying file LICENSE.txt or copy at
|
||||||
|
// https://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
#ifndef CATCH_LOGICAL_TRAITS_HPP_INCLUDED
|
||||||
|
#define CATCH_LOGICAL_TRAITS_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
namespace Detail {
|
||||||
|
|
||||||
|
#if defined( __cpp_lib_logical_traits ) && __cpp_lib_logical_traits >= 201510
|
||||||
|
|
||||||
|
using std::conjunction;
|
||||||
|
using std::disjunction;
|
||||||
|
using std::negation;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
template <class...> struct conjunction : std::true_type {};
|
||||||
|
template <class B1> struct conjunction<B1> : B1 {};
|
||||||
|
template <class B1, class... Bn>
|
||||||
|
struct conjunction<B1, Bn...>
|
||||||
|
: std::conditional_t<bool( B1::value ), conjunction<Bn...>, B1> {};
|
||||||
|
|
||||||
|
template <class...> struct disjunction : std::false_type {};
|
||||||
|
template <class B1> struct disjunction<B1> : B1 {};
|
||||||
|
template <class B1, class... Bn>
|
||||||
|
struct disjunction<B1, Bn...>
|
||||||
|
: std::conditional_t<bool( B1::value ), B1, disjunction<Bn...>> {};
|
||||||
|
|
||||||
|
template <class B>
|
||||||
|
struct negation : std::integral_constant<bool, !bool(B::value)> {};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace Detail
|
||||||
|
} // namespace Catch
|
||||||
|
|
||||||
|
#endif // CATCH_LOGICAL_TRAITS_HPP_INCLUDED
|
@ -11,6 +11,7 @@
|
|||||||
#include <catch2/matchers/catch_matchers.hpp>
|
#include <catch2/matchers/catch_matchers.hpp>
|
||||||
#include <catch2/internal/catch_stringref.hpp>
|
#include <catch2/internal/catch_stringref.hpp>
|
||||||
#include <catch2/internal/catch_move_and_forward.hpp>
|
#include <catch2/internal/catch_move_and_forward.hpp>
|
||||||
|
#include <catch2/internal/catch_logical_traits.hpp>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -56,20 +57,6 @@ namespace Matchers {
|
|||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined( __cpp_lib_logical_traits ) && __cpp_lib_logical_traits >= 201510
|
|
||||||
|
|
||||||
using std::conjunction;
|
|
||||||
|
|
||||||
#else // __cpp_lib_logical_traits
|
|
||||||
|
|
||||||
template<typename... Cond>
|
|
||||||
struct conjunction : std::true_type {};
|
|
||||||
|
|
||||||
template<typename Cond, typename... Rest>
|
|
||||||
struct conjunction<Cond, Rest...> : std::integral_constant<bool, Cond::value && conjunction<Rest...>::value> {};
|
|
||||||
|
|
||||||
#endif // __cpp_lib_logical_traits
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using is_generic_matcher = std::is_base_of<
|
using is_generic_matcher = std::is_base_of<
|
||||||
Catch::Matchers::MatcherGenericBase,
|
Catch::Matchers::MatcherGenericBase,
|
||||||
@ -77,7 +64,7 @@ namespace Matchers {
|
|||||||
>;
|
>;
|
||||||
|
|
||||||
template<typename... Ts>
|
template<typename... Ts>
|
||||||
using are_generic_matchers = conjunction<is_generic_matcher<Ts>...>;
|
using are_generic_matchers = Catch::Detail::conjunction<is_generic_matcher<Ts>...>;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using is_matcher = std::is_base_of<
|
using is_matcher = std::is_base_of<
|
||||||
|
@ -96,6 +96,7 @@ internal_headers = [
|
|||||||
'internal/catch_lazy_expr.hpp',
|
'internal/catch_lazy_expr.hpp',
|
||||||
'internal/catch_leak_detector.hpp',
|
'internal/catch_leak_detector.hpp',
|
||||||
'internal/catch_list.hpp',
|
'internal/catch_list.hpp',
|
||||||
|
'internal/catch_logical_traits.hpp',
|
||||||
'internal/catch_message_info.hpp',
|
'internal/catch_message_info.hpp',
|
||||||
'internal/catch_meta.hpp',
|
'internal/catch_meta.hpp',
|
||||||
'internal/catch_move_and_forward.hpp',
|
'internal/catch_move_and_forward.hpp',
|
||||||
|
Loading…
Reference in New Issue
Block a user