1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/ui/PatternExpander.cc
13 //#include "zypp/base/LogTools.h"
15 #include "zypp/ui/PatternExpander.h"
17 #include "zypp/base/Algorithm.h"
18 #include "zypp/base/Function.h"
19 #include "zypp/ResPool.h"
23 ///////////////////////////////////////////////////////////////////
25 { /////////////////////////////////////////////////////////////////
26 ///////////////////////////////////////////////////////////////////
28 { /////////////////////////////////////////////////////////////////
30 ///////////////////////////////////////////////////////////////////
32 // CLASS NAME : PatternExpander::Impl
34 /** PatternExpander implementation. */
35 class PatternExpander::Impl
38 Impl( const ResPool & pool_r )
42 /** Recursively expand Pattern. */
43 size_type doExpand( Pattern::constPtr pat_r )
45 //INT << "+++ " << pat_r << " ++++++++++++++++++++++++++++++++++" << endl;
50 Pattern::constPtr unprocessed( pat_r );
51 //MIL << _patternMap << endl;
53 expandIncludes( unprocessed );
54 expandExtending( unprocessed );
55 _patternMap[unprocessed] = true;
56 //MIL << _patternMap << endl;
57 } while( (unprocessed = nextUnprocessed()) );
59 //SEC << "--- " << _patternMap.size() << " ----------------------------------" << endl;
60 return _patternMap.size();
63 const PatternMap & patternMap() const
64 { return _patternMap; }
67 /** Get the next unprocessed Pattern \c _patternMap. */
68 Pattern::constPtr nextUnprocessed() const
70 for ( PatternMap::const_iterator it = _patternMap.begin(); it != _patternMap.end(); ++it )
79 /** Store all included patterns in \c _patternMap. */
80 void expandIncludes( const Pattern::constPtr & pat_r )
82 Pattern::NameList c( pat_r->includes() );
83 for_( it, c.begin(), c.end() )
85 expandInclude( Capability( it->c_str(), ResKind::pattern ) );
89 /** Store Patterns matching an \c Includes capability in \c _patternMap. */
90 void expandInclude( const Capability & include_r )
92 sat::WhatProvides w( include_r );
93 for_( it, w.begin(), w.end() )
95 _patternMap[asKind<Pattern>(PoolItem(*it))];
100 /** Store all patterns extending \c pat_r in \c _patternMap. */
101 void expandExtending( const Pattern::constPtr & pat_r )
103 Pattern::NameList c( pat_r->extends() );
104 for_( it, c.begin(), c.end() )
107 //expandIfExtends( pat_r, Capability( it->c_str(), ResKind::pattern ) );
111 /** Store \c extending_r if it extends \c pat_r. */
112 void expandIfExtends( const Pattern::constPtr & pat_r, const PoolItem & extending_r )
114 Pattern::constPtr extending( asKind<Pattern>(extending_r) );
116 if ( ! extending->extends().empty() )
120 if ( std::find_if( extending->extends().begin(),
121 extending->extends().end(),
122 bind( &Impl::providedBy, this, pat_r, _1 ) )
123 != extending->extends().end() )
125 // an extends matches the Pattern
126 _patternMap[extending];
127 //DBG << mapEntry(*_patternMap.find(extending)) << endl;
133 /** Return true if Capability \c extends_r is provided by Pattern. */
134 bool providedBy( const Pattern::constPtr & pat_r, const Capability & extends_r )
139 sat::Solvable pat( pat_r->satSolvable() );
140 sat::WhatProvides w( extends_r );
141 for_( it, w.begin(), w.end() )
151 PatternMap _patternMap;
153 ///////////////////////////////////////////////////////////////////
155 ///////////////////////////////////////////////////////////////////
157 // CLASS NAME : PatternExpander
159 ///////////////////////////////////////////////////////////////////
161 ///////////////////////////////////////////////////////////////////
163 // METHOD NAME : PatternExpander::PatternExpander
164 // METHOD TYPE : Ctor
166 PatternExpander::PatternExpander( const ResPool & pool_r )
167 : _pimpl( new Impl( pool_r ) )
170 PatternExpander::size_type PatternExpander::expand( const Pattern::constPtr & pat_r )
171 { return _pimpl->doExpand( pat_r ); }
173 PatternExpander::size_type PatternExpander::size() const
174 { return _pimpl->patternMap().size(); }
176 bool PatternExpander::empty() const
177 { return _pimpl->patternMap().empty(); }
179 PatternExpander::const_iterator PatternExpander::begin() const
180 { return make_map_key_begin( _pimpl->patternMap() ); }
182 PatternExpander::const_iterator PatternExpander::end() const
183 { return make_map_key_end( _pimpl->patternMap() ); }
185 /////////////////////////////////////////////////////////////////
187 ///////////////////////////////////////////////////////////////////
188 /////////////////////////////////////////////////////////////////
190 ///////////////////////////////////////////////////////////////////