| 1 | // | 
|---|
| 2 | //======================================================================= | 
|---|
| 3 | // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. | 
|---|
| 4 | // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek | 
|---|
| 5 | // | 
|---|
| 6 | // Distributed under the Boost Software License, Version 1.0. (See | 
|---|
| 7 | // accompanying file LICENSE_1_0.txt or copy at | 
|---|
| 8 | // http://www.boost.org/LICENSE_1_0.txt) | 
|---|
| 9 | //======================================================================= | 
|---|
| 10 | // | 
|---|
| 11 | #ifndef BOOST_GRAPH_DETAIL_MUTABLE_HEAP_H | 
|---|
| 12 | #define BOOST_GRAPH_DETAIL_MUTABLE_HEAP_H | 
|---|
| 13 |  | 
|---|
| 14 | /* | 
|---|
| 15 |   There are a few things wrong with this set of functions. | 
|---|
| 16 |  | 
|---|
| 17 |   ExternalData should be removed, it is not part of the core | 
|---|
| 18 |   algorithm. It can be handled inside the tree nodes. | 
|---|
| 19 |  | 
|---|
| 20 |   The swap() should be replaced by assignment since its use is causing | 
|---|
| 21 |   the number of memory references to double. | 
|---|
| 22 |  | 
|---|
| 23 |   The min_element should be replaced by a fixed length loop | 
|---|
| 24 |   (fixed at d for d-heaps). | 
|---|
| 25 |  | 
|---|
| 26 |   The member functions of TreeNode should be changed to global | 
|---|
| 27 |   functions. | 
|---|
| 28 |  | 
|---|
| 29 |   These functions will be replaced by those in heap_tree.h | 
|---|
| 30 |  | 
|---|
| 31 |  */ | 
|---|
| 32 |  | 
|---|
| 33 | namespace boost { | 
|---|
| 34 |  | 
|---|
| 35 |   template <class TreeNode, class Compare, class ExternalData> | 
|---|
| 36 |   inline TreeNode up_heap(TreeNode x, const Compare& comp, ExternalData& edata) { | 
|---|
| 37 |     while (x.has_parent() && comp(x, x.parent())) | 
|---|
| 38 |       x.swap(x.parent(), edata); | 
|---|
| 39 |     return x; | 
|---|
| 40 |   } | 
|---|
| 41 |  | 
|---|
| 42 |   template <class TreeNode, class Compare, class ExternalData> | 
|---|
| 43 |   inline TreeNode down_heap(TreeNode x, const Compare& comp, ExternalData& edata) { | 
|---|
| 44 |     while (x.children().size() > 0) { | 
|---|
| 45 |       typename TreeNode::children_type::iterator  | 
|---|
| 46 |         child_iter = std::min_element(x.children().begin(), | 
|---|
| 47 |                                       x.children().end(),  | 
|---|
| 48 |                                       comp); | 
|---|
| 49 |       if (comp(*child_iter, x)) | 
|---|
| 50 |         x.swap(*child_iter, edata); | 
|---|
| 51 |       else | 
|---|
| 52 |         break; | 
|---|
| 53 |     } | 
|---|
| 54 |     return x; | 
|---|
| 55 |   } | 
|---|
| 56 |  | 
|---|
| 57 |   template <class TreeNode, class Compare, class ExternalData> | 
|---|
| 58 |   inline void update_heap(TreeNode x, const Compare& comp, ExternalData& edata) { | 
|---|
| 59 |     x = down_heap(x, comp, edata); | 
|---|
| 60 |     (void)up_heap(x, comp, edata); | 
|---|
| 61 |   } | 
|---|
| 62 |  | 
|---|
| 63 | } | 
|---|
| 64 | #endif | 
|---|