libzypp 17.38.8
queue.cc
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
11
12#include "queue.h"
13
14extern "C"
15{
16#include <solv/queue.h>
17}
18#include <iostream>
22
23using std::endl;
24
25
26// defined in zypp::sat::Queue , CQueue type is the same for zypp and zyppng
27#ifdef ZYPPNG
28namespace zypp {
29 template<>
31 {
33 ::queue_init_clone( ret, const_cast<sat::detail::CQueue *>(rhs) );
34 return ret;
35 }
36}
37#endif
38
40namespace zyppng
41{
43 namespace sat
44 {
45
47 : _pimpl( new detail::CQueue )
48 { ::queue_init( _pimpl.get() ); }
49
51 { ::queue_free( _pimpl.get() ); }
52
53 bool Queue::empty() const
54 { return( _pimpl->count == 0 ); }
55
57 { return _pimpl->count; }
58
60 { return _pimpl->elements; }
61
63 { return _pimpl->elements + _pimpl->count;}
64
66 {
67 auto it = ranges::find( *this, val_r );
68 return it != end() ? it : end();
69 }
70
72 {
73 if ( _pimpl->count )
74 return *_pimpl->elements;
75 return 0;
76 }
77
79 {
80 if ( _pimpl->count )
81 return _pimpl->elements[_pimpl->count-1];
82 return 0;
83 }
84
85#define M_RANGE_CKECK(IDX,LOC) if ( IDX >= size_type(_pimpl->count) ) throw std::out_of_range( "zypp::sat::Queue::" LOC )
86
87 const Queue::value_type & Queue::at( size_type idx_r ) const
88 { M_RANGE_CKECK( idx_r, "at" ); return _pimpl->elements[idx_r]; }
89
91 { M_RANGE_CKECK( idx_r, "at" ); return _pimpl->elements[idx_r]; }
92
94 { return _pimpl->elements[idx_r]; }
95
97 { return _pimpl->elements[idx_r]; }
98
100 { ::queue_empty( *this ); }
101
103 {
104 for ( const_iterator it( find( val_r ) ); it != end(); it = find( val_r ) )
105 ::queue_delete( _pimpl.get(), it - begin() );
106 }
107
109 { ::queue_push( _pimpl.get(), val_r ); }
110
112 { ::queue_pushunique( _pimpl.get(), val_r ); }
113
115 { return ::queue_pop( _pimpl.get() ); }
116
118 { ::queue_unshift( _pimpl.get(), val_r ); }
119
121 { return ::queue_shift( _pimpl.get() ); }
122
123 Queue::operator detail::CQueue *() // COW: nonconst version can't be inlined
124 { return _pimpl.get(); } // without exposing detail::CQueue
125
126 bool operator==( const Queue & lhs, const Queue & rhs )
127 {
128 const detail::CQueue * l = lhs;
129 const detail::CQueue * r = rhs;
130 return( l == r || ( l->count == r->count && ::memcmp( l->elements, r->elements, l->count * sizeof( *l->elements ) ) == 0 ) );
131 }
132
133 } // namespace sat
135} // namespace zyppng
#define M_RANGE_CKECK(IDX, LOC)
Definition Map.cc:79
const_iterator find(value_type val_r) const
Return iterator to the 1st occurance of val_r or end.
Definition Queue.cc:58
value_type pop_front()
Pop and return the 1st Id from the queue or 0 if empty.
Definition Queue.cc:115
void remove(value_type val_r)
Remove all occurances of val_r from the queue.
Definition Queue.cc:97
value_type first() const
Return the 1st Id in the queue or 0 if empty.
Definition Queue.cc:66
void push_front(value_type val_r)
Push a value to the beginning off the Queue.
Definition Queue.cc:112
~Queue()
Dtor.
Definition Queue.cc:43
size_type size() const
Definition Queue.cc:49
value_type last() const
Return the last Id in the queue or 0 if empty.
Definition Queue.cc:73
const_iterator end() const
Definition Queue.cc:55
Queue()
Default ctor: empty Queue.
Definition Queue.cc:39
const_iterator begin() const
Definition Queue.cc:52
value_type pop()
Pop and return the last Id from the queue or 0 if empty.
Definition Queue.cc:109
void clear()
Clear the queue.
Definition Queue.cc:94
const value_type & operator[](size_type idx_r) const
Return the Id at idx_r in the queue (no range check).
Definition Queue.cc:88
const value_type & at(size_type idx_r) const
Return the Id at idx_r in the queue.
Definition Queue.cc:82
bool empty() const
Definition Queue.cc:46
void push(value_type val_r)
Push a value to the end off the Queue.
Definition Queue.cc:103
void pushUnique(value_type val_r)
Push a value if it's not yet in the Queue.
Definition Queue.cc:106
Libsolv Id queue wrapper.
Definition queue.h:37
const value_type * const_iterator
Definition queue.h:41
const_iterator find(value_type val_r) const
Return iterator to the 1st occurance of val_r or end.
Definition queue.cc:65
unsigned int size_type
Definition queue.h:39
detail::IdType value_type
Definition queue.h:40
const_iterator end() const
Definition queue.cc:62
const_iterator begin() const
Definition queue.cc:59
zypp::RWCOW_pointer< zypp::sat::detail::CQueue > _pimpl
Pointer to implementation.
Definition queue.h:116
::s_Queue CQueue
Wrapped libsolv C data type exposed as backdoor.
Definition PoolDefines.h:35
bool operator==(const FileConflicts &lhs, const FileConflicts &rhs)
relates: FileConflicts
Easy-to use interface to the ZYPP dependency resolver.
sat::detail::CQueue * rwcowClone< sat::detail::CQueue >(const sat::detail::CQueue *rhs)
relates: Queue Clone function for RWCOW_pointer
Definition Queue.cc:28
CLASS NAME : detail::DIWrap.
Definition cap2str.cc:14
zypp::sat::detail::CQueue CQueue
This file contains private API, this might break at any time between releases.
Namespace routing for C++20 ranges and C++23 ranges::to<T>() backport.