Files
UnrealEngine/Engine/Source/ThirdParty/FakeIt/2.0.2/include/fakeit/MatchersCollector.hpp
2025-05-18 13:04:45 +08:00

104 lines
3.3 KiB
C++

/*
* Copyright (c) 2014 Eran Pe'er.
*
* This program is made available under the terms of the MIT License.
*
* Created on Mar 10, 2014
*/
#pragma once
#include <functional>
#include <type_traits>
#include <tuple>
#include <memory>
#include <vector>
#include <unordered_set>
#include "mockutils/Destructible.hpp"
#include "mockutils/type_utils.hpp"
#include "fakeit/argument_matchers.hpp"
namespace fakeit {
template<unsigned int index, typename ... arglist>
class MatchersCollector {
std::vector<Destructible *> &_matchers;
public:
// Fetch the Nth type from arglist...
template<std::size_t N>
using ArgType = typename std::tuple_element<N, std::tuple<arglist...>>::type;
template<std::size_t N>
using NakedArgType = typename naked_type<ArgType<index>>::type;
template<std::size_t N>
using ArgMatcherCreatorType = decltype(std::declval<TypedMatcherCreator<NakedArgType<N>>>());
MatchersCollector(std::vector<Destructible *> &matchers)
: _matchers(matchers) {
}
void CollectMatchers() {
}
template<typename Head>
typename std::enable_if< //
std::is_constructible<NakedArgType<index>, Head>::value, void> //
::type CollectMatchers(const Head &value) {
TypedMatcher<NakedArgType<index>> *d = Eq<NakedArgType<index>>(value).createMatcher();
_matchers.push_back(d);
}
template<typename Head, typename ...Tail>
typename std::enable_if< //
std::is_constructible<NakedArgType<index>, Head>::value //
, void> //
::type CollectMatchers(const Head &head, const Tail &... tail) {
CollectMatchers(head);
MatchersCollector<index + 1, arglist...> c(_matchers);
c.CollectMatchers(tail...);
}
template<typename Head>
typename std::enable_if< //
std::is_base_of<TypedMatcherCreator<NakedArgType<index>>, Head>::value, void> //
::type CollectMatchers(const Head &creator) {
TypedMatcher<NakedArgType<index>> *d = creator.createMatcher();
_matchers.push_back(d);
}
template<typename Head, typename ...Tail>
//
typename std::enable_if< //
std::is_base_of<TypedMatcherCreator<NakedArgType<index>>, Head>::value, void> //
::type CollectMatchers(const Head &head, const Tail &... tail) {
CollectMatchers(head);
MatchersCollector<index + 1, arglist...> c(_matchers);
c.CollectMatchers(tail...);
}
template<typename Head>
typename std::enable_if<//
std::is_same<AnyMatcher, Head>::value, void> //
::type CollectMatchers(const Head &) {
TypedMatcher<NakedArgType<index>> *d = Any<NakedArgType<index>>().createMatcher();
_matchers.push_back(d);
}
template<typename Head, typename ...Tail>
typename std::enable_if< //
std::is_same<AnyMatcher, Head>::value, void> //
::type CollectMatchers(const Head &head, const Tail &... tail) {
CollectMatchers(head);
MatchersCollector<index + 1, arglist...> c(_matchers);
c.CollectMatchers(tail...);
}
};
}