4049f64de413ad6884acdcdba651ea54113dcb3c
[platform/upstream/libzypp.git] / zypp / PoolItemBest.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/PoolItemBest.cc
10  *
11 */
12 #include <iostream>
13 #include "zypp/base/LogTools.h"
14
15 #include "zypp/PoolItemBest.h"
16 #include "zypp/ui/SelectableTraits.h"
17
18 using std::endl;
19
20 ///////////////////////////////////////////////////////////////////
21 namespace zypp
22 { /////////////////////////////////////////////////////////////////
23
24   ///////////////////////////////////////////////////////////////////
25   //
26   //    CLASS NAME : PoolItemBest::Impl
27   //
28   /** PoolItemBest implementation. */
29   struct PoolItemBest::Impl
30   {
31     Impl( bool preferNotLocked_r )
32     : _preferNotLocked { preferNotLocked_r }
33     {}
34
35     Container _container;
36     bool _preferNotLocked;
37
38     private:
39       friend Impl * rwcowClone<Impl>( const Impl * rhs );
40       /** clone for RWCOW_pointer */
41       Impl * clone() const
42       { return new Impl( *this ); }
43   };
44   ///////////////////////////////////////////////////////////////////
45
46   ///////////////////////////////////////////////////////////////////
47   //
48   //    CLASS NAME : PoolItemBest
49   //
50   ///////////////////////////////////////////////////////////////////
51
52   void PoolItemBest::_ctor_init( bool preferNotLocked_r )
53   { _dont_use_this_use_pimpl.reset( new RWCOW_pointer<Impl>(new Impl( preferNotLocked_r )) ); }
54
55   void PoolItemBest::_ctor_init()
56   { _ctor_init( /*preferNotLocked*/false ); }
57
58   const PoolItemBest::Container & PoolItemBest::container() const
59   { return pimpl()->_container; }
60
61   void PoolItemBest::add( const PoolItem & pi_r )
62   {
63     Container & container( pimpl()->_container );
64
65     PoolItem & ccand( container[pi_r.satSolvable().ident()] );
66     if ( ! ccand )
67       ccand = pi_r;
68     else if ( pimpl()->_preferNotLocked )
69     {
70       if ( ! pi_r.status().isLocked() )
71       {
72         if ( ccand.status().isLocked() || ui::SelectableTraits::AVOrder()( pi_r, ccand ) )
73           ccand = pi_r;
74       }
75       else if ( ccand.status().isLocked() )
76       {
77         if ( ui::SelectableTraits::AVOrder()( pi_r, ccand ) )
78           ccand = pi_r;
79       }
80     }
81     else if ( ui::SelectableTraits::AVOrder()( pi_r, ccand ) )
82       ccand = pi_r;
83   }
84
85   PoolItem PoolItemBest::find( IdString ident_r ) const
86   {
87     const Container & container( pimpl()->_container );
88     Container::const_iterator it( container.find( ident_r ) );
89     return it != container.end() ? it->second : PoolItem();
90   }
91
92   /******************************************************************
93   **
94   **    FUNCTION NAME : operator<<
95   **    FUNCTION TYPE : std::ostream &
96   */
97   std::ostream & operator<<( std::ostream & str, const PoolItemBest & obj )
98   {
99     return dumpRange( str << "(" << obj.size() << ") ", obj.begin(), obj.end() );
100   }
101
102   /////////////////////////////////////////////////////////////////
103 } // namespace zypp
104 ///////////////////////////////////////////////////////////////////