1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/sat/Queue.cc
13 #include <solv/queue.h>
16 #include "zypp/base/LogTools.h"
18 #include "zypp/sat/Queue.h"
19 #include "zypp/sat/Solvable.h"
23 ///////////////////////////////////////////////////////////////////
28 struct ::_Queue * rwcowClone<struct ::_Queue>( const struct ::_Queue * rhs )
30 struct ::_Queue * ret = new ::_Queue;
31 ::queue_init_clone( ret, const_cast<struct ::_Queue *>(rhs) );
35 ///////////////////////////////////////////////////////////////////
40 : _pimpl( new ::_Queue )
41 { ::queue_init( _pimpl.get() ); }
44 { ::queue_free( _pimpl.get() ); }
46 bool Queue::empty() const
47 { return( _pimpl->count == 0 ); }
49 Queue::size_type Queue::size() const
50 { return _pimpl->count; }
52 Queue::const_iterator Queue::begin() const
53 { return _pimpl->elements; }
55 Queue::const_iterator Queue::end() const
56 { return _pimpl->elements + _pimpl->count;}
58 Queue::const_iterator Queue::find( value_type val_r ) const
60 for_( it, begin(), end() )
66 Queue::value_type Queue::first() const
69 return *_pimpl->elements;
73 Queue::value_type Queue::last() const
76 return _pimpl->elements[_pimpl->count-1];
80 #define M_RANGE_CKECK(IDX,LOC) if ( IDX >= size_type(_pimpl->count) ) throw std::out_of_range( "zypp::sat::Queue::" LOC )
82 const Queue::value_type & Queue::at( size_type idx_r ) const
83 { M_RANGE_CKECK( idx_r, "at" ); return _pimpl->elements[idx_r]; }
85 Queue::value_type & Queue::at( size_type idx_r )
86 { M_RANGE_CKECK( idx_r, "at" ); return _pimpl->elements[idx_r]; }
88 const Queue::value_type & Queue::operator[]( size_type idx_r ) const
89 { return _pimpl->elements[idx_r]; }
91 Queue::value_type & Queue::operator[]( size_type idx_r )
92 { return _pimpl->elements[idx_r]; }
95 { ::queue_empty( *this ); }
97 void Queue::remove( value_type val_r )
99 for ( const_iterator it( find( val_r ) ); it != end(); it = find( val_r ) )
100 ::queue_delete( _pimpl.get(), it - begin() );
103 void Queue::push( value_type val_r )
104 { ::queue_push( _pimpl.get(), val_r ); }
106 void Queue::pushUnique( value_type val_r )
107 { ::queue_pushunique( _pimpl.get(), val_r ); }
109 Queue::value_type Queue::pop()
110 { return ::queue_pop( _pimpl.get() ); }
112 void Queue::push_front( value_type val_r )
113 { ::queue_unshift( _pimpl.get(), val_r ); }
115 Queue::value_type Queue::pop_front()
116 { return ::queue_shift( _pimpl.get() ); }
118 Queue::operator struct ::_Queue *() // COW: nonconst version can't be inlined
119 { return _pimpl.get(); } // without exposing struct ::_Queue
121 std::ostream & operator<<( std::ostream & str, const Queue & obj )
122 { return dumpRangeLine( str << "Queue ", obj.begin(), obj.end() ); }
124 std::ostream & dumpOn( std::ostream & str, const Queue & obj )
130 for_( it, obj.begin(), obj.end() )
131 str << " " << Solvable(*it) << endl;
136 bool operator==( const Queue & lhs, const Queue & rhs )
138 const struct ::_Queue * l = lhs;
139 const struct ::_Queue * r = rhs;
140 return( l == r || ( l->count == r->count && ::memcmp( l->elements, r->elements, l->count ) == 0 ) );
144 ///////////////////////////////////////////////////////////////////
146 ///////////////////////////////////////////////////////////////////