1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/Pattern.cc
13 #include "zypp/base/LogTools.h"
15 #include "zypp/ResPool.h"
16 #include "zypp/Pattern.h"
17 #include "zypp/Filter.h"
21 ///////////////////////////////////////////////////////////////////
23 { /////////////////////////////////////////////////////////////////
25 ///////////////////////////////////////////////////////////////////
27 { /////////////////////////////////////////////////////////////////
28 ///////////////////////////////////////////////////////////////////
30 // CLASS NAME : PatternExpander
32 /** Recursively expand a Pattern.
34 * This means recursively expanding Patterns included by this or
35 * extending this. The result is a \c set of <tt>Pattern::constPtr</tt>
36 * accessible via iterator.
41 typedef std::map<Pattern::constPtr, DefaultIntegral<bool, false> > PatternMap;
42 typedef PatternMap::size_type size_type;
43 typedef PatternMap::key_type value_type;
44 typedef MapKVIteratorTraits<PatternMap>::Key_const_iterator const_iterator;
50 /** Recursively expand Pattern. */
51 size_type doExpand( Pattern::constPtr pat_r )
53 // INT << "+++ " << pat_r << " ++++++++++++++++++++++++++++++++++" << endl;
58 Pattern::constPtr unprocessed( pat_r );
59 // MIL << _patternMap << endl;
61 expandIncludes( unprocessed );
62 expandExtending( unprocessed );
63 _patternMap[unprocessed] = true;
64 // MIL << _patternMap << endl;
65 } while( (unprocessed = nextUnprocessed()) );
67 // SEC << "--- " << _patternMap.size() << " ----------------------------------" << endl;
68 return _patternMap.size();
71 const_iterator begin() const
72 { return make_map_key_begin( _patternMap ); }
74 const_iterator end() const
75 { return make_map_key_end( _patternMap ); }
78 /** Get the next unprocessed Pattern in \c _patternMap. */
79 Pattern::constPtr nextUnprocessed() const
81 for_( it, _patternMap.begin(), _patternMap.end() )
90 /** Store all included patterns in \c _patternMap. */
91 void expandIncludes( const Pattern::constPtr & pat_r )
93 Pattern::NameList c( pat_r->includes() );
94 for_( it, c.begin(), c.end() )
96 expandInclude( Capability( it->c_str()/*, *ResKind::pattern*/ ) );
100 /** Store Patterns matching an \c Includes capability in \c _patternMap. */
101 void expandInclude( const Capability & include_r )
103 sat::WhatProvides w( include_r );
104 for_( it, w.begin(), w.end() )
106 _patternMap[asKind<Pattern>(PoolItem(*it))];
111 /** Store all patterns extending \c pat_r in \c _patternMap. */
112 void expandExtending( const Pattern::constPtr & pat_r )
114 ResPool pool( ResPool::instance() );
115 for_( it, pool.byKindBegin<Pattern>(), pool.byKindEnd<Pattern>() )
117 expandIfExtends( pat_r, *it );
121 /** Store \c extending_r if it extends \c pat_r. */
122 void expandIfExtends( const Pattern::constPtr & pat_r, const PoolItem & extending_r )
124 Pattern::constPtr extending( asKind<Pattern>(extending_r) );
125 Pattern::NameList c( extending->extends() );
126 for_( it, c.begin(), c.end() )
128 if ( providedBy( pat_r, Capability( it->c_str()/*, *ResKind::pattern*/ ) ) )
130 // an extends matches the Pattern
131 _patternMap[extending];
137 /** Return true if Capability \c extends_r is provided by Pattern. */
138 bool providedBy( const Pattern::constPtr & pat_r, const Capability & extends_r )
143 sat::Solvable pat( pat_r->satSolvable() );
144 sat::WhatProvides w( extends_r );
145 for_( it, w.begin(), w.end() )
154 PatternMap _patternMap;
156 /////////////////////////////////////////////////////////////////
158 ///////////////////////////////////////////////////////////////////
159 IMPL_PTR_TYPE(Pattern);
161 ///////////////////////////////////////////////////////////////////
163 // METHOD NAME : Pattern::Pattern
164 // METHOD TYPE : Ctor
166 Pattern::Pattern( const sat::Solvable & solvable_r )
167 : ResObject( solvable_r )
170 ///////////////////////////////////////////////////////////////////
172 // METHOD NAME : Pattern::~Pattern
173 // METHOD TYPE : Dtor
178 ///////////////////////////////////////////////////////////////////
180 // Pattern interface forwarded to implementation
182 ///////////////////////////////////////////////////////////////////
184 bool Pattern::isDefault() const
185 { return lookupBoolAttribute( sat::SolvAttr::isdefault ); }
187 bool Pattern::userVisible() const
188 { return lookupBoolAttribute( sat::SolvAttr::isvisible ); }
190 std::string Pattern::category( const Locale & lang_r ) const
191 { return lookupStrAttribute( sat::SolvAttr::category, lang_r ); }
193 Pathname Pattern::icon() const
194 { return lookupStrAttribute( sat::SolvAttr::icon ); }
196 Pathname Pattern::script() const
197 { return lookupStrAttribute( sat::SolvAttr::script ); }
199 std::string Pattern::order() const
200 { return lookupStrAttribute( sat::SolvAttr::order ); }
202 Pattern::NameList Pattern::includes() const
203 { return NameList( sat::SolvAttr::includes, satSolvable() ); }
205 Pattern::NameList Pattern::extends() const
206 { return NameList( sat::SolvAttr::extends, satSolvable() ); }
208 Pattern::Contents Pattern::core() const
210 // get items providing the requirements
211 sat::WhatProvides prv( requires() );
212 // return packages only.
213 return Pattern::Contents( make_filter_begin( filter::byKind<Package>(), prv ),
214 make_filter_end( filter::byKind<Package>(), prv ) );
217 Pattern::Contents Pattern::depends() const
219 // load requires, recommends, suggests
222 Capabilities c( requires() );
223 caps.insert( c.begin(),c.end() );
225 caps.insert( c.begin(),c.end() );
227 caps.insert( c.begin(),c.end() );
229 // get items providing the above
230 sat::WhatProvides prv( caps );
231 // return packages only.
232 return Pattern::Contents( make_filter_begin( filter::byKind<Package>(), prv ),
233 make_filter_end( filter::byKind<Package>(), prv ) );
236 Pattern::Contents Pattern::contents() const
238 PatternExpander expander;
239 if ( ! expander.doExpand( this ) )
240 return Contents(); // empty pattern set
243 for_( it, expander.begin(), expander.end() )
245 Contents c( (*it)->depends() );
246 result.get().insert( c.begin(), c.end() );
251 /////////////////////////////////////////////////////////////////
253 ///////////////////////////////////////////////////////////////////