/* Copyright (C) 2013 * swift Project Community / Contributors * * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, * including this file, may be copied, modified, propagated, or distributed except according to the terms * contained in the LICENSE file. */ /*! \file */ #ifndef BLACKMISC_PREDICATES_H #define BLACKMISC_PREDICATES_H #include "indexsequence.h" #include #include #include namespace BlackMisc { class CPropertyIndexVariantMap; namespace Predicates { namespace Private { //! \private template struct MemberEqual; //! \private template struct MemberEqual { M m; V v; MemberEqual(M m_, V v_) : m(m_), v(v_) {} template bool operator()(const T &obj) const { return (obj.*m)() == v; } }; //! \private template struct MemberEqual { MemberEqual head; MemberEqual tail; MemberEqual(M m, V v, Tail... tail_) : head(m, v), tail(tail_...) {} template bool operator()(const T &obj) const { return head(obj) && tail(obj); } }; //! \private template struct MemberLess; //! \private template struct MemberLess { M m; MemberLess(M m_) : m(m_) {} template bool operator()(const T &a, const T &b) const { return (a.*m)() < (b.*m)(); } template bool isStable(const T &a, const T &b) const { return (a.*m)() != (b.*m)(); } }; //! \private template struct MemberLess { MemberLess head; MemberLess tail; MemberLess(M m, Tail... tail_) : head(m), tail(tail_...) {} template bool operator()(const T &a, const T &b) const { return head.isStable(a, b) ? head(a, b) : tail(a, b); } }; //! \private template struct Equals { const T m_value; template Equals(U &&value, int dummy) : m_value(std::forward(value)) { Q_UNUSED(dummy); } template bool operator ()(const U &other) const { return other == m_value; } }; //! \private struct Matches { const CPropertyIndexVariantMap &m_map; Matches(const CPropertyIndexVariantMap &map) : m_map(map) {} template bool operator()(const T &value) const; }; } //namespace Private /*! * \brief Predicate which tests whether some member functions return some values. * \param vs Pairs of { pointer to member function of T, value to compare it against }. * \return A unary functor whose operator() which will perform the actual test. */ template typename Private::MemberEqual MemberEqual(Ts... vs) { return typename Private::MemberEqual(vs...); } /*! * \brief Predicate which compares the return values of some member functions of two objects. * \param vs Pointers to member functions of T. * \return A binary functor whose operator() which will perform the actual test. */ template typename Private::MemberLess MemberLess(Ts... vs) { return typename Private::MemberLess(vs...); } /*! * Returns a function object that returns the value returned by one of it's argument member functions. */ template auto MemberTransform(R(T::*memberFunc)() const) { return [memberFunc](const T &object) { return (object.*memberFunc)(); }; } /*! * Returns a predicate that returns true if the isValid() method of the value returned from one of its member functions returns true. */ template auto MemberValid(R(T::*memberFunc)() const) { return [memberFunc](const T &object) { return (object.*memberFunc)().isValid(); }; } /*! * Returns a predicate that returns true if the value returned by its argument's member function can be found in a captured container. * \warning The container is captured by reference, so be careful that it remains valid for the lifetime of the predicate. */ template auto MemberIsAnyOf(R(T::*memberFunc)() const, const C &container) { return [memberFunc, &container](const T &object) { return container.contains((object.*memberFunc)()); }; } /*! * Returns a predicate that returns true if its argument compares equal with another, captured value. */ template auto Equals(T &&value) { return [value = std::forward(value)](const T &object) { return object == value; }; } /*! * Returns a predicate that returns true if its argument matches a captured CPropertyIndexVariantMap. */ inline auto Matches(const CPropertyIndexVariantMap &map) -> Private::Matches { return { map }; } } //namespace Predicates } //namespace BlackMisc #endif //BLACKMISC_PREDICATES_H