libzypp  17.38.8
queue.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include "queue.h"
13 
14 extern "C"
15 {
16 #include <solv/queue.h>
17 }
18 #include <iostream>
21 #include <zypp/ng/sat/solvable.h>
22 
23 using std::endl;
24 
25 
26 // defined in zypp::sat::Queue , CQueue type is the same for zypp and zyppng
27 #ifdef ZYPPNG
28 namespace zypp {
29  template<>
30  sat::detail::CQueue * rwcowClone<sat::detail::CQueue>( const sat::detail::CQueue * rhs )
31  {
33  ::queue_init_clone( ret, const_cast<sat::detail::CQueue *>(rhs) );
34  return ret;
35  }
36 }
37 #endif
38 
40 namespace 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 
99  void Queue::clear()
100  { ::queue_empty( *this ); }
101 
102  void Queue::remove( value_type val_r )
103  {
104  for ( const_iterator it( find( val_r ) ); it != end(); it = find( val_r ) )
105  ::queue_delete( _pimpl.get(), it - begin() );
106  }
107 
108  void Queue::push( value_type val_r )
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
unsigned int size_type
Definition: queue.h:39
~Queue()
Dtor.
Definition: queue.cc:50
bool operator==(const Capability &lhs, const Capability &rhs)
relates: Capability
Definition: capability.h:311
bool empty() const
Definition: queue.cc:53
value_type first() const
Return the 1st Id in the queue or 0 if empty.
Definition: queue.cc:71
detail::IdType value_type
Definition: queue.h:40
zypp::sat::detail::CQueue CQueue
Definition: poolconstants.h:37
Queue()
Default ctor: empty Queue.
Definition: queue.cc:46
const value_type & operator[](size_type idx_r) const
Return the Id at idx_r in the queue (no range check)
Definition: queue.cc:93
const value_type * const_iterator
Definition: queue.h:41
size_type size() const
Definition: queue.cc:56
const value_type & at(size_type idx_r) const
Return the Id at idx_r in the queue.
Definition: queue.cc:87
void remove(value_type val_r)
Remove all occurances of val_r from the queue.
Definition: queue.cc:102
value_type pop()
Pop and return the last Id from the queue or 0 if empty.
Definition: queue.cc:114
void pushUnique(value_type val_r)
Push a value if it&#39;s not yet in the Queue.
Definition: queue.cc:111
void push(value_type val_r)
Push a value to the end off the Queue.
Definition: queue.cc:108
const_iterator begin() const
Definition: queue.cc:59
Namespace routing for C++20 ranges and C++23 ranges::to<T>() backport.
value_type pop_front()
Pop and return the 1st Id from the queue or 0 if empty.
Definition: queue.cc:120
#define M_RANGE_CKECK(IDX, LOC)
Definition: queue.cc:85
value_type last() const
Return the last Id in the queue or 0 if empty.
Definition: queue.cc:78
Libsolv Id queue wrapper.
Definition: queue.h:36
void push_front(value_type val_r)
Push a value to the beginning off the Queue.
Definition: queue.cc:117
const_iterator end() const
Definition: queue.cc:62
const D * get() const
Definition: PtrTypes.h:519
::s_Queue CQueue
Wrapped libsolv C data type exposed as backdoor.
Definition: PoolDefines.h:35
const_iterator find(value_type val_r) const
Return iterator to the 1st occurance of val_r or end.
Definition: queue.cc:65
void clear()
Clear the queue.
Definition: queue.cc:99
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
zypp::RWCOW_pointer< zypp::sat::detail::CQueue > _pimpl
Pointer to implementation.
Definition: queue.h:116