12 : priority(priority), _order(order), active(active), event(event) { }
31 using size_type = std::vector<pqueueElement>::size_type;
33 explicit pqueue(
bool smaller =
true) {
36 _anyCancelled =
false;
43 _elements.push_back(std::move(element));
44 std::push_heap(_elements.begin(), _elements.end(), _compare);
46 void push(
double priority, SEXP event)
49 pushElement(std::move(element));
62 throw std::length_error(
"Empty priority queue");
64 while(!_elements.empty()) {
65 std::pop_heap(_elements.begin(), _elements.end(), _compare);
71 }
catch(std::exception &ex) {
72 forward_exception_to_r(ex);
74 ::Rf_error(
"c++ exception (unknown reason)");
83 return List::create(_[
"priority"]=element.
priority, _[
"event"]=element.
event);
89 if (_elements.empty())
return true;
90 else if (!_anyCancelled)
return false;
92 for(
size_type i=0; i<_elements.size(); i++)
93 if(_elements[i].active)
return false;
108 for(
size_type i=0; i<_elements.size(); i++) {
109 if (as<bool>(predicate(_elements[i].event)))
110 _elements[i].active =
false;
112 _anyCancelled =
true;
120 std::for_each(_elements.begin(), _elements.end(), f);
122 std::make_heap(_elements.begin(), _elements.end(), _compare);
124 virtual ~
pqueue() =
default;
129 bool lower = as<bool>(_lower);
130 Rcpp::XPtr<pqueue> ptr(
new pqueue(lower));
135 XPtr<pqueue> ptr = as<XPtr<pqueue> >(_ptr);
136 double priority = as<double>(_priority);
137 ptr->push(priority, event);
142 XPtr<pqueue> ptr = as<XPtr<pqueue> >(_ptr);
143 return wrap(ptr->pop());
147 XPtr<pqueue> ptr = as<XPtr<pqueue> >(_ptr);
148 Function predicate = as<Function>(_predicate);
149 ptr->cancel(predicate);
154 XPtr<pqueue> ptr = as<XPtr<pqueue> >(_ptr);
155 return wrap(ptr->empty());
159 XPtr<pqueue> ptr = as<XPtr<pqueue> >(_ptr);