/usr/include/stxxl/bits/common
NameSizeModeActions
addressable_queues.h60360644editdlrm
aligned_alloc.h53870644editdlrm
binary_buffer.h200630644editdlrm
cmdline.h234820644editdlrm
condition_variable.h21410644editdlrm
counting_ptr.h164040644editdlrm
error_handling.h77020644editdlrm
exceptions.h20000644editdlrm
exithandler.h14000644editdlrm
external_shared_ptr.h37600644editdlrm
is_sorted.h18180644editdlrm
log.h12650644editdlrm
mutex.h33320644editdlrm
new_alloc.h39010644editdlrm
onoff_switch.h21460644editdlrm
rand.h81910644editdlrm
seed.h8630644editdlrm
semaphore.h24490644editdlrm
settings.h9710644editdlrm
simple_vector.h46390644editdlrm
state.h16870644editdlrm
timer.h46620644editdlrm
tmeta.h29880644editdlrm
tuple.h195530644editdlrm
types.h19230644editdlrm
uint_types.h95720644editdlrm
utils.h83800644editdlrm
Edit: /usr/include/stxxl/bits/common/addressable_queues.h (6036B)
/*************************************************************************** * include/stxxl/bits/common/addressable_queues.h * * Part of the STXXL. See http://stxxl.sourceforge.net * * Copyright (C) 2010-2011 Raoul Steffen * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) **************************************************************************/ #ifndef STXXL_COMMON_ADDRESSABLE_QUEUES_HEADER #define STXXL_COMMON_ADDRESSABLE_QUEUES_HEADER #include #include #include #include STXXL_BEGIN_NAMESPACE //! An internal fifo queue that allows removing elements addressed with (a copy //! of) themselves. //! \tparam KeyType Type of contained elements. template class addressable_fifo_queue { typedef std::list container_type; typedef typename container_type::iterator container_iterator; typedef std::map meta_type; typedef typename meta_type::iterator meta_iterator; container_type vals; meta_type meta; public: //! Type of handle to an entry. For use with insert and remove. typedef meta_iterator handle; //! Create an empty queue. addressable_fifo_queue() { } ~addressable_fifo_queue() { } //! Check if queue is empty. //! \return If queue is empty. bool empty() const { return vals.empty(); } //! Insert new element. If the element is already in, it is moved to the //! back. //! \param e Element to insert. //! \return pair Iterator to element; if element was newly //! inserted. std::pair insert(const KeyType& e) { container_iterator ei = vals.insert(vals.end(), e); std::pair r = meta.insert(std::make_pair(e, ei)); if (! r.second) { // element was already in vals.erase(r.first->second); r.first->second = ei; } return r; } //! Erase element from the queue. //! \param e Element to remove. //! \return If element was in. bool erase(const KeyType& e) { handle mi = meta.find(e); if (mi == meta.end()) return false; vals.erase(mi->second); meta.erase(mi); return true; } //! Erase element from the queue. //! \param i Iterator to element to remove. void erase(handle i) { vals.erase(i->second); meta.erase(i); } //! Access top element in the queue. //! \return Const reference to top element. const KeyType & top() const { return vals.front(); } //! Remove top element from the queue. //! \return Top element. KeyType pop() { assert(! empty()); const KeyType e = top(); meta.erase(e); vals.pop_front(); return e; } }; //! An internal priority queue that allows removing elements addressed with (a //! copy of) themselves. //! \tparam KeyType Type of contained elements. //! \tparam PriorityType Type of Priority. template > class addressable_priority_queue { struct cmp // like < for pair, but uses Cmp for < on first { bool operator () (const std::pair& left, const std::pair& right) const { Cmp c; return c(left.first, right.first) || ((! c(right.first, left.first)) && left.second < right.second); } }; typedef std::set, cmp> container_type; typedef typename container_type::iterator container_iterator; typedef std::map meta_type; typedef typename meta_type::iterator meta_iterator; container_type vals; meta_type meta; public: //! Type of handle to an entry. For use with insert and remove. typedef meta_iterator handle; //! Create an empty queue. addressable_priority_queue() { } ~addressable_priority_queue() { } //! Check if queue is empty. //! \return If queue is empty. bool empty() const { return vals.empty(); } //! Insert new element. If the element is already in, it's priority is updated. //! \param e Element to insert. //! \param o Priority of element. //! \return pair Iterator to element; if element was newly inserted. std::pair insert(const KeyType& e, const PriorityType o) { std::pair s = vals.insert(std::make_pair(o, e)); std::pair r = meta.insert(std::make_pair(e, s.first)); if (! r.second && s.second) { // was already in with different priority vals.erase(r.first->second); r.first->second = s.first; } return r; } //! Erase element from the queue. //! \param e Element to remove. //! \return If element was in. bool erase(const KeyType& e) { handle mi = meta.find(e); if (mi == meta.end()) return false; vals.erase(mi->second); meta.erase(mi); return true; } //! Erase element from the queue. //! \param i Iterator to element to remove. void erase(handle i) { vals.erase(i->second); meta.erase(i); } //! Access top (= min) element in the queue. //! \return Const reference to top element. const KeyType & top() const { return vals.begin()->second; } //! Remove top (= min) element from the queue. //! \return Top element. KeyType pop() { assert(! empty()); const KeyType e = top(); meta.erase(e); vals.erase(vals.begin()); return e; } }; STXXL_END_NAMESPACE #endif // !STXXL_COMMON_ADDRESSABLE_QUEUES_HEADER