Imported Upstream version 17.23.5
[platform/upstream/libzypp.git] / zypp / ui / SelectableTraits.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/ui/SelectableTraits.h
10  *
11 */
12 #ifndef ZYPP_UI_SELECTABLETRAITS_H
13 #define ZYPP_UI_SELECTABLETRAITS_H
14
15 #include <set>
16 #include <vector>
17
18 #include <zypp/base/Iterator.h>
19 #include <zypp/PoolItem.h>
20 #include <zypp/pool/ByIdent.h>
21
22 ///////////////////////////////////////////////////////////////////
23 namespace zypp
24 { /////////////////////////////////////////////////////////////////
25   ///////////////////////////////////////////////////////////////////
26   namespace ui
27   { /////////////////////////////////////////////////////////////////
28
29     ///////////////////////////////////////////////////////////////////
30     //
31     //  CLASS NAME : SelectableTraits
32     //
33     /** */
34     struct SelectableTraits
35     {
36       /** Oder on AvailableItemSet.
37        * \li not retracted
38        * \li repository priority
39        * \li best Arch (arch/noarch changes are ok)
40        * \li best Edition
41        * \li newer buildtime
42        * \li ResObject::constPtr as fallback.
43       */
44       struct AVOrder : public std::binary_function<PoolItem,PoolItem,bool>
45       {
46         // NOTE: operator() provides LESS semantics to order the set.
47         // So LESS means 'prior in set'. We want 'better' archs and
48         // 'better' editions at the beginning of the set. So we return
49         // TRUE if (lhs > rhs)!
50         //
51         bool operator()( const PoolItem & lhs, const PoolItem & rhs ) const
52         {
53           if ( lhs.isRetracted() != rhs.isRetracted() )
54             return rhs.isRetracted();
55
56           int lprio = lhs->satSolvable().repository().satInternalPriority();
57           int rprio = rhs->satSolvable().repository().satInternalPriority();
58           if ( lprio != rprio )
59             return( lprio > rprio );
60
61           // arch/noarch changes are ok.
62           if ( lhs->arch() != Arch_noarch && rhs->arch() != Arch_noarch )
63           {
64             int res = lhs->arch().compare( rhs->arch() );
65             if ( res )
66               return res > 0;
67           }
68
69           int res = lhs->edition().compare( rhs->edition() );
70           if ( res )
71             return res > 0;
72
73           lprio = lhs->buildtime();
74           rprio = rhs->buildtime();
75           if ( lprio != rprio )
76             return( lprio > rprio );
77
78           lprio = lhs->satSolvable().repository().satInternalSubPriority();
79           rprio = rhs->satSolvable().repository().satInternalSubPriority();
80           if ( lprio != rprio )
81             return( lprio > rprio );
82
83           // no more criteria, still equal: sort by id
84           return lhs.satSolvable().id() < rhs.satSolvable().id();
85         }
86       };
87
88       /** Oder on InstalledItemSet.
89        * \li best Arch
90        * \li best Edition
91        * \li newer install time
92        * \li ResObject::constPtr as fallback.
93       */
94       struct IOrder : public std::binary_function<PoolItem,PoolItem,bool>
95       {
96         // NOTE: operator() provides LESS semantics to order the set.
97         // So LESS means 'prior in set'. We want 'newer' install time
98         // at the beginning of the set.
99         //
100         bool operator()( const PoolItem & lhs, const PoolItem & rhs ) const
101         {
102           int res = lhs->arch().compare( rhs->arch() );
103           if ( res )
104             return res > 0;
105           res = lhs->edition().compare( rhs->edition() );
106           if ( res )
107             return res > 0;
108           Date ldate = lhs->installtime();
109           Date rdate = rhs->installtime();
110           if ( ldate != rdate )
111             return( ldate > rdate );
112
113           // no more criteria, still equal: sort by id
114           return lhs.satSolvable().id() < rhs.satSolvable().id();
115         }
116       };
117
118       typedef std::set<PoolItem,AVOrder>       AvailableItemSet;
119       typedef AvailableItemSet::iterator       available_iterator;
120       typedef AvailableItemSet::const_iterator available_const_iterator;
121       typedef AvailableItemSet::size_type      available_size_type;
122
123       typedef std::set<PoolItem,IOrder>        InstalledItemSet;
124       typedef AvailableItemSet::iterator       installed_iterator;
125       typedef AvailableItemSet::const_iterator installed_const_iterator;
126       typedef AvailableItemSet::size_type      installed_size_type;
127
128       typedef std::vector<PoolItem>             PickList;
129       typedef PickList::const_iterator          picklist_iterator;
130       typedef PickList::size_type               picklist_size_type;
131     };
132     ///////////////////////////////////////////////////////////////////
133
134     /////////////////////////////////////////////////////////////////
135   } // namespace ui
136   ///////////////////////////////////////////////////////////////////
137   /////////////////////////////////////////////////////////////////
138 } // namespace zypp
139 ///////////////////////////////////////////////////////////////////
140 #endif // ZYPP_UI_SELECTABLETRAITS_H