1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2015-2016.
4 // Distributed under the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // See http://www.boost.org/libs/move for documentation.
9 //
10 //////////////////////////////////////////////////////////////////////////////
11 #ifndef BOOST_MOVE_ALGO_PREDICATE_HPP
12 #define BOOST_MOVE_ALGO_PREDICATE_HPP
13 
14 #include <boost/move/algo/move.hpp>
15 #include <boost/move/adl_move_swap.hpp>
16 #include <boost/move/algo/detail/basic_op.hpp>
17 #include <boost/move/detail/iterator_traits.hpp>
18 #include <boost/move/detail/destruct_n.hpp>
19 #include <boost/assert.hpp>
20 
21 namespace boost {
22 namespace movelib {
23 
24 template<class Comp>
25 struct antistable
26 {
antistableboost::movelib::antistable27    explicit antistable(Comp &comp)
28       : m_comp(comp)
29    {}
30 
31    template<class U, class V>
operator ()boost::movelib::antistable32    bool operator()(const U &u, const V & v)
33    {  return !m_comp(v, u);  }
34 
35    private:
36    antistable & operator=(const antistable &);
37    Comp &m_comp;
38 };
39 
40 template <class Comp>
41 class negate
42 {
43    public:
negate()44    negate()
45    {}
46 
negate(Comp comp)47    explicit negate(Comp comp)
48       : m_comp(comp)
49    {}
50 
51    template <class T1, class T2>
operator ()(const T1 & l,const T2 & r)52    bool operator()(const T1& l, const T2& r)
53    {
54       return !m_comp(l, r);
55    }
56 
57    private:
58    Comp m_comp;
59 };
60 
61 
62 template <class Comp>
63 class inverse
64 {
65    public:
inverse()66    inverse()
67    {}
68 
inverse(Comp comp)69    explicit inverse(Comp comp)
70       : m_comp(comp)
71    {}
72 
73    template <class T1, class T2>
operator ()(const T1 & l,const T2 & r)74    bool operator()(const T1& l, const T2& r)
75    {
76       return m_comp(r, l);
77    }
78 
79    private:
80    Comp m_comp;
81 };
82 
83 }  //namespace movelib {
84 }  //namespace boost {
85 
86 #endif   //#define BOOST_MOVE_ALGO_PREDICATE_HPP
87