libzypp 17.31.23
Arch.cc
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
12#include <iostream>
13#include <list>
14#include <inttypes.h>
15
16#include <zypp/base/Logger.h>
17#include <zypp/base/Exception.h>
18#include <zypp/base/NonCopyable.h>
19#include <zypp/base/Hash.h>
20#include <zypp/Arch.h>
21#include <zypp/Bit.h>
22
23using std::endl;
24
26namespace zypp
27{
28
30 //
31 // CLASS NAME : Arch::CompatEntry
32 //
39 {
45
46 CompatEntry( const std::string & archStr_r,
47 CompatBits::IntT idBit_r = 1 )
48 : _idStr( archStr_r )
49 , _archStr( archStr_r )
50 , _idBit( idBit_r )
51 , _compatBits( idBit_r )
52 {}
53
55 CompatBits::IntT idBit_r = 1 )
56 : _idStr( archStr_r )
57 , _archStr( archStr_r.asString() )
58 , _idBit( idBit_r )
59 , _compatBits( idBit_r )
60 {}
61
62 void addCompatBit( const CompatBits & idBit_r ) const
63 {
64 if ( idBit_r && ! (_compatBits & idBit_r) )
65 {
66 _compatBits |= idBit_r;
67 }
68 }
69
71 bool compatibleWith( const CompatEntry & targetEntry_r ) const
72 {
73 switch ( _idBit.value() )
74 {
75 case 0:
76 // this is noarch and always comatible
77 return true;
78 break;
79 case 1:
80 // this is a non builtin: self compatible only
81 return _archStr == targetEntry_r._archStr;
82 break;
83 }
84 // This is a builtin: compatible if mentioned in targetEntry_r
85 return bool( targetEntry_r._compatBits & _idBit );
86 }
87
89 int compare( const CompatEntry & rhs ) const
90 {
91 if ( _idBit.value() != rhs. _idBit.value() )
92 return( _idBit.value() < rhs. _idBit.value() ? -1 : 1 );
93 return _archStr.compare( rhs._archStr ); // Id 1: non builtin
94 }
95
96 bool isBuiltIn() const
97 { return( _idBit != CompatBits(1) ); }
98
100 { return _idStr.id(); }
101
103 std::string _archStr; // frequently used by the UI so we keep a reference
106 };
108
110 inline std::ostream & operator<<( std::ostream & str, const Arch::CompatEntry & obj )
111 {
113 unsigned bitnum = 0;
114 while ( bit )
115 {
116 ++bitnum;
117 bit >>= 1;
118 }
119 return str << str::form( "%-15s ", obj._archStr.c_str() ) << str::numstring(bitnum,2) << ' '
120 << obj._compatBits << ' ' << obj._compatBits.value();
121 }
122
124 inline bool operator==( const Arch::CompatEntry & lhs, const Arch::CompatEntry & rhs )
125 { return lhs._idStr == rhs._idStr; }
127 inline bool operator!=( const Arch::CompatEntry & lhs, const Arch::CompatEntry & rhs )
128 { return ! ( lhs == rhs ); }
129
131} // namespace zypp
133
135
137namespace zypp
138{
139
140 // Builtin architecture STRING VALUES to be
141 // used in defCompatibleWith below!
142 //
143 // const IdString _foo( "foo" );
144 // const Arch Arch_foo( _foo() );
145 //
146 // NOTE: Builtin CLASS Arch CONSTANTS are defined below.
147 // You have to change them accordingly in Arch.h.
148 //
149 // NOTE: Thake care CompatBits::IntT is able to provide one
150 // bit for each architecture.
151 //
152 #define DEF_BUILTIN(A) \
153 namespace { static inline const IdString & a_##A () { static IdString _str(#A); return _str; } } \
154 const Arch Arch_##A( a_##A() )
155
156 DEF_BUILTIN( noarch );
157
158 DEF_BUILTIN( i386 );
159 DEF_BUILTIN( i486 );
160 DEF_BUILTIN( i586 );
161 DEF_BUILTIN( i686 );
162 DEF_BUILTIN( athlon );
163 DEF_BUILTIN( x86_64 );
164 DEF_BUILTIN( x86_64_v2 );
165 DEF_BUILTIN( x86_64_v3 );
166 DEF_BUILTIN( x86_64_v4 );
167
168 DEF_BUILTIN( pentium3 );
169 DEF_BUILTIN( pentium4 );
170
171 DEF_BUILTIN( s390 );
172 DEF_BUILTIN( s390x );
173
175 DEF_BUILTIN( ppc64 );
176 DEF_BUILTIN( ppc64p7 );
177
178 DEF_BUILTIN( ppc64le );
179
180 DEF_BUILTIN( ia64 );
181
182 DEF_BUILTIN( alphaev67 );
183 DEF_BUILTIN( alphaev6 );
184 DEF_BUILTIN( alphapca56 );
185 DEF_BUILTIN( alphaev56 );
186 DEF_BUILTIN( alphaev5 );
187 DEF_BUILTIN( alpha );
188
189 DEF_BUILTIN( sparc64v );
190 DEF_BUILTIN( sparcv9v );
191 DEF_BUILTIN( sparc64 );
192 DEF_BUILTIN( sparcv9 );
193 DEF_BUILTIN( sparcv8 );
194 DEF_BUILTIN( sparc );
195
196 DEF_BUILTIN( aarch64 );
197
198 DEF_BUILTIN( armv7tnhl ); /* exists? */
199 DEF_BUILTIN( armv7thl ); /* exists? */
200
201 DEF_BUILTIN( armv7hnl ); /* legacy: */DEF_BUILTIN( armv7nhl );
202 DEF_BUILTIN( armv8hl );
203 DEF_BUILTIN( armv7hl );
204 DEF_BUILTIN( armv6hl );
205
206 DEF_BUILTIN( armv8l );
207 DEF_BUILTIN( armv7l );
208 DEF_BUILTIN( armv6l );
209 DEF_BUILTIN( armv5tejl );
210 DEF_BUILTIN( armv5tel );
211 DEF_BUILTIN( armv5tl );
212 DEF_BUILTIN( armv5l );
213 DEF_BUILTIN( armv4tl );
214 DEF_BUILTIN( armv4l );
215 DEF_BUILTIN( armv3l );
216
217 DEF_BUILTIN( riscv64 );
218
220
222 DEF_BUILTIN( sh4a );
223
224 DEF_BUILTIN( m68k );
225
226 DEF_BUILTIN( mips );
227 DEF_BUILTIN( mipsel );
228 DEF_BUILTIN( mips64 );
229 DEF_BUILTIN( mips64el );
230#undef DEF_BUILTIN
231
233 namespace
234 {
235
237 //
238 // CLASS NAME : CompatSet
239 //
247 struct ArchCompatSet : private base::NonCopyable
248 {
249 typedef Arch::CompatEntry CompatEntry;
250 typedef CompatEntry::CompatBits CompatBits;
251
252 typedef std::unordered_set<CompatEntry> Set;
253 typedef Set::iterator iterator;
254 typedef Set::const_iterator const_iterator;
255
257 static ArchCompatSet & instance()
258 {
259 static ArchCompatSet _instance;
260 return _instance;
261 }
262
266 const Arch::CompatEntry & assertDef( const std::string & archStr_r )
267 { return *_compatSet.insert( Arch::CompatEntry( archStr_r ) ).first; }
269 const Arch::CompatEntry & assertDef( IdString archStr_r )
270 { return *_compatSet.insert( Arch::CompatEntry( archStr_r ) ).first; }
271
272 const_iterator begin() const
273 { return _compatSet.begin(); }
274
275 const_iterator end() const
276 { return _compatSet.end(); }
277
278 struct DumpOnCompare
279 {
280 int operator()( const CompatEntry & lhs, const CompatEntry & rhs ) const
281 { return lhs._idBit.value() < rhs._idBit.value(); }
282 };
283
284 std::ostream & dumpOn( std::ostream & str ) const
285 {
286 str << "ArchCompatSet:";
287 std::list<CompatEntry> ov( _compatSet.begin(), _compatSet.end() );
288 ov.sort( DumpOnCompare() );
289 for_( it, ov.begin(), ov.end() )
290 {
291 str << endl << ' ' << *it;
292 }
293 return str;
294 }
295
296 private:
298 ArchCompatSet()
299 {
300 // _noarch must have _idBit 0.
301 // Other builtins have 1-bit set
302 // and are initialized done on the fly.
303 _compatSet.insert( Arch::CompatEntry( a_noarch(), 0 ) );
305 // Define the CompatibleWith relation:
306 //
307 // NOTE: Order of definition is significant! (Arch::compare)
308 // - define compatible (less) architectures first!
309 //
310 defCompatibleWith( a_i386(), a_noarch() );
311 defCompatibleWith( a_i486(), a_noarch(),a_i386() );
312 defCompatibleWith( a_i586(), a_noarch(),a_i386(),a_i486() );
313 defCompatibleWith( a_i686(), a_noarch(),a_i386(),a_i486(),a_i586() );
314 defCompatibleWith( a_athlon(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686() );
315 defCompatibleWith( a_x86_64(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon() );
316 defCompatibleWith( a_x86_64_v2(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon(),a_x86_64() );
317 defCompatibleWith( a_x86_64_v3(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon(),a_x86_64(),a_x86_64_v2() );
318 defCompatibleWith( a_x86_64_v4(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon(),a_x86_64(),a_x86_64_v2(),a_x86_64_v3() );
319
320 defCompatibleWith( a_pentium3(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686() );
321 defCompatibleWith( a_pentium4(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_pentium3() );
322
323 defCompatibleWith( a_ia64(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686() );
324 //
325 defCompatibleWith( a_s390(), a_noarch() );
326 defCompatibleWith( a_s390x(), a_noarch(),a_s390() );
327 //
328 defCompatibleWith( a_ppc(), a_noarch() );
329 defCompatibleWith( a_ppc64(), a_noarch(),a_ppc() );
330 defCompatibleWith( a_ppc64p7(), a_noarch(),a_ppc(),a_ppc64() );
331 //
332 defCompatibleWith( a_ppc64le(), a_noarch() );
333 //
334 defCompatibleWith( a_alpha(), a_noarch() );
335 defCompatibleWith( a_alphaev5(), a_noarch(),a_alpha() );
336 defCompatibleWith( a_alphaev56(), a_noarch(),a_alpha(),a_alphaev5() );
337 defCompatibleWith( a_alphapca56(), a_noarch(),a_alpha(),a_alphaev5(),a_alphaev56() );
338 defCompatibleWith( a_alphaev6(), a_noarch(),a_alpha(),a_alphaev5(),a_alphaev56(),a_alphapca56() );
339 defCompatibleWith( a_alphaev67(), a_noarch(),a_alpha(),a_alphaev5(),a_alphaev56(),a_alphapca56(),a_alphaev6() );
340 //
341 defCompatibleWith( a_sparc(), a_noarch() );
342 defCompatibleWith( a_sparcv8(), a_noarch(),a_sparc() );
343 defCompatibleWith( a_sparcv9(), a_noarch(),a_sparc(),a_sparcv8() );
344 defCompatibleWith( a_sparcv9v(), a_noarch(),a_sparc(),a_sparcv8(),a_sparcv9() );
345 //
346 defCompatibleWith( a_sparc64(), a_noarch(),a_sparc(),a_sparcv8(),a_sparcv9() );
347 defCompatibleWith( a_sparc64v(), a_noarch(),a_sparc(),a_sparcv8(),a_sparcv9(),a_sparcv9v(),a_sparc64() );
348 //
349 defCompatibleWith( a_armv3l(), a_noarch() );
350 defCompatibleWith( a_armv4l(), a_noarch(),a_armv3l() );
351 defCompatibleWith( a_armv4tl(), a_noarch(),a_armv3l(),a_armv4l() );
352 defCompatibleWith( a_armv5l(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl() );
353 defCompatibleWith( a_armv5tl(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l() );
354 defCompatibleWith( a_armv5tel(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl() );
355 defCompatibleWith( a_armv5tejl(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl(),a_armv5tel() );
356 defCompatibleWith( a_armv6l(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl(),a_armv5tel(),a_armv5tejl() );
357 defCompatibleWith( a_armv7l(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl(),a_armv5tel(),a_armv5tejl(),a_armv6l() );
358 defCompatibleWith( a_armv8l(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl(),a_armv5tel(),a_armv5tejl(),a_armv6l(),a_armv7l() );
359
360 defCompatibleWith( a_armv6hl(), a_noarch() );
361 defCompatibleWith( a_armv7hl(), a_noarch(),a_armv6hl() );
362 defCompatibleWith( a_armv8hl(), a_noarch(),a_armv7hl() );
363 defCompatibleWith( a_armv7hnl(), a_noarch(),a_armv7hl(),a_armv6hl() );
364 /*legacy: rpm uses v7hnl */
365 defCompatibleWith( a_armv7nhl(), a_noarch(),a_armv7hnl(),a_armv7hl(),a_armv6hl() );
366
367 /*?*/defCompatibleWith( a_armv7thl(), a_noarch(),a_armv7hl() );
368 /*?*/defCompatibleWith( a_armv7tnhl(), a_noarch(),a_armv7hl(),a_armv7nhl(),a_armv7thl() );
369
370 defCompatibleWith( a_aarch64(), a_noarch() );
371 //
372 defCompatibleWith( a_riscv64(), a_noarch() );
373 //
374 defCompatibleWith( a_sh3(), a_noarch() );
375 //
376 defCompatibleWith( a_sh4(), a_noarch() );
377 defCompatibleWith( a_sh4a(), a_noarch(),a_sh4() );
378
379 defCompatibleWith( a_m68k(), a_noarch() );
380
381 defCompatibleWith( a_mips(), a_noarch() );
382 defCompatibleWith( a_mipsel(), a_noarch() );
383 defCompatibleWith( a_mips64(), a_noarch() );
384 defCompatibleWith( a_mips64el(), a_noarch() );
385 //
387 // dumpOn( USR ) << endl;
388 }
389
390 private:
396 CompatBits::IntT nextIdBit() const
397 {
398 if ( CompatBits::size == _compatSet.size() )
399 {
400 // Provide more bits in CompatBits::IntT
401 INT << "Need more than " << CompatBits::size << " bits to encode architectures." << endl;
402 ZYPP_THROW( Exception("Need more bits to encode architectures.") );
403 }
404 CompatBits::IntT nextBit = CompatBits::IntT(1) << (_compatSet.size());
405 return nextBit;
406 }
407
411 const CompatEntry & assertCompatSetEntry( IdString archStr_r )
412 { return *_compatSet.insert( Arch::CompatEntry( archStr_r, nextIdBit() ) ).first; }
413
416 void defCompatibleWith( IdString targetArch_r,
417 IdString arch0_r,
418 IdString arch1_r = IdString(),
419 IdString arch2_r = IdString(),
420 IdString arch3_r = IdString(),
421 IdString arch4_r = IdString(),
422 IdString arch5_r = IdString(),
423 IdString arch6_r = IdString(),
424 IdString arch7_r = IdString(),
425 IdString arch8_r = IdString(),
426 IdString arch9_r = IdString() )
427 {
428 const CompatEntry & target( assertCompatSetEntry( targetArch_r ) );
429 target.addCompatBit( assertCompatSetEntry( arch0_r )._idBit );
430#define SETARG(N) if ( arch##N##_r.empty() ) return; target.addCompatBit( assertCompatSetEntry( arch##N##_r )._idBit )
431 SETARG(1); SETARG(2); SETARG(3); SETARG(4);
432 SETARG(5); SETARG(6); SETARG(7); SETARG(8); SETARG(9);
433#undef SETARG
434 }
435
436 private:
438 };
439
441 } // namespace
443
445 //
446 // CLASS NAME : Arch
447 //
449
451 // remaining Arch_* constants are defined by DEF_BUILTIN above.
452
454 //
455 // METHOD NAME : Arch::Arch
456 // METHOD TYPE : Ctor
457 //
459 : _entry( &ArchCompatSet::instance().assertDef( a_noarch() ) )
460 {}
461
463 : _entry( &ArchCompatSet::instance().assertDef( IdString(id_r) ) )
464 {}
465
466 Arch::Arch( const IdString & idstr_r )
467 : _entry( &ArchCompatSet::instance().assertDef( idstr_r ) )
468 {}
469
470 Arch::Arch( const std::string & str_r )
471 : _entry( &ArchCompatSet::instance().assertDef( str_r ) )
472 {}
473
474 Arch::Arch( const char * cstr_r )
475 : _entry( &ArchCompatSet::instance().assertDef( cstr_r ) )
476 {}
477
478 Arch::Arch( const CompatEntry & rhs )
479 : _entry( &rhs )
480 {}
481
483 //
484 // METHOD NAME : Arch::idStr
485 // METHOD TYPE : IdString
486 //
488 { return _entry->_idStr; }
489
491 //
492 // METHOD NAME : Arch::asString
493 // METHOD TYPE : const std::string &
494 //
495 const std::string & Arch::asString() const
496 { return _entry->_archStr; }
497
499 //
500 // METHOD NAME : Arch::isBuiltIn
501 // METHOD TYPE : bool
502 //
503 bool Arch::isBuiltIn() const
504 { return _entry->isBuiltIn(); }
505
507 //
508 // METHOD NAME : Arch::compatibleWith
509 // METHOD TYPE : bool
510 //
511 bool Arch::compatibleWith( const Arch & targetArch_r ) const
512 { return _entry->compatibleWith( *targetArch_r._entry ); }
513
515 //
516 // METHOD NAME : Arch::baseArch
517 // METHOD TYPE : Arch
518 //
520 {
521 // check the multilib archs:
522 if (Arch_x86_64.compatibleWith(*this))
523 {
524 return Arch_x86_64;
525 }
526 if (Arch_sparc64v.compatibleWith(*this))
527 {
528 return Arch_sparc64v;
529 }
530 if (Arch_sparc64.compatibleWith(*this))
531 {
532 return Arch_sparc64;
533 }
534 if (Arch_ppc64.compatibleWith(*this))
535 {
536 return Arch_ppc64;
537 }
538 if (Arch_s390x.compatibleWith(*this))
539 {
540 return Arch_s390x;
541 }
542 // Here: no multilib; return arch before noarch
543 CompatSet cset( compatSet( *this ) );
544 if ( cset.size() > 2 ) // systemArchitecture, ..., basearch, noarch
545 {
546 return *(++cset.rbegin());
547 }
548 return *this;
549 }
550
552 //
553 // METHOD NAME : Arch::compare
554 // METHOD TYPE : bool
555 //
556 int Arch::compare( const Arch & rhs ) const
557 { return _entry->compare( *rhs._entry ); }
558
560 //
561 // METHOD NAME : Arch::compatSet
562 // METHOD TYPE : Arch::CompatSet
563 //
564 Arch::CompatSet Arch::compatSet( const Arch & targetArch_r )
565 {
566 Arch::CompatSet ret;
567
568 for ( ArchCompatSet::const_iterator it = ArchCompatSet::instance().begin();
569 it != ArchCompatSet::instance().end(); ++it )
570 {
571 if ( it->compatibleWith( *targetArch_r._entry ) )
572 {
573 ret.insert( Arch(*it) );
574 }
575 }
576
577 return ret;
578 }
579
581} // namespace zypp
Set _compatSet
Definition: Arch.cc:437
#define SETARG(N)
#define DEF_BUILTIN(A)
Definition: Arch.cc:152
Architecture.
Definition: Arch.h:37
const Arch Arch_ppc64
Definition: Arch.h:205
const CompatEntry * _entry
Definition: Arch.h:148
Arch baseArch() const
Definition: Arch.cc:519
std::set< Arch, CompareByGT< Arch > > CompatSet
Reversed arch order, best Arch first.
Definition: Arch.h:117
const Arch Arch_sparc64
Definition: Arch.h:228
const Arch Arch_sparc64v
Definition: Arch.h:226
const Arch Arch_s390x
Definition: Arch.h:195
int compare(const Arch &rhs) const
Arch comparison.
Definition: Arch.cc:556
Arch()
Default ctor Arc_noarch.
Definition: Arch.cc:458
static CompatSet compatSet(const Arch &targetArch_r)
Return a set of all Arch's compatibleWith a targetArch_r.
Definition: Arch.cc:564
bool isBuiltIn() const
Whether this is a buitin (or known) architecture.
Definition: Arch.cc:503
IdString idStr() const
String representation of Arch.
Definition: Arch.cc:487
const std::string & asString() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Arch.cc:495
bool compatibleWith(const Arch &targetArch_r) const
Compatibility relation.
Definition: Arch.cc:511
const Arch Arch_x86_64
Definition: Arch.h:182
Access to the sat-pools string space.
Definition: IdString.h:43
sat::detail::IdType IdType
Definition: IdString.h:45
IdType id() const
Expert backdoor.
Definition: IdString.h:122
static const IdString Empty
Empty string.
Definition: IdString.h:77
An integral type used as BitField.
Definition: Bit.h:160
TInt value() const
Return the value.
Definition: Bit.h:179
String related utilities and Regular expression matching.
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition: NonCopyable.h:26
std::string numstring(char n, int w=0)
Definition: String.h:289
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::ostream & dumpOn(std::ostream &str, const Capability &obj)
Definition: Capability.cc:580
const Arch Arch_empty(IdString::Empty)
Holds an architecture ID and its compatible relation.
Definition: Arch.cc:39
void addCompatBit(const CompatBits &idBit_r) const
Definition: Arch.cc:62
std::ostream & operator<<(std::ostream &str, const Arch::CompatEntry &obj)
Stream output.
Definition: Arch.cc:110
bool compatibleWith(const CompatEntry &targetEntry_r) const
Return whether this is compatible with targetEntry_r.
Definition: Arch.cc:71
int compare(const CompatEntry &rhs) const
compare by score, then archStr.
Definition: Arch.cc:89
bool operator==(const Arch::CompatEntry &lhs, const Arch::CompatEntry &rhs)
Definition: Arch.cc:124
IdString::IdType id() const
Definition: Arch.cc:99
bool operator!=(const Arch::CompatEntry &lhs, const Arch::CompatEntry &rhs)
Definition: Arch.cc:127
CompatBits _idBit
Definition: Arch.cc:104
std::string _archStr
Definition: Arch.cc:103
bool isBuiltIn() const
Definition: Arch.cc:96
bit::BitField< uint64_t > CompatBits
Bitfield for architecture IDs and compatBits relation.
Definition: Arch.cc:44
CompatEntry(IdString archStr_r, CompatBits::IntT idBit_r=1)
Definition: Arch.cc:54
CompatBits _compatBits
Definition: Arch.cc:105
CompatEntry(const std::string &archStr_r, CompatBits::IntT idBit_r=1)
Definition: Arch.cc:46
TInt IntT
Definition: Bit.h:83
static const unsigned size
Definition: Bit.h:88
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:28
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:428
#define ZYPP_DEFINE_ID_HASHABLE(C)
Define hash function for id based classes.
Definition: Hash.h:26
#define INT
Definition: Logger.h:100