D graph library
w0rp
devw0rp at gmail.com
Wed May 15 14:20:17 PDT 2013
On Wednesday, 15 May 2013 at 18:38:59 UTC, Joseph Rushton
Wakeling wrote:
> On 05/15/2013 08:28 PM, w0rp wrote:
>> I don't think that's too useful or necessary. A graph is at
>> its heart a pair (V,
>> E) where V is the vertex set and E is the edge set. So addNode
>> is really just V'
>> = V ∪ {n} for some node n. I think it's best to just allow
>> redundantly adding a
>> node, which ought to be an O(1) function.
>
> In the same way as one could add a word to a dictionary, say?
>
> Consider that it's possible to have multigraphs where there
> _can_ be multiple
> edges from one node to another. You might well want to
> explicitly enforce the
> user's awareness of error if they try adding multiple edges to
> the wrong type of
> graph.
I have considered 'multigraphs,' which is kind of like having an
STL multimap in my mind. Having policies again makes the
implementation a little easier. I would prefer to not have
addNode throw exceptions when applied redundantly. Not throwing
is very familiar behaviour if you think in terms of set theory.
Then you can have a separate function to support runtime checks
to make sure you don't trip over yourself when really don't want
to add more than once.
void addNodeOnce(SomeGraph)(SomeGraph graph, NodeType!SomeGraph
node)
if (isSomeGraph!SomeGraph)
in {
assert(!graph.hasNode(node));
} body {
graph.addNode(node);
} out {
// Let's go all the way with this.
assert(graph.hasNode(node));
}
Now you have graph.addNodeOnce(node).
More information about the Digitalmars-d
mailing list