1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 * Copyright (c) 2018 Frank Fischer <frank-fischer@shadow-soft.de>
 *
 * This program is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see  <http://www.gnu.org/licenses/>
 */

mod binheap;
pub use self::binheap::BinHeap;

pub trait ItemPriQueue<K, V> {
    /// Handle for an item in the queue.
    type Item;

    /// Return `true` iff the queue contains no element.
    fn is_empty(&self) -> bool;

    /// Remove all elements from the queue.
    fn clear(&mut self);

    /// Push the element with given `key` and `value` onto the queue.
    ///
    /// Return a handle referencing the element. That handle can be used in a
    /// subsequent call to `decrease_key`.
    fn push(&mut self, key: K, value: V) -> Self::Item;

    /// Decrease the value of some item in the queue.
    ///
    /// Returns `true` if the new value is smaller than the old one.
    fn decrease_key(&mut self, item: &mut Self::Item, value: V) -> bool;

    /// Remove and return the element with the smallest value from the queue or `None` if
    /// the queue is empty.
    fn pop_min(&mut self) -> Option<(K, V)>;

    /// Return the current value associated with some item in the queue.
    fn value(&self, item: &Self::Item) -> &V;
}

impl<'a, P, K, V> ItemPriQueue<K, V> for &'a mut P
where
    P: ItemPriQueue<K, V>,
{
    type Item = P::Item;

    fn is_empty(&self) -> bool {
        (**self).is_empty()
    }

    fn clear(&mut self) {
        (**self).clear()
    }

    fn push(&mut self, key: K, value: V) -> Self::Item {
        (**self).push(key, value)
    }

    fn decrease_key(&mut self, item: &mut Self::Item, value: V) -> bool {
        (**self).decrease_key(item, value)
    }

    fn pop_min(&mut self) -> Option<(K, V)> {
        (**self).pop_min()
    }

    fn value(&self, item: &Self::Item) -> &V {
        (**self).value(item)
    }
}