Packets/80221Bundle: enhanced error message in MIHBaseTLVParser::validateType()
[senf.git] / senf / Utils / Console / Variables.hh
index 92df05d..9c2224b 100644 (file)
@@ -1,24 +1,29 @@
 // $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>
 //
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
+// The contents of this file are subject to the Fraunhofer FOKUS Public License
+// Version 1.0 (the "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at 
+// http://senf.berlios.de/license.html
 //
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
+// The Fraunhofer FOKUS Public License Version 1.0 is based on, 
+// but modifies the Mozilla Public License Version 1.1.
+// See the full license text for the amendments.
 //
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the
-// Free Software Foundation, Inc.,
-// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// Software distributed under the License is distributed on an "AS IS" basis, 
+// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
+// for the specific language governing rights and limitations under the License.
+//
+// The Original Code is Fraunhofer FOKUS code.
+//
+// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
+// (registered association), Hansastraße 27 c, 80686 Munich, Germany.
+// All Rights Reserved.
+//
+// Contributor(s):
+//   Stefan Bund <g0dil@berlios.de>
 
 /** \file
     \brief Variables public header */
 #include <boost/utility.hpp>
 #include <boost/type_traits/is_convertible.hpp>
 #include <boost/ref.hpp>
-#include "ParsedCommand.hh"
+#include "Node.hh"
 
 #include "Variables.ih"
 //#include "Variables.mpp"
-///////////////////////////////hh.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 
 namespace senf {
 namespace console {
@@ -44,10 +49,8 @@ namespace console {
 
 namespace factory {
 
-    /** \brief Variable command attributes (const)
-        
-        \see VariableFactory
-     */
+#ifndef DOXYGEN
+
     template <class Variable>
     class ConstVariableFactory
         : public detail::NodeFactory
@@ -63,7 +66,7 @@ namespace factory {
         ConstVariableFactory formatter(Formatter formatter);
 
         OverloadedCommandNode & create(DirectoryNode & dir, std::string const & name) const;
-        
+
         explicit ConstVariableFactory(Variable const & var);
 
     private:
@@ -71,8 +74,10 @@ namespace factory {
         boost::optional<std::string> doc_;
         boost::optional<std::string> shortdoc_;
     };
-    /** \brief Variable command attributes
+
+#endif
+
+    /** \brief Variable node factory
 
         Variable commands allow to register any arbitrary variable as a command node. The variable
         will be registered as two command overloads: One which takes a single argument of the
@@ -82,7 +87,7 @@ namespace factory {
             int var;
             ScopedDirectory<> dir;
 
-        dir.add("var", var);
+        dir.add("var", fty::Variable(var));
         \endcode
 
         Variables should be registered only with a ScopedDirectory declared in the same scope
@@ -91,20 +96,27 @@ namespace factory {
 
         Since a variable command is added as a combination of two ordinary overloads, it is possible
         to register additional overloads with the same name before or after registering the
-        variable. 
+        variable.
 
         It is also possible, to register a variable read-only. To achieve this, just wrap it with \c
-        boost::cref(). Such a variable cannot be changed only queried. Therefore, it does not have
-        the parser() and typeName() attributes.
+        boost::cref(). Such a variable only queried. Therefore, it does not have the parser() and
+        typeName() attributes.
         \code
-            dir.add("const_var", boost::cref(var))
+            dir.add("const_var", fty::Variable(boost::cref(var)));
         \endcode
 
-        \ingroup console_commands
+        \note Even though the interface is documented as a class, in reality it is implemented using
+            factory functions returning instances of an internal factory class.
+
+        \see \ref console_variables
      */
+#ifdef DOXYGEN
+    class Variable
+#else
     template <class Variable>
     class VariableFactory
         : public ConstVariableFactory<Variable>
+#endif
     {
     public:
         typedef typename detail::SetVariable<Variable>::Traits::Overload SetOverload;
@@ -130,7 +142,7 @@ namespace factory {
                                              \code
                                                  void parser(senf::console::ParseCommandInfo::TokensRange const & tokens, value_type & out);
                                              \endcode
-                                             
+
                                              where \c value_type is the type of the overload
                                              parameter. The parser must read and parse the complete
                                              \a tokens range and return the parsed value in \a
@@ -147,17 +159,21 @@ namespace factory {
                                                  void handler(Variable const & oldValue);
                                              \endcode */
 
-        OverloadedCommandNode & create(DirectoryNode & dir, std::string const & name) const;
-
-        explicit VariableFactory(Variable & var);
+        explicit VariableFactory(Variable & var); ///< Create Variable node
 
     protected:
 
     private:
+        OverloadedCommandNode & create(DirectoryNode & dir, std::string const & name) const;
+
         typename SetOverload::ptr setOverload_;
         Variable & var_;
+
+        friend class senf::console::DirectoryNode;
     };
 
+#ifndef DOXYGEN
+
     template <class Var>
     VariableFactory<Var> Variable(Var & var);
 
@@ -170,9 +186,11 @@ namespace factory {
     template <class Var>
     ConstVariableFactory<Var> Variable(boost::reference_wrapper<Var const> var);
 
+#endif
+
 }}}
 
-///////////////////////////////hh.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 //#include "Variables.cci"
 //#include "Variables.ct"
 #include "Variables.cti"