libzypp 17.31.23
WhatProvides.cc
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
12#include <iostream>
13
14#include <zypp/base/LogTools.h>
16#include <zypp/sat/detail/PoolImpl.h>
17
18using std::endl;
19
21namespace zypp
22{
24 namespace sat
25 {
26
28 //
29 // CLASS NAME : WhatProvides::Impl
30 //
42 {
43 public:
45 : _offset( 0 ), _private( 0 )
46 {}
47
48 Impl( unsigned offset_r )
49 : _offset( offset_r ), _private( 0 )
50 {}
51
52 Impl( const std::unordered_set<detail::IdType> & ids_r )
53 : _offset( 0 ), _private( 0 )
54 {
55 // use private data to store the result (incl. trailing NULL)
56 _pdata.reserve( ids_r.size()+1 );
57 _pdata.insert( _pdata.begin(), ids_r.begin(), ids_r.end() );
58 _pdata.push_back( detail::noId );
59
60 _private = &_pdata.front(); // ptr to 1st element
61 }
62
63 public:
64 unsigned _offset;
66
67 private:
68 std::vector<sat::detail::IdType> _pdata;
69 };
71
73 namespace
74 {
75
77 template <class Iterator>
78 void collectProviders( Iterator begin_r, Iterator end_r, std::unordered_set<detail::IdType> & collect_r )
79 {
80 for_( it, begin_r, end_r )
81 {
82 WhatProvides providers( *it );
83 for_( prv, providers.begin(), providers.end() )
84 {
85 collect_r.insert( prv->id() );
86 }
87 }
88 }
89
91 } //namespace
93
95 {}
96
98 {
99 unsigned res( myPool().whatProvides( cap_r ) );
100 if ( myPool().whatProvidesData( res ) )
101 {
102 _pimpl.reset( new Impl( res ) );
103 }
104 // else: no Impl for empty result.
105 }
106
108 {
109 std::unordered_set<detail::IdType> ids;
110 collectProviders( caps_r.begin(), caps_r.end(), ids );
111 if ( ! ids.empty() )
112 {
113 _pimpl.reset( new Impl( ids ) );
114 }
115 // else: no Impl for empty result.
116 }
117
119 {
120 std::unordered_set<detail::IdType> ids;
121 collectProviders( caps_r.begin(), caps_r.end(), ids );
122 if ( ! ids.empty() )
123 {
124 _pimpl.reset( new Impl( ids ) );
125 }
126 // else: no Impl for empty result.
127 }
128
130 {
131 return !_pimpl; // Ctor asserts no Impl for empty result.
132 }
133
135 {
136 if ( !_pimpl )
137 return 0;
138
139 size_type count = 0;
140 for_( it, begin(), end() )
141 ++count;
142 return count;
143 }
144
146 {
147 if ( !_pimpl )
148 return const_iterator();
149
150 if ( _pimpl->_private )
151 return const_iterator( _pimpl->_private );
152
153 // for libsolvs index use one more indirection, as it might get relocated.
154 return const_iterator( &myPool().getPool()->whatprovidesdata, _pimpl->_offset );
155 }
156
157 /******************************************************************
158 **
159 ** FUNCTION NAME : operator<<
160 ** FUNCTION TYPE : std::ostream &
161 */
162 std::ostream & operator<<( std::ostream & str, const WhatProvides & obj )
163 {
164 return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() );
165 }
166
168 namespace detail
169 {
170
171 std::ostream & operator<<( std::ostream & str, const WhatProvidesIterator & obj )
172 {
173 str << str::form( "[%5u]", obj._offset );
174 str << str::form( "<%p(%p)>", obj.base_reference(), &obj.base_reference() );
175 str << str::form( "<%p(%p)>", obj._baseRef, (obj._baseRef ? *obj._baseRef : 0) );
176 return str;
177 }
178
180 } //namespace detail
182
184 } // namespace sat
187} // namespace zypp
Container of Capability (currently read only).
Definition: Capabilities.h:36
const_iterator begin() const
Iterator pointing to the first Capability.
Definition: Capabilities.h:169
const_iterator end() const
Iterator pointing behind the last Capability.
Definition: Capabilities.h:172
A sat capability.
Definition: Capability.h:63
WhatProvides implementation date.
Definition: WhatProvides.cc:42
std::vector< sat::detail::IdType > _pdata
Definition: WhatProvides.cc:68
Impl(const std::unordered_set< detail::IdType > &ids_r)
Definition: WhatProvides.cc:52
const detail::IdType * _private
Definition: WhatProvides.cc:65
Container of Solvable providing a Capability (read only).
Definition: WhatProvides.h:89
RW_pointer< Impl > _pimpl
Definition: WhatProvides.h:128
const_iterator end() const
Iterator pointing behind the last Solvable.
Definition: WhatProvides.h:234
bool empty() const
Whether the container is empty.
detail::WhatProvidesIterator const_iterator
Definition: WhatProvides.h:118
WhatProvides()
Default ctor.
Definition: WhatProvides.cc:94
const_iterator begin() const
Iterator pointing to the first Solvable.
size_type size() const
Number of solvables inside.
const detail::IdType *const * _baseRef
Definition: WhatProvides.h:228
String related utilities and Regular expression matching.
static const IdType noId(0)
int IdType
Generic Id type.
Definition: PoolMember.h:104
std::ostream & operator<<(std::ostream &str, const DIWrap &obj)
Definition: LookupAttr.cc:337
std::ostream & operator<<(std::ostream &str, const FileConflicts &obj)
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Definition: String.cc:36
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:2
std::unordered_set< Capability > CapabilitySet
Definition: Capability.h:35
std::ostream & dumpRange(std::ostream &str, TIterator begin, TIterator end, const std::string &intro="{", const std::string &pfx="\n ", const std::string &sep="\n ", const std::string &sfx="\n", const std::string &extro="}")
Print range defined by iterators (multiline style).
Definition: LogTools.h:92
Backlink to the associated PoolImpl.
Definition: PoolMember.h:89
static PoolImpl & myPool()
Definition: PoolImpl.cc:184
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:28