[llvm-commits] [llvm] r44851 - /llvm/trunk/include/llvm/ADT/Trie.h
Wojciech Matyjewicz
wmatyjewicz at fastmail.fm
Tue Dec 11 05:45:43 PST 2007
Anton Korobeynikov wrote:
> +template<class Payload>
> +class Trie {
> + class Edge;
> + class Node;
> +
> + class Edge {
> + std::string Label;
> + Node *Parent, *Child;
The Parent field seems to be unused internally by the Trie
implementation. Assuming the Edge interface is invisible for Trie
clients, may this field be removed?
> + std::vector<Node*> Nodes;
I guess this vector is purely for destruction purposes... Have you
considered storing a root node only and performing destruction by
postorder trie traversal?
> + inline Node* getRoot() const { return Nodes[0]; }
I'm not familiar what Trie structure will be used for, but shouldn't
this method be private? Currently, it exposes a way to call most of the
Node's (and indirectly Edge's) methods, which I suppose, should be
inaccessible to clients.
> + bool addString(const std::string& s, const Payload& data) {
> + Node* cNode = getRoot();
> + Edge* nEdge = NULL;
> + std::string s1(s);
> +
> + while (nEdge == NULL) {
> + if (cNode->Edges.count(s1[0])) {
> + Edge& cEdge = cNode->Edges[s1[0]];
> + typename Edge::QueryResult r = cEdge.query(s1);
> +
> + switch (r) {
> + case Edge::Same:
Do we really want to hit the assert here, and not only return false?
> + case Edge::StringIsPrefix:
Shouldn't the edge be splitted in this case and the payload be attached
to the new node?
-Wojtek
More information about the llvm-commits
mailing list