| 1 | I am using this place to publish thoughts and updates about the design and implementation of this project. If you happen to be reading this and have some comments about the content, ideas, or questions, please leave them here - I'd like to read them. |
| 2 | |
| 3 | == New Graph Classes == |
| 4 | I am currently considering alternative approaches to the implementation of the `undirected_graph` and `directed_graph` classes. One thing is clear - i intend to leverage as much existing code in Boost.Graph as possible, so it's probable that these classes will be implemented in terms of the `adjacency_list<>` class. The irony to this approach is that I am not introducing new classes so much as additional abstractions around an existing class. On the other hand, it does make implementation a breeze. |
| 5 | |
| 6 | == Measures and Algorithms == |
| 7 | I haven't given a lot of thought to these since the semester just ended. However, I am starting to consider various type requirements for the algorithms and have spent some time playing with conceptg++. |
| 8 | |
| 9 | On a side note, I started codifying the Boost.Graph graph concepts into a concepts header just to see if I could make it work - I haven't succeeded yet. Still, it's a good excercise and makes you think about concept hierarchies, nested requirements and the like. Also, i don't like the keyword `concept_map`. Not the idea itself - the keyword. If I'm not mistaken, this keyword replaces `model` from earlier proposals. Alas... |
| 10 | |
| 11 | == Documentation and Other Niceties == |
| 12 | It seems to me that the Boost.Graph documentation has gotten a little stale and needs a face-lift (i.e., rewrite to quickbook). There are also some older parts of the documentation that don't appear to align with current practice - especially those parts related to internal or bundled properties. If you read closely, you get the idea that bundled properties are the preferred technique, but they have yet to earn an entry into the table of contents. |
| 13 | |
| 14 | Of course, the documentation isn't the only place where Boost.Graph doesn't align with the rest of Boost. For example, there is not `boost::graph` namespace. While this isn't exactly a tragedy for the ages, it would provide a clean separation from the rest of Boost. I am considering implementing my `[un]directed_graph`s in a `boost::graph` namespace. |
| 15 | |
| 16 | Another advantage of adding the `boost::graph` namespace is that it provides a mechansim for doing some other interesting things like reordering the parameters of common Boost.Graph function calls. One of my biggest complaints when I started learning the library was that the graph was always passed as the last argument in these functions. This doesn't really mesh well with the common "C-style" object-oriented approach where the type of the first parameter generally indicates the type to which said function would belong as a method. Is it really that big of a deal? I don't know... but it would be pretty easy to reorder parameters likes this (for example): |
| 17 | |
| 18 | {{{ |
| 19 | #!cpp |
| 20 | namespace boost { |
| 21 | namespace graph { |
| 22 | template <class C> |
| 23 | inline std::pair<typename C::edge_descriptor, bool> |
| 24 | add_edge(boost::directed_graph_helper<C>& g, typename C::vertex_descriptor u, C::vertex_descriptor v) |
| 25 | { |
| 26 | return boost::add_edge(u, v, g); |
| 27 | } |
| 28 | } |
| 29 | } |
| 30 | }}} |
| 31 | |
| 32 | Just a thought... There's probably some reason why this might break that I haven't thought of. And yes... that's what the signature of the `add_edge()` function actually looks like for directed graphs. |