X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FNode.ct;h=c9516c03499975242ad97b8dc0cf3ea10f902f7a;hb=d3607ce23b75abc46b387fccabe591c989f5daf0;hp=ddf17ac97a620aaa86450c7426b93d2f2c6db997;hpb=ca70e274a556bf217f3f4c7b12e0fad2a7cd4853;p=senf.git diff --git a/Console/Node.ct b/Console/Node.ct index ddf17ac..c9516c0 100644 --- a/Console/Node.ct +++ b/Console/Node.ct @@ -23,7 +23,7 @@ /** \file \brief Node non-inline template implementation */ -//#include "Node.ih" +#include "Node.ih" // Custom includes #include @@ -36,43 +36,16 @@ template prefix_ senf::console::GenericNode & -senf::console::DirectoryNode::traverse(ForwardRange const & range, bool autocomplete) +senf::console::DirectoryNode::traverse(ForwardRange const & range, bool autocomplete, + DirectoryNode & root) { typedef typename boost::range_const_iterator::type const_iterator; - DirectoryNode::ptr dir (thisptr()); + detail::NodeTraverser traverser (root, *this, autocomplete); const_iterator i (boost::begin(range)); const_iterator const i_end (boost::end(range)); - if (i != i_end && *i == std::string("")) { - dir = root().thisptr(); - ++ i; - } - while (i != i_end) { - const_iterator next_i (i); - ++ next_i; - if (*i == std::string("..")) { - dir = dir->parent(); - if (! dir) - dir = root().thisptr(); - } - else if (*i != std::string("") && *i != std::string(".")) { - std::string name (*i); - if (! dir->hasChild(name) && autocomplete) { - ChildrenRange completions (dir->completions(name)); - if (completions.size() == 1) - name = completions.begin()->first; - } - if (next_i == i_end) - return dir->get(name); - else { - // Why does g++ give an error on this line ???? : - // dir = dynamic_cast( dir->get(name) ).thisptr(); - DirectoryNode & d (dynamic_cast( dir->get(name) )); - dir = d.thisptr(); - } - } - i = next_i; - } - return *dir; + for (; i != i_end; ++i) + traverser( *i ); + return traverser.node(); } ///////////////////////////////ct.e////////////////////////////////////////