// // Created by eran on 01/04/2015. // #include #include "fakeit/Invocation.hpp" namespace fakeit { struct ActualInvocationsSource { virtual void getActualInvocations(std::unordered_set &into) const = 0; virtual ~ActualInvocationsSource() THROWS { }; }; struct InvocationsSourceProxy : public ActualInvocationsSource { InvocationsSourceProxy(ActualInvocationsSource *inner) : _inner(inner) { } void getActualInvocations(std::unordered_set &into) const override { _inner->getActualInvocations(into); } private: std::shared_ptr _inner; }; struct UnverifiedInvocationsSource : public ActualInvocationsSource { UnverifiedInvocationsSource(InvocationsSourceProxy decorated) : _decorated(decorated) { } void getActualInvocations(std::unordered_set &into) const override { std::unordered_set all; _decorated.getActualInvocations(all); for (fakeit::Invocation *i : all) { if (!i->isVerified()) { into.insert(i); } } } private: InvocationsSourceProxy _decorated; }; struct AggregateInvocationsSource : public ActualInvocationsSource { AggregateInvocationsSource(std::vector &sources) : _sources(sources) { } void getActualInvocations(std::unordered_set &into) const override { std::unordered_set tmp; for (ActualInvocationsSource *source : _sources) { source->getActualInvocations(tmp); } filter(tmp, into); } protected: bool shouldInclude(fakeit::Invocation *invocation) const { return true; } private: std::vector _sources; void filter(std::unordered_set &source, std::unordered_set &target) const { for (Invocation *i:source) { if (shouldInclude(i)) { target.insert(i); } } } }; }