src/core/default-value.cc
changeset 2577 5b41cb5c3fcf
parent 2576 793375cbbed6
child 2578 685b62ddfbd8
--- a/src/core/default-value.cc	Mon Mar 10 00:26:54 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,510 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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.
- *
- * 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
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include "default-value.h"
-#include "fatal-error.h"
-
-namespace ns3 {
-
-namespace DefaultValue {
-
-enum BindStatus {
-  OK,
-  INVALID_VALUE,
-  NOT_FOUND
-};
-
-
-static 
-enum BindStatus
-BindSafe (std::string name, std::string value)
-{
-  for (DefaultValueList::Iterator i = DefaultValueList::Begin ();
-       i != DefaultValueList::End (); i++)
-    {
-      DefaultValueBase *cur = *i;
-      if (cur->GetName () == name)
-	{
-	  if (!cur->ParseValue (value))
-	    {
-	      return INVALID_VALUE;
-	    }
-	  return OK;
-	}
-    }
-  return NOT_FOUND;
-}
-
-void
-Bind (std::string name, std::string value)
-{
-  switch (BindSafe (name, value)) {
-  case INVALID_VALUE:
-    NS_FATAL_ERROR ("Invalid value: "<<name<<"="<<value);
-    break;
-  case NOT_FOUND:
-    NS_FATAL_ERROR ("No registered DefaultValue=\"" << name << "\"");
-    break;
-  case OK:
-    break;
-  }
-}
-
-}
-
-DefaultValueBase::DefaultValueBase (const std::string &name,
-				    const std::string &help)
-  : m_name (name),
-    m_help (help),
-    m_dirty (false)
-{}
-DefaultValueBase::~DefaultValueBase ()
-{}
-std::string 
-DefaultValueBase::GetName (void) const
-{
-  return m_name;
-}
-std::string 
-DefaultValueBase::GetHelp (void) const
-{
-  return m_help;
-}
-bool 
-DefaultValueBase::IsDirty (void) const
-{
-  return m_dirty;
-}
-void 
-DefaultValueBase::ClearDirtyFlag (void)
-{
-  m_dirty = false;
-}
-bool 
-DefaultValueBase::ParseValue (const std::string &value)
-{
-  bool ok = DoParseValue (value);
-  if (ok)
-    {
-      m_dirty = true;
-    }
-  return ok;
-}
-std::string 
-DefaultValueBase::GetType (void) const
-{
-  return DoGetType ();
-}
-std::string 
-DefaultValueBase::GetDefaultValue (void) const
-{
-  return DoGetDefaultValue ();
-}
-
-
-DefaultValueList::Iterator 
-DefaultValueList::Begin (void)
-{
-  return GetList ()->begin ();
-}
-DefaultValueList::Iterator 
-DefaultValueList::End (void)
-{
-  return GetList ()->end ();
-}
-void
-DefaultValueList::Remove (const std::string &name)
-{
-  DefaultValueList::List *list = GetList ();
-  for (List::iterator i = list->begin (); i != list->end (); /* nothing */)
-    {
-      if ((*i)->GetName () == name)
-        {
-          i = list->erase (i);
-        }
-      else
-        {
-          i++;
-        }
-    }
-}
-void 
-DefaultValueList::Add (DefaultValueBase *defaultValue)
-{
-  GetList ()->push_back (defaultValue);
-}
-
-DefaultValueList::List *
-DefaultValueList::GetList (void)
-{
-  static List list;
-  return &list;
-}
-
-BooleanDefaultValue::BooleanDefaultValue (std::string name,
-					  std::string help,
-					  bool defaultValue)
-  : DefaultValueBase (name, help),
-    m_defaultValue (defaultValue),
-    m_value (defaultValue)
-{
-  DefaultValueList::Add (this);
-}
-bool 
-BooleanDefaultValue::GetValue (void) const
-{
-  return m_value;
-}
-bool 
-BooleanDefaultValue::DoParseValue (const std::string &value)
-{
-  if (value.compare ("0") == 0 ||
-      value.compare ("f") == 0 ||
-      value.compare ("false") == 0 ||
-      value.compare ("FALSE") == 0) 
-    {
-      m_value = false;
-      return true;
-    } 
-  else if (value.compare ("1") == 0 ||
-	   value.compare ("t") == 0 ||
-	   value.compare ("true") == 0 ||
-	   value.compare ("TRUE") == 0) 
-    {
-      m_value = true;
-      return true;
-    } 
-  else 
-    {
-      return false;
-    }
-}
-std::string 
-BooleanDefaultValue::DoGetType (void) const
-{
-  return "bool";
-}
-std::string 
-BooleanDefaultValue::DoGetDefaultValue (void) const
-{
-  return m_defaultValue?"true":"false";
-}
-
-
-StringEnumDefaultValue::StringEnumDefaultValue (const std::string &name,
-                                                const std::string &help)
-  : DefaultValueBase (name, help),
-    m_oneDefault (false)
-{
-  DefaultValueList::Add (this);
-}
-void 
-StringEnumDefaultValue::AddDefaultValue (const std::string &value)
-{
-  if (m_oneDefault)
-    {
-      NS_FATAL_ERROR ("More than one default value registered: " << value);
-    }
-  m_oneDefault = true;
-  for (std::list<std::string>::iterator i = m_possibleValues.begin ();
-       i != m_possibleValues.end (); i++)
-    {
-      if (value == *i)
-        {
-          NS_FATAL_ERROR ("Value already exists: " << value);
-        }
-    }  
-  m_possibleValues.push_back (value);
-  m_value = value;
-  m_defaultValue = value;
-}
-void 
-StringEnumDefaultValue::AddPossibleValue (const std::string &value)
-{
-  for (std::list<std::string>::iterator i = m_possibleValues.begin ();
-       i != m_possibleValues.end (); i++)
-    {
-      if (value == *i)
-        {
-          NS_FATAL_ERROR ("Value already exists: " << value);
-        }
-    }
-  m_possibleValues.push_back (value);
-}
-std::string 
-StringEnumDefaultValue::GetValue (void) const
-{
-  return m_value;
-}
-bool 
-StringEnumDefaultValue::DoParseValue (const std::string &value)
-{
-  for (std::list<std::string>::iterator i = m_possibleValues.begin ();
-       i != m_possibleValues.end (); i++)
-    {
-      if (value == *i)
-        {
-          m_value = value;
-          return true;
-        }
-    }
-  return false;
-}
-std::string 
-StringEnumDefaultValue::DoGetType (void) const
-{
-  std::string retval;
-  retval += "(";
-  for (std::list<std::string>::const_iterator i = m_possibleValues.begin ();
-       i != m_possibleValues.end (); i++)
-    {
-      if (i != m_possibleValues.begin ())
-	{
-	  retval += "|";
-	}
-      retval += *i;
-    }
-  retval += ")";
-  return retval;
-}
-std::string 
-StringEnumDefaultValue::DoGetDefaultValue (void) const
-{
-  return m_defaultValue;
-}
-
-
-CommandDefaultValue::CommandDefaultValue (const std::string &name,
-					  const std::string &help,
-					  Callback<void> cb)
-  : DefaultValueBase (name, help),
-    m_cb (cb)
-{
-  DefaultValueList::Add (this);
-}
-bool 
-CommandDefaultValue::DoParseValue (const std::string &value)
-{
-  m_cb ();
-  return true;
-}
-std::string 
-CommandDefaultValue::DoGetType (void) const
-{
-  return "";
-}
-std::string 
-CommandDefaultValue::DoGetDefaultValue (void) const
-{
-  return "";
-}
-
-
-StringDefaultValue::StringDefaultValue (const std::string &name,
-                                        const std::string &help,
-                                        const std::string defaultValue)
-  : DefaultValueBase (name, help),
-    m_defaultValue (defaultValue),
-    m_value (defaultValue),
-    m_minSize (0),
-    m_maxSize (-1)
-{
-  DefaultValueList::Add (this);
-}
-StringDefaultValue::StringDefaultValue (const std::string &name,
-                                        const std::string &help,
-                                        const std::string defaultValue,
-                                        int maxSize)
-  : DefaultValueBase (name, help),
-    m_defaultValue (defaultValue),
-    m_value (defaultValue),
-    m_minSize (0),
-    m_maxSize (maxSize)
-{
-  DefaultValueList::Add (this);
-}
-StringDefaultValue::StringDefaultValue (const std::string &name,
-                                        const std::string &help,
-                                        const std::string defaultValue,
-                                        int minSize,
-                                        int maxSize)
-  : DefaultValueBase (name, help),
-    m_defaultValue (defaultValue),
-    m_value (defaultValue),
-    m_minSize (minSize),
-    m_maxSize (maxSize)
-{
-  DefaultValueList::Add (this);
-}
-
-
-std::string 
-StringDefaultValue::GetValue (void) const
-{
-  return m_value;
-}
-
-bool 
-StringDefaultValue::DoParseValue (const std::string &value)
-{
-  if ((int)value.size () < m_minSize)
-    {
-      return false;
-    }
-  if (m_maxSize != -1 && (int)value.size () > m_maxSize)
-    {
-      return false;
-    }
-  m_value = value;
-  return true;
-}
-std::string 
-StringDefaultValue::DoGetType (void) const
-{
-  if (m_maxSize == -1)
-    {
-      return "string:0";
-    }
-  else 
-    {
-      std::ostringstream oss;
-      oss << "string:0:" << m_maxSize;
-      return oss.str ();
-    }
-}
-std::string 
-StringDefaultValue::DoGetDefaultValue (void) const
-{
-  return m_defaultValue;
-}
-
-
-
-}//namespace ns3
-
-#ifdef RUN_SELF_TESTS
-#include "test.h"
-
-namespace ns3 {
-
-enum MyEnum {
-  MY_ENUM_A,
-  MY_ENUM_B,
-  MY_ENUM_C,
-  MY_ENUM_D,
-};
-
-
-class DefaultValueTest : public Test
-{
-public:
-  DefaultValueTest ();
-  virtual bool RunTests (void);
-};
-
-DefaultValueTest::DefaultValueTest ()
-  : Test ("DefaultValue")
-{}
-bool 
-DefaultValueTest::RunTests (void)
-{
-  bool result = true;
-
-  BooleanDefaultValue a ("bool-a", "help a", true);
-  NS_TEST_ASSERT (a.GetValue ());
-  DefaultValue::Bind ("bool-a", "false");
-  NS_TEST_ASSERT (!a.GetValue ());
-  BooleanDefaultValue b ("bool-b", "help b", false);
-  DefaultValue::Bind ("bool-b", "true");
-  NS_TEST_ASSERT (b.GetValue ());
-  DefaultValue::Bind ("bool-b", "0");
-  NS_TEST_ASSERT (!b.GetValue ());
-  DefaultValue::Bind ("bool-b", "1");
-  NS_TEST_ASSERT (b.GetValue ());
-  DefaultValue::Bind ("bool-b", "f");
-  NS_TEST_ASSERT (!b.GetValue ());
-  DefaultValue::Bind ("bool-b", "t");
-  NS_TEST_ASSERT (b.GetValue ());
-
-  DefaultValue::Bind ("bool-b", "false");
-  NS_TEST_ASSERT (!b.GetValue ());
-  NS_TEST_ASSERT_EQUAL (DefaultValue::BindSafe ("bool-b", "tr"), DefaultValue::INVALID_VALUE)
-
-  NumericDefaultValue<int32_t> i ("test-i", "help-i", -1);
-  NS_TEST_ASSERT_EQUAL (i.GetValue (), -1);
-  DefaultValue::Bind ("test-i", "-2");
-  NS_TEST_ASSERT_EQUAL (i.GetValue (), -2);
-  DefaultValue::Bind ("test-i", "+2");
-  NS_TEST_ASSERT_EQUAL (i.GetValue (), 2);
-  NS_TEST_ASSERT_EQUAL (i.GetType (), "int32_t(-2147483648:2147483647)");
-  NumericDefaultValue<uint32_t> ui32 ("test-ui32", "help-ui32", 10);
-  NS_TEST_ASSERT_EQUAL (ui32.GetType (), "uint32_t(0:4294967295)");
-  NumericDefaultValue<int8_t> c ("test-c", "help-c", 10);
-  NS_TEST_ASSERT_EQUAL (c.GetValue (), 10);
-  DefaultValue::Bind ("test-c", "257");  
-  NumericDefaultValue<float> x ("test-x", "help-x", 10.0);
-  NumericDefaultValue<double> y ("test-y", "help-y", 10.0);
-  DefaultValue::Bind ("test-y", "-3");  
-
-  EnumDefaultValue<enum MyEnum> e ("test-e", "help-e",
-				   MY_ENUM_C, "C",
-				   MY_ENUM_A, "A",
-				   MY_ENUM_B, "B",
-				   0, (void*)0);
-  NS_TEST_ASSERT_EQUAL (e.GetValue (), MY_ENUM_C);
-  DefaultValue::Bind ("test-e", "B");
-  NS_TEST_ASSERT_EQUAL (e.GetValue (), MY_ENUM_B);
-  NS_TEST_ASSERT_EQUAL (DefaultValue::BindSafe ("test-e", "D"), DefaultValue::INVALID_VALUE);
-
-  class MyEnumSubclass : public EnumDefaultValue<enum MyEnum>
-  {
-  public:
-    MyEnumSubclass () 
-      : EnumDefaultValue<enum MyEnum> ("test-e1", "help-e1",
-				       MY_ENUM_B, "B",
-				       MY_ENUM_A, "A",
-				       0, (void*)0)
-    {
-      AddPossibleValue (MY_ENUM_C, "C");
-      AddPossibleValue (MY_ENUM_D, "D");
-    }
-  } e1 ;
-  NS_TEST_ASSERT_EQUAL (e1.GetValue (), MY_ENUM_B);
-  DefaultValue::Bind ("test-e1", "D");
-  NS_TEST_ASSERT_EQUAL (e1.GetValue (), MY_ENUM_D);
-
-  DefaultValueList::Remove ("test-e1");
-  DefaultValueList::Remove ("test-e");
-  DefaultValueList::Remove ("bool-b");
-  DefaultValueList::Remove ("bool-a");
-  DefaultValueList::Remove ("test-i");
-  DefaultValueList::Remove ("test-c");
-  DefaultValueList::Remove ("test-x");
-  DefaultValueList::Remove ("test-y");
-  DefaultValueList::Remove ("test-ui32");
-  
-  return result;
-}
-
-static DefaultValueTest g_default_value_tests;
-
-}//namespace ns3
-
-#endif /* RUN_SELF_TESTS */