1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/sat/Solvable.h
12 #ifndef ZYPP_SAT_SOLVABLE_H
13 #define ZYPP_SAT_SOLVABLE_H
17 #include "zypp/base/SafeBool.h"
19 #include "zypp/sat/detail/PoolMember.h"
21 ///////////////////////////////////////////////////////////////////
23 { /////////////////////////////////////////////////////////////////
24 ///////////////////////////////////////////////////////////////////
26 { /////////////////////////////////////////////////////////////////
28 class PoolId : private base::SafeBool<PoolId>
31 PoolId() : _id( 0 ) {}
32 PoolId( int id_r ) : _id( id_r ) {}
33 static const PoolId noid;
34 /** Evaluate \ref PoolId in a boolean context (\c != \c 0). */
35 using base::SafeBool<PoolId>::operator bool_type;
36 int get() const { return _id; }
38 friend base::SafeBool<PoolId>::operator bool_type() const;
39 bool boolTest() const { return _id; }
44 /** \relates PoolId Stream output */
45 std::ostream & operator<<( std::ostream & str, const PoolId & obj );
47 /** \relates PoolId */
48 inline bool operator==( const PoolId & lhs, const PoolId & rhs )
49 { return lhs.get() == rhs.get(); }
51 /** \relates PoolId */
52 inline bool operator!=( const PoolId & lhs, const PoolId & rhs )
53 { return lhs.get() != rhs.get(); }
55 typedef PoolId NameId;
57 typedef PoolId ArchId;
58 typedef PoolId VendorId;
60 ///////////////////////////////////////////////////////////////////
62 // CLASS NAME : Solvable
65 class Solvable : protected detail::PoolMember,
66 private base::SafeBool<Solvable>
69 /** Default ctor creates \ref nosolvable.*/
71 : _id( detail::noSolvableId ) {}
73 /** \ref PoolImpl ctor. */
74 explicit Solvable( detail::SolvableIdType id_r )
78 /** Represents no \ref Solvable. */
79 static const Solvable nosolvable;
81 /** Evaluate \ref Solvable in a boolean context (\c != \c nosolvable). */
82 using base::SafeBool<Solvable>::operator bool_type;
88 VendorId vendor() const;
93 const char * string( const PoolId & id_r ) const;
95 const char * nameStr() const { return string( name() ); }
96 const char * evrStr() const { return string( evr() ); }
97 const char * archStr() const { return string( arch() ); }
98 const char * vendorStr() const { return string( vendor() ); }
101 /** Return next Solvable in \ref Pool (or \ref nosolvable). */
102 Solvable nextInPool() const;
103 /** Return next Solvable in \ref Repo (or \ref nosolvable). */
104 Solvable nextInRepo() const;
106 /** Expert backdoor. */
107 ::_Solvable * get() const;
108 /** Expert backdoor. */
109 detail::SolvableIdType id() const { return _id; }
111 friend base::SafeBool<Solvable>::operator bool_type() const;
112 bool boolTest() const { return get(); }
114 detail::SolvableIdType _id;
116 ///////////////////////////////////////////////////////////////////
118 /** \relates Solvable Stream output */
119 std::ostream & operator<<( std::ostream & str, const Solvable & obj );
121 /** \relates Solvable */
122 inline bool operator==( const Solvable & lhs, const Solvable & rhs )
123 { return lhs.get() == rhs.get(); }
125 /** \relates Solvable */
126 inline bool operator!=( const Solvable & lhs, const Solvable & rhs )
127 { return lhs.get() != rhs.get(); }
129 ///////////////////////////////////////////////////////////////////
131 { /////////////////////////////////////////////////////////////////
132 ///////////////////////////////////////////////////////////////////
134 // CLASS NAME : SolvableIterator
137 class SolvableIterator : public boost::iterator_adaptor<
138 SolvableIterator // Derived
139 , ::_Solvable* // Base
141 , boost::single_pass_traversal_tag // CategoryOrTraversal
142 , Solvable // Reference
147 : SolvableIterator::iterator_adaptor_( 0 )
150 explicit SolvableIterator( const Solvable & val_r )
151 : SolvableIterator::iterator_adaptor_( 0 )
152 { assignVal( val_r ); }
154 explicit SolvableIterator( SolvableIdType id_r )
155 : SolvableIterator::iterator_adaptor_( 0 )
156 { assignVal( Solvable( id_r ) ); }
159 friend class boost::iterator_core_access;
162 { assignVal( _val.nextInPool() ); }
164 Solvable dereference() const
167 void assignVal( const Solvable & val_r )
168 { _val = val_r; base_reference() = _val.get(); }
172 ///////////////////////////////////////////////////////////////////
173 /////////////////////////////////////////////////////////////////
174 } // namespace detail
175 ///////////////////////////////////////////////////////////////////
177 /////////////////////////////////////////////////////////////////
179 ///////////////////////////////////////////////////////////////////
180 /////////////////////////////////////////////////////////////////
182 ///////////////////////////////////////////////////////////////////
183 #endif // ZYPP_SAT_SOLVABLE_H