4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 // http://senf.berlios.de/license.html
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on,
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
15 // Software distributed under the License is distributed on an "AS IS" basis,
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
17 // for the specific language governing rights and limitations under the License.
19 // The Original Code is Fraunhofer FOKUS code.
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief Node inline non-template implementation */
35 #define prefix_ inline
36 //-/////////////////////////////////////////////////////////////////////////////////////////////////
38 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39 // senf::console::GenericNode
41 prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::thisptr()
43 return shared_from_this();
46 prefix_ senf::console::GenericNode::cptr senf::console::GenericNode::thisptr()
49 return shared_from_this();
52 prefix_ senf::console::GenericNode::~GenericNode()
55 prefix_ std::string const & senf::console::GenericNode::name()
61 prefix_ senf::console::GenericNode::GenericNode()
65 prefix_ void senf::console::GenericNode::name(std::string const & name)
70 prefix_ boost::shared_ptr<senf::console::DirectoryNode> senf::console::GenericNode::parent()
73 return boost::static_pointer_cast<DirectoryNode>(
74 parent_ ? parent_->shared_from_this() : ptr() );
77 prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::unlink()
80 return parent()->remove(name());
85 prefix_ void senf::console::GenericNode::help(std::ostream & output)
91 prefix_ std::string senf::console::GenericNode::shorthelp()
97 prefix_ bool senf::console::GenericNode::operator==(GenericNode & other)
100 return this == & other;
103 prefix_ bool senf::console::GenericNode::operator!=(GenericNode & other)
106 return this != & other;
109 prefix_ bool senf::console::GenericNode::isDirectory()
112 return dynamic_cast<DirectoryNode const *>(this);
115 prefix_ bool senf::console::GenericNode::isLink()
118 return dynamic_cast<LinkNode const *>(this);
121 prefix_ bool senf::console::GenericNode::isCommand()
124 return dynamic_cast<CommandNode const *>(this);
127 prefix_ senf::console::GenericNode const & senf::console::GenericNode::followLink()
131 ? dynamic_cast<LinkNode const *>(this)->follow()
135 prefix_ senf::console::GenericNode & senf::console::GenericNode::followLink()
138 ? dynamic_cast<LinkNode *>(this)->follow()
142 //-/////////////////////////////////////////////////////////////////////////////////////////////////
143 // senf::console::LinkNode
145 prefix_ senf::console::GenericNode & senf::console::LinkNode::follow()
151 prefix_ senf::console::LinkNode::ptr senf::console::LinkNode::create(GenericNode & node)
153 GenericNode::ptr p (node.thisptr());
154 while ( p->isLink() )
155 p = dynamic_cast<LinkNode&>(*p).follow().thisptr();
156 return ptr(new LinkNode(*p));
159 prefix_ senf::console::LinkNode::LinkNode(GenericNode & node)
160 : node_ (node.thisptr())
163 //-/////////////////////////////////////////////////////////////////////////////////////////////////
164 // senf::console::DirectoryNode
166 prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::create()
168 return ptr(new DirectoryNode());
171 prefix_ bool senf::console::DirectoryNode::hasChild(std::string const & name)
174 ChildMap::const_iterator i (children_.find(name));
175 return i != children_.end();
178 prefix_ senf::console::GenericNode &
179 senf::console::DirectoryNode::get(std::string const & name)
182 return getLink(name).followLink();
185 prefix_ senf::console::DirectoryNode &
186 senf::console::DirectoryNode::getDirectory(std::string const & name)
190 return dynamic_cast<DirectoryNode&>(get(name));
192 SENF_WRAP_EXC(std::bad_cast)
195 prefix_ senf::console::DirectoryNode &
196 senf::console::DirectoryNode::operator[](std::string const & name)
199 return getDirectory(name);
202 prefix_ senf::console::CommandNode &
203 senf::console::DirectoryNode::getCommand(std::string const & name)
207 return dynamic_cast<CommandNode&>(get(name));
209 SENF_WRAP_EXC(std::bad_cast)
212 prefix_ senf::console::CommandNode &
213 senf::console::DirectoryNode::operator()(std::string const & name)
216 return getCommand(name);
219 prefix_ senf::console::DirectoryNode::ChildrenRange senf::console::DirectoryNode::children()
222 return boost::make_iterator_range(children_.begin(), children_.end());
225 prefix_ senf::console::DirectoryNode::ChildrenRange
226 senf::console::DirectoryNode::completions(std::string const & s)
229 return boost::make_iterator_range(children_.lower_bound(s),
230 children_.lower_bound(s + "\xff"));
233 prefix_ senf::console::DirectoryNode::DirectoryNode()
236 prefix_ senf::console::DirectoryNode &
237 senf::console::DirectoryNode::doc(std::string const & doc)
243 prefix_ senf::console::DirectoryNode &
244 senf::console::DirectoryNode::shortdoc(std::string const & doc)
250 prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::thisptr()
252 return boost::static_pointer_cast<DirectoryNode>(shared_from_this());
255 prefix_ senf::console::DirectoryNode::cptr senf::console::DirectoryNode::thisptr()
258 return boost::static_pointer_cast<DirectoryNode const>(shared_from_this());
261 //-/////////////////////////////////////////////////////////////////////////////////////////////////
262 // senf::console::detail::NodeTraverser
265 prefix_ senf::console::detail::NodeTraverser::NodeTraverser(DirectoryNode & root,
268 : root_ (root), dir_ (dir.thisptr()), autocomplete_ (autocomplete), init_ (false)
273 //-/////////////////////////////////////////////////////////////////////////////////////////////////
274 // senf::console::CommandNode
276 prefix_ senf::console::CommandNode::ptr senf::console::CommandNode::thisptr()
278 return boost::static_pointer_cast<CommandNode>(shared_from_this());
281 prefix_ senf::console::CommandNode::cptr senf::console::CommandNode::thisptr()
284 return boost::static_pointer_cast<CommandNode const>(shared_from_this());
287 prefix_ senf::console::CommandNode::CommandNode()
290 prefix_ void senf::console::CommandNode::execute(std::ostream & output,
291 ParseCommandInfo const & command)
295 execute(rv, output, command);
298 prefix_ void senf::console::CommandNode::execute(boost::any & rv, std::ostream & output,
299 ParseCommandInfo const & command)
303 v_execute(rv, output, command);
306 prefix_ void senf::console::CommandNode::operator()(std::ostream & output,
307 ParseCommandInfo const & command)
310 execute(output, command);
313 prefix_ void senf::console::CommandNode::operator()(boost::any & rv, std::ostream & output,
314 ParseCommandInfo const & command)
317 execute(rv, output, command);
320 //-/////////////////////////////////////////////////////////////////////////////////////////////////
321 // senf::console::SimpleCommandNode
323 prefix_ senf::console::SimpleCommandNode::SimpleCommandNode(Function const & fn)
327 prefix_ senf::console::SimpleCommandNode::ptr
328 senf::console::SimpleCommandNode::create(Function const & fn)
330 return ptr(new SimpleCommandNode(fn));
333 prefix_ senf::console::SimpleCommandNode &
334 senf::console::SimpleCommandNode::doc(std::string const & doc)
340 prefix_ senf::console::SimpleCommandNode &
341 senf::console::SimpleCommandNode::shortdoc(std::string const & doc)
347 prefix_ senf::console::SimpleCommandNode::ptr senf::console::SimpleCommandNode::thisptr()
349 return boost::static_pointer_cast<SimpleCommandNode>(shared_from_this());
352 prefix_ senf::console::SimpleCommandNode::cptr senf::console::SimpleCommandNode::thisptr()
355 return boost::static_pointer_cast<SimpleCommandNode const>(shared_from_this());
358 //-/////////////////////////////////////////////////////////////////////////////////////////////////
360 prefix_ senf::console::DirectoryNode & senf::console::provideDirectory(DirectoryNode & dir,
361 std::string const & name)
363 return dir.hasChild(name) ? dir.getDirectory(name) : dir.add(name, factory::Directory());
367 //-/////////////////////////////////////////////////////////////////////////////////////////////////
368 // senf::console::factory::SimpleCommand
370 prefix_ senf::console::factory::SimpleCommand::SimpleCommand(SimpleCommandNode::Function fn)
371 : node_ (SimpleCommandNode::create(fn))
374 prefix_ senf::console::SimpleCommandNode &
375 senf::console::factory::SimpleCommand::create(DirectoryNode & dir, std::string const & name)
378 return dir.add(name, node_);
381 prefix_ senf::console::factory::SimpleCommand const &
382 senf::console::factory::SimpleCommand::doc(std::string const & doc)
389 prefix_ senf::console::factory::SimpleCommand const &
390 senf::console::factory::SimpleCommand::shortdoc(std::string const & doc)
393 node_->shortdoc(doc);
397 //-/////////////////////////////////////////////////////////////////////////////////////////////////
398 // senf::console::factory::Directory
400 prefix_ senf::console::factory::Directory::Directory()
401 : node_ (DirectoryNode::create())
404 prefix_ senf::console::DirectoryNode &
405 senf::console::factory::Directory::create(DirectoryNode & dir, std::string const & name)
408 return dir.add(name, node_);
411 prefix_ senf::console::factory::Directory const &
412 senf::console::factory::Directory::doc(std::string const & doc)
419 prefix_ senf::console::factory::Directory const &
420 senf::console::factory::Directory::shortdoc(std::string const & doc)
423 node_->shortdoc(doc);
427 //-/////////////////////////////////////////////////////////////////////////////////////////////////
428 // senf::console::factory::Link
430 prefix_ senf::console::factory::Link::Link(GenericNode & target)
431 : node_ (LinkNode::create(target))
434 prefix_ senf::console::LinkNode & senf::console::factory::Link::create(DirectoryNode & dir,
435 std::string const & name)
438 return dir.add(name, node_);
441 //-/////////////////////////////////////////////////////////////////////////////////////////////////
448 // comment-column: 40
449 // c-file-style: "senf"
450 // indent-tabs-mode: nil
451 // ispell-local-dictionary: "american"
452 // compile-command: "scons -u test"