Fix documentation build under maverick (doxygen 1.7.1)
[senf.git] / senf / Utils / Console / Node.cti
index b7f118b..fcfa6fe 100644 (file)
@@ -1,6 +1,6 @@
 // $Id$
 //
-// Copyright (C) 2008 
+// Copyright (C) 2008
 // Fraunhofer Institute for Open Communication Systems (FOKUS)
 // Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 // Custom includes
 
 #define prefix_ inline
-///////////////////////////////cti.p///////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 
-///////////////////////////////////////////////////////////////////////////
-// senf::console::NodeCreateTraits<Object>::Creator
-
-template <class Object>
-prefix_ typename senf::console::NodeCreateTraits<Object>::result_type
-senf::console::NodeCreateTraits<Object>::Creator::create(DirectoryNode & node,
-                                                         std::string const & name,
-                                                         Object & ob)
-{
-    return senf_console_add_node(node, name, ob, 0);
-}
-
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::console::DirectoryNode
 
 template <class NodeType>
 prefix_ NodeType & senf::console::DirectoryNode::add(std::string const & name,
                                                      boost::shared_ptr<NodeType> node)
 {
-    SENF_ASSERT( ! node->parent() );
+    SENF_ASSERT( ! node->parent(), "Node can only be added to tree once" );
     node->name(name);
     add(node);
     return *node;
 }
 
-template <class Object>
-prefix_ typename senf::console::NodeCreateTraits<Object>::result_type
-senf::console::DirectoryNode::add(std::string const & name, Object const & ob)
+template <class NodeType>
+prefix_ NodeType & senf::console::DirectoryNode::
+add(std::string const & name, NodeType & node,
+    typename boost::enable_if< boost::is_convertible<NodeType &, GenericNode &> >::type *)
 {
-    return NodeCreateTraits<Object const>::Creator::create(*this, name, ob);
+    // This makes objects with implicit conversion operators work (hi, ScopedDirectory ..)
+    add(name, static_cast<GenericNode &>(node).thisptr());
+    return node;
 }
 
-template <class Object>
-prefix_ typename senf::console::NodeCreateTraits<Object>::result_type
-senf::console::DirectoryNode::add(std::string const & name, Object & ob)
+template <class Factory>
+prefix_ typename Factory::result_type senf::console::DirectoryNode::
+add(std::string const & name, Factory const & factory,
+    typename boost::enable_if< boost::is_convertible<Factory const &, detail::NodeFactory const &> >::type *)
 {
-    return NodeCreateTraits<Object>::Creator::create(*this, name, ob);
+    return factory.create(*this, name);
 }
 
-///////////////////////////////cti.e///////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 #undef prefix_
 
 \f