# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1225831079 -3600
# Node ID f58410582b9bac22c553618b60d5fce2ad4e89ab
# Parent 75cf49ce539059c67130b03592325fcbd5e4f96c
Doc improvements for the graph related tools in lemon/bits
diff --git a/lemon/bits/alteration_notifier.h b/lemon/bits/alteration_notifier.h
|
a
|
b
|
|
| 35 | 35 | // \brief Notifier class to notify observes about alterations in |
| 36 | 36 | // a container. |
| 37 | 37 | // |
| 38 | | // The simple graph's can be refered as two containers, one node container |
| 39 | | // and one edge container. But they are not standard containers they |
| 40 | | // does not store values directly they are just key continars for more |
| 41 | | // value containers which are the node and edge maps. |
| | 38 | // The simple graphs can be refered as two containers: a node container |
| | 39 | // and an edge container. But they do not store values directly, they |
| | 40 | // are just key continars for more value containers, which are the |
| | 41 | // node and edge maps. |
| 42 | 42 | // |
| 43 | | // The graph's node and edge sets can be changed as we add or erase |
| | 43 | // The node and edge sets of the graphs can be changed as we add or erase |
| 44 | 44 | // nodes and edges in the graph. LEMON would like to handle easily |
| 45 | 45 | // that the node and edge maps should contain values for all nodes or |
| 46 | 46 | // edges. If we want to check on every indicing if the map contains |
| 47 | 47 | // the current indicing key that cause a drawback in the performance |
| 48 | | // in the library. We use another solution we notify all maps about |
| | 48 | // in the library. We use another solution: we notify all maps about |
| 49 | 49 | // an alteration in the graph, which cause only drawback on the |
| 50 | 50 | // alteration of the graph. |
| 51 | 51 | // |
| 52 | | // This class provides an interface to the container. The \e first() and \e |
| 53 | | // next() member functions make possible to iterate on the keys of the |
| 54 | | // container. The \e id() function returns an integer id for each key. |
| 55 | | // The \e maxId() function gives back an upper bound of the ids. |
| | 52 | // This class provides an interface to a node or edge container. |
| | 53 | // The first() and next() member functions make possible |
| | 54 | // to iterate on the keys of the container. |
| | 55 | // The id() function returns an integer id for each key. |
| | 56 | // The maxId() function gives back an upper bound of the ids. |
| 56 | 57 | // |
| 57 | 58 | // For the proper functonality of this class, we should notify it |
| 58 | | // about each alteration in the container. The alterations have four type |
| 59 | | // as \e add(), \e erase(), \e build() and \e clear(). The \e add() and |
| 60 | | // \e erase() signals that only one or few items added or erased to or |
| 61 | | // from the graph. If all items are erased from the graph or from an empty |
| 62 | | // graph a new graph is builded then it can be signaled with the |
| | 59 | // about each alteration in the container. The alterations have four type: |
| | 60 | // add(), erase(), build() and clear(). The add() and |
| | 61 | // erase() signal that only one or few items added or erased to or |
| | 62 | // from the graph. If all items are erased from the graph or if a new graph |
| | 63 | // is built from an empty graph, then it can be signaled with the |
| 63 | 64 | // clear() and build() members. Important rule that if we erase items |
| 64 | | // from graph we should first signal the alteration and after that erase |
| | 65 | // from graphs we should first signal the alteration and after that erase |
| 65 | 66 | // them from the container, on the other way on item addition we should |
| 66 | 67 | // first extend the container and just after that signal the alteration. |
| 67 | 68 | // |
| 68 | 69 | // The alteration can be observed with a class inherited from the |
| 69 | | // \e ObserverBase nested class. The signals can be handled with |
| | 70 | // ObserverBase nested class. The signals can be handled with |
| 70 | 71 | // overriding the virtual functions defined in the base class. The |
| 71 | 72 | // observer base can be attached to the notifier with the |
| 72 | | // \e attach() member and can be detached with detach() function. The |
| | 73 | // attach() member and can be detached with detach() function. The |
| 73 | 74 | // alteration handlers should not call any function which signals |
| 74 | 75 | // an other alteration in the same notifier and should not |
| 75 | 76 | // detach any observer from the notifier. |
| 76 | 77 | // |
| 77 | | // Alteration observers try to be exception safe. If an \e add() or |
| 78 | | // a \e clear() function throws an exception then the remaining |
| | 78 | // Alteration observers try to be exception safe. If an add() or |
| | 79 | // a clear() function throws an exception then the remaining |
| 79 | 80 | // observeres will not be notified and the fulfilled additions will |
| 80 | | // be rolled back by calling the \e erase() or \e clear() |
| 81 | | // functions. Thence the \e erase() and \e clear() should not throw |
| 82 | | // exception. Actullay, it can be throw only \ref ImmediateDetach |
| 83 | | // exception which detach the observer from the notifier. |
| | 81 | // be rolled back by calling the erase() or clear() functions. |
| | 82 | // Hence erase() and clear() should not throw exception. |
| | 83 | // Actullay, they can throw only \ref ImmediateDetach exception, |
| | 84 | // which detach the observer from the notifier. |
| 84 | 85 | // |
| 85 | | // There are some place when the alteration observing is not completly |
| | 86 | // There are some cases, when the alteration observing is not completly |
| 86 | 87 | // reliable. If we want to carry out the node degree in the graph |
| 87 | | // as in the \ref InDegMap and we use the reverseEdge that cause |
| | 88 | // as in the \ref InDegMap and we use the reverseArc(), then it cause |
| 88 | 89 | // unreliable functionality. Because the alteration observing signals |
| 89 | | // only erasing and adding but not the reversing it will stores bad |
| 90 | | // degrees. The sub graph adaptors cannot signal the alterations because |
| 91 | | // just a setting in the filter map can modify the graph and this cannot |
| 92 | | // be watched in any way. |
| | 90 | // only erasing and adding but not the reversing, it will stores bad |
| | 91 | // degrees. Apart form that the subgraph adaptors cannot even signal |
| | 92 | // the alterations because just a setting in the filter map can modify |
| | 93 | // the graph and this cannot be watched in any way. |
| 93 | 94 | // |
| 94 | 95 | // \param _Container The container which is observed. |
| 95 | 96 | // \param _Item The item type which is obserbved. |
| … |
… |
|
| 103 | 104 | typedef _Container Container; |
| 104 | 105 | typedef _Item Item; |
| 105 | 106 | |
| 106 | | // \brief Exception which can be called from \e clear() and |
| 107 | | // \e erase(). |
| | 107 | // \brief Exception which can be called from clear() and |
| | 108 | // erase(). |
| 108 | 109 | // |
| 109 | | // From the \e clear() and \e erase() function only this |
| | 110 | // From the clear() and erase() function only this |
| 110 | 111 | // exception is allowed to throw. The exception immediatly |
| 111 | 112 | // detaches the current observer from the notifier. Because the |
| 112 | | // \e clear() and \e erase() should not throw other exceptions |
| | 113 | // clear() and erase() should not throw other exceptions |
| 113 | 114 | // it can be used to invalidate the observer. |
| 114 | 115 | struct ImmediateDetach {}; |
| 115 | 116 | |
| … |
… |
|
| 121 | 122 | // |
| 122 | 123 | // The observer interface contains some pure virtual functions |
| 123 | 124 | // to override. The add() and erase() functions are |
| 124 | | // to notify the oberver when one item is added or |
| 125 | | // erased. |
| | 125 | // to notify the oberver when one item is added or erased. |
| 126 | 126 | // |
| 127 | 127 | // The build() and clear() members are to notify the observer |
| 128 | 128 | // about the container is built from an empty container or |
diff --git a/lemon/bits/array_map.h b/lemon/bits/array_map.h
|
a
|
b
|
|
| 36 | 36 | // |
| 37 | 37 | // \brief Graph map based on the array storage. |
| 38 | 38 | // |
| 39 | | // The ArrayMap template class is graph map structure what |
| 40 | | // automatically updates the map when a key is added to or erased from |
| 41 | | // the map. This map uses the allocators to implement |
| 42 | | // the container functionality. |
| | 39 | // The ArrayMap template class is graph map structure that automatically |
| | 40 | // updates the map when a key is added to or erased from the graph. |
| | 41 | // This map uses the allocators to implement the container functionality. |
| 43 | 42 | // |
| 44 | | // The template parameters are the Graph the current Item type and |
| | 43 | // The template parameters are the Graph, the current Item type and |
| 45 | 44 | // the Value type of the map. |
| 46 | 45 | template <typename _Graph, typename _Item, typename _Value> |
| 47 | 46 | class ArrayMap |
| 48 | 47 | : public ItemSetTraits<_Graph, _Item>::ItemNotifier::ObserverBase { |
| 49 | 48 | public: |
| 50 | | // The graph type of the maps. |
| | 49 | // The graph type. |
| 51 | 50 | typedef _Graph Graph; |
| 52 | | // The item type of the map. |
| | 51 | // The item type. |
| 53 | 52 | typedef _Item Item; |
| 54 | 53 | // The reference map tag. |
| 55 | 54 | typedef True ReferenceMapTag; |
| 56 | 55 | |
| 57 | | // The key type of the maps. |
| | 56 | // The key type of the map. |
| 58 | 57 | typedef _Item Key; |
| 59 | 58 | // The value type of the map. |
| 60 | 59 | typedef _Value Value; |
| … |
… |
|
| 200 | 199 | |
| 201 | 200 | // \brief Adds a new key to the map. |
| 202 | 201 | // |
| 203 | | // It adds a new key to the map. It called by the observer notifier |
| | 202 | // It adds a new key to the map. It is called by the observer notifier |
| 204 | 203 | // and it overrides the add() member function of the observer base. |
| 205 | 204 | virtual void add(const Key& key) { |
| 206 | 205 | Notifier* nf = Parent::notifier(); |
| … |
… |
|
| 228 | 227 | |
| 229 | 228 | // \brief Adds more new keys to the map. |
| 230 | 229 | // |
| 231 | | // It adds more new keys to the map. It called by the observer notifier |
| | 230 | // It adds more new keys to the map. It is called by the observer notifier |
| 232 | 231 | // and it overrides the add() member function of the observer base. |
| 233 | 232 | virtual void add(const std::vector<Key>& keys) { |
| 234 | 233 | Notifier* nf = Parent::notifier(); |
| … |
… |
|
| 272 | 271 | |
| 273 | 272 | // \brief Erase a key from the map. |
| 274 | 273 | // |
| 275 | | // Erase a key from the map. It called by the observer notifier |
| | 274 | // Erase a key from the map. It is called by the observer notifier |
| 276 | 275 | // and it overrides the erase() member function of the observer base. |
| 277 | 276 | virtual void erase(const Key& key) { |
| 278 | 277 | int id = Parent::notifier()->id(key); |
| … |
… |
|
| 281 | 280 | |
| 282 | 281 | // \brief Erase more keys from the map. |
| 283 | 282 | // |
| 284 | | // Erase more keys from the map. It called by the observer notifier |
| | 283 | // Erase more keys from the map. It is called by the observer notifier |
| 285 | 284 | // and it overrides the erase() member function of the observer base. |
| 286 | 285 | virtual void erase(const std::vector<Key>& keys) { |
| 287 | 286 | for (int i = 0; i < int(keys.size()); ++i) { |
| … |
… |
|
| 290 | 289 | } |
| 291 | 290 | } |
| 292 | 291 | |
| 293 | | // \brief Buildes the map. |
| | 292 | // \brief Builds the map. |
| 294 | 293 | // |
| 295 | | // It buildes the map. It called by the observer notifier |
| | 294 | // It builds the map. It is called by the observer notifier |
| 296 | 295 | // and it overrides the build() member function of the observer base. |
| 297 | 296 | virtual void build() { |
| 298 | 297 | Notifier* nf = Parent::notifier(); |
| … |
… |
|
| 306 | 305 | |
| 307 | 306 | // \brief Clear the map. |
| 308 | 307 | // |
| 309 | | // It erase all items from the map. It called by the observer notifier |
| | 308 | // It erase all items from the map. It is called by the observer notifier |
| 310 | 309 | // and it overrides the clear() member function of the observer base. |
| 311 | 310 | virtual void clear() { |
| 312 | 311 | Notifier* nf = Parent::notifier(); |
diff --git a/lemon/bits/base_extender.h b/lemon/bits/base_extender.h
|
a
|
b
|
|
| 30 | 30 | |
| 31 | 31 | //\ingroup digraphbits |
| 32 | 32 | //\file |
| 33 | | //\brief Extenders for the digraph types |
| | 33 | //\brief Extenders for the graph types |
| 34 | 34 | namespace lemon { |
| 35 | 35 | |
| 36 | 36 | // \ingroup digraphbits |
diff --git a/lemon/bits/graph_extender.h b/lemon/bits/graph_extender.h
|
a
|
b
|
|
| 29 | 29 | |
| 30 | 30 | //\ingroup graphbits |
| 31 | 31 | //\file |
| 32 | | //\brief Extenders for the digraph types |
| | 32 | //\brief Extenders for the graph types |
| 33 | 33 | namespace lemon { |
| 34 | 34 | |
| 35 | 35 | // \ingroup graphbits |
| 36 | 36 | // |
| 37 | | // \brief Extender for the Digraphs |
| | 37 | // \brief Extender for the digraph implementations |
| 38 | 38 | template <typename Base> |
| 39 | 39 | class DigraphExtender : public Base { |
| 40 | 40 | public: |
diff --git a/lemon/bits/vector_map.h b/lemon/bits/vector_map.h
|
a
|
b
|
|
| 38 | 38 | // |
| 39 | 39 | // \brief Graph map based on the std::vector storage. |
| 40 | 40 | // |
| 41 | | // The VectorMap template class is graph map structure what |
| 42 | | // automatically updates the map when a key is added to or erased from |
| 43 | | // the map. This map type uses the std::vector to store the values. |
| | 41 | // The VectorMap template class is graph map structure that automatically |
| | 42 | // updates the map when a key is added to or erased from the graph. |
| | 43 | // This map type uses std::vector to store the values. |
| 44 | 44 | // |
| 45 | 45 | // \tparam _Graph The graph this map is attached to. |
| 46 | 46 | // \tparam _Item The item type of the graph items. |
| … |
… |
|
| 169 | 169 | |
| 170 | 170 | // \brief Adds a new key to the map. |
| 171 | 171 | // |
| 172 | | // It adds a new key to the map. It called by the observer notifier |
| | 172 | // It adds a new key to the map. It is called by the observer notifier |
| 173 | 173 | // and it overrides the add() member function of the observer base. |
| 174 | 174 | virtual void add(const Key& key) { |
| 175 | 175 | int id = Parent::notifier()->id(key); |
| … |
… |
|
| 180 | 180 | |
| 181 | 181 | // \brief Adds more new keys to the map. |
| 182 | 182 | // |
| 183 | | // It adds more new keys to the map. It called by the observer notifier |
| | 183 | // It adds more new keys to the map. It is called by the observer notifier |
| 184 | 184 | // and it overrides the add() member function of the observer base. |
| 185 | 185 | virtual void add(const std::vector<Key>& keys) { |
| 186 | 186 | int max = container.size() - 1; |
| … |
… |
|
| 195 | 195 | |
| 196 | 196 | // \brief Erase a key from the map. |
| 197 | 197 | // |
| 198 | | // Erase a key from the map. It called by the observer notifier |
| | 198 | // Erase a key from the map. It is called by the observer notifier |
| 199 | 199 | // and it overrides the erase() member function of the observer base. |
| 200 | 200 | virtual void erase(const Key& key) { |
| 201 | 201 | container[Parent::notifier()->id(key)] = Value(); |
| … |
… |
|
| 203 | 203 | |
| 204 | 204 | // \brief Erase more keys from the map. |
| 205 | 205 | // |
| 206 | | // Erase more keys from the map. It called by the observer notifier |
| | 206 | // It erases more keys from the map. It is called by the observer notifier |
| 207 | 207 | // and it overrides the erase() member function of the observer base. |
| 208 | 208 | virtual void erase(const std::vector<Key>& keys) { |
| 209 | 209 | for (int i = 0; i < int(keys.size()); ++i) { |
| … |
… |
|
| 211 | 211 | } |
| 212 | 212 | } |
| 213 | 213 | |
| 214 | | // \brief Buildes the map. |
| | 214 | // \brief Build the map. |
| 215 | 215 | // |
| 216 | | // It buildes the map. It called by the observer notifier |
| | 216 | // It builds the map. It is called by the observer notifier |
| 217 | 217 | // and it overrides the build() member function of the observer base. |
| 218 | 218 | virtual void build() { |
| 219 | 219 | int size = Parent::notifier()->maxId() + 1; |
| … |
… |
|
| 223 | 223 | |
| 224 | 224 | // \brief Clear the map. |
| 225 | 225 | // |
| 226 | | // It erase all items from the map. It called by the observer notifier |
| | 226 | // It erases all items from the map. It is called by the observer notifier |
| 227 | 227 | // and it overrides the clear() member function of the observer base. |
| 228 | 228 | virtual void clear() { |
| 229 | 229 | container.clear(); |