[PATCH] core: Extending public interface of CommandLine class
This commit is contained in:
14
CHANGES.html
14
CHANGES.html
@@ -113,6 +113,20 @@ us a note on ns-developers mailing list.</p>
|
||||
|
||||
<h2>Changed behavior:</h2>
|
||||
<ul>
|
||||
<li> Now it is possible to request printing command line arguments to the
|
||||
desired output stream using PrintHelp or operator <<
|
||||
<pre>
|
||||
CommandLine cmd;
|
||||
cmd.Parse (argc, argv);
|
||||
...
|
||||
|
||||
std::cerr << cmd;
|
||||
</pre>
|
||||
or
|
||||
<pre>
|
||||
cmd.PrintHelp (std::cerr);
|
||||
</pre>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<hr>
|
||||
|
||||
@@ -44,6 +44,8 @@ New user-visible features
|
||||
- Radvd application have a new Helper. See the updated
|
||||
examples/ipv6/radvd.cc for an example.
|
||||
- 11n- It is now possible to create a high throughput (HT) node that used the new 11n data rates and preambles.
|
||||
- It is now possible to request printing command line arguments to the
|
||||
desired output stream using PrintHelp or operator <<
|
||||
|
||||
Bugs fixed
|
||||
----------
|
||||
@@ -75,6 +77,7 @@ Bugs fixed
|
||||
- Bug 1731 - lte-phy-error-model passes unexpectedly
|
||||
- Bug 1742 - IPv6 HbH and Dst Extension Header size is not correctly calculated
|
||||
- Bug 1752 - RadvdInterface m_defaultLifeTime is set to milliseconds instead of seconds
|
||||
- Bug 1754 - Missing GIL lock in generated callback destructor
|
||||
|
||||
Known issues
|
||||
------------
|
||||
|
||||
@@ -147,17 +147,17 @@ CommandLine::Parse (int iargc, char *argv[])
|
||||
}
|
||||
|
||||
void
|
||||
CommandLine::PrintHelp (void) const
|
||||
CommandLine::PrintHelp (std::ostream &os) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
|
||||
std::cout << m_name << " [Program Arguments] [General Arguments]"
|
||||
<< std::endl;
|
||||
os << m_name << " [Program Arguments] [General Arguments]"
|
||||
<< std::endl;
|
||||
|
||||
if (m_usage.length ())
|
||||
{
|
||||
std::cout << std::endl;
|
||||
std::cout << m_usage << std::endl;
|
||||
os << std::endl;
|
||||
os << m_usage << std::endl;
|
||||
}
|
||||
|
||||
if (!m_items.empty ())
|
||||
@@ -169,25 +169,25 @@ CommandLine::PrintHelp (void) const
|
||||
}
|
||||
width += 3;
|
||||
|
||||
std::cout << std::endl;
|
||||
std::cout << "Program Arguments:" << std::endl;
|
||||
os << std::endl;
|
||||
os << "Program Arguments:" << std::endl;
|
||||
for (Items::const_iterator i = m_items.begin (); i != m_items.end (); ++i)
|
||||
{
|
||||
std::cout << " --"
|
||||
<< std::left << std::setw (width) << ( (*i)->m_name + ":")
|
||||
<< std::right
|
||||
<< (*i)->m_help;
|
||||
os << " --"
|
||||
<< std::left << std::setw (width) << ( (*i)->m_name + ":")
|
||||
<< std::right
|
||||
<< (*i)->m_help;
|
||||
|
||||
if ( (*i)->HasDefault ())
|
||||
{
|
||||
std::cout << " [" << (*i)->GetDefault () << "]";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
os << " [" << (*i)->GetDefault () << "]";
|
||||
}
|
||||
os << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << std::endl;
|
||||
std::cout
|
||||
os << std::endl;
|
||||
os
|
||||
<< "General Arguments:\n"
|
||||
<< " --PrintGlobals: Print the list of globals.\n"
|
||||
<< " --PrintGroups: Print the list of groups.\n"
|
||||
@@ -199,80 +199,80 @@ CommandLine::PrintHelp (void) const
|
||||
}
|
||||
|
||||
void
|
||||
CommandLine::PrintGlobals (void) const
|
||||
CommandLine::PrintGlobals (std::ostream &os) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
|
||||
std::cout << "Global values:" << std::endl;
|
||||
os << "Global values:" << std::endl;
|
||||
|
||||
for (GlobalValue::Iterator i = GlobalValue::Begin ();
|
||||
i != GlobalValue::End ();
|
||||
++i)
|
||||
{
|
||||
std::cout << " --" << (*i)->GetName () << "=[";
|
||||
os << " --" << (*i)->GetName () << "=[";
|
||||
Ptr<const AttributeChecker> checker = (*i)->GetChecker ();
|
||||
StringValue v;
|
||||
(*i)->GetValue (v);
|
||||
std::cout << v.Get () << "]" << std::endl;
|
||||
std::cout << " " << (*i)->GetHelp () << std::endl;
|
||||
os << v.Get () << "]" << std::endl;
|
||||
os << " " << (*i)->GetHelp () << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CommandLine::PrintAttributes (std::string type) const
|
||||
CommandLine::PrintAttributes (std::ostream &os, const std::string &type) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
|
||||
TypeId tid;
|
||||
if (!TypeId::LookupByNameFailSafe (type, &tid))
|
||||
{
|
||||
NS_FATAL_ERROR ("Unknown type=" << type << " in --PrintAttributes");
|
||||
NS_FATAL_ERROR ("Unknown type="<<type<<" in --PrintAttributes");
|
||||
}
|
||||
|
||||
std::cout << "Attributes for TypeId " << tid.GetName () << std::endl;
|
||||
os << "Attributes for TypeId " << tid.GetName () << std::endl;
|
||||
|
||||
for (uint32_t i = 0; i < tid.GetAttributeN (); ++i)
|
||||
{
|
||||
std::cout << " --" << tid.GetAttributeFullName (i) << "=[";
|
||||
os << " --" << tid.GetAttributeFullName (i) << "=[";
|
||||
struct TypeId::AttributeInformation info = tid.GetAttribute (i);
|
||||
std::cout << info.initialValue->SerializeToString (info.checker) << "]"
|
||||
os << info.initialValue->SerializeToString (info.checker) << "]"
|
||||
<< std::endl;
|
||||
std::cout << " " << info.help << std::endl;
|
||||
os << " " << info.help << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CommandLine::PrintGroup (std::string group) const
|
||||
CommandLine::PrintGroup (std::ostream &os, const std::string &group) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
|
||||
std::cout << "TypeIds in group " << group << ":" << std::endl;
|
||||
os << "TypeIds in group " << group << ":" << std::endl;
|
||||
|
||||
for (uint32_t i = 0; i < TypeId::GetRegisteredN (); ++i)
|
||||
{
|
||||
TypeId tid = TypeId::GetRegistered (i);
|
||||
if (tid.GetGroupName () == group)
|
||||
{
|
||||
std::cout << " " <<tid.GetName () << std::endl;
|
||||
os << " " <<tid.GetName () << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CommandLine::PrintTypeIds (void) const
|
||||
CommandLine::PrintTypeIds (std::ostream &os) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
std::cout << "Registered TypeIds:" << std::endl;
|
||||
os << "Registered TypeIds:" << std::endl;
|
||||
for (uint32_t i = 0; i < TypeId::GetRegisteredN (); ++i)
|
||||
{
|
||||
TypeId tid = TypeId::GetRegistered (i);
|
||||
std::cout << " " << tid.GetName () << std::endl;
|
||||
os << " " << tid.GetName () << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CommandLine::PrintGroups (void) const
|
||||
CommandLine::PrintGroups (std::ostream &os) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
|
||||
@@ -302,56 +302,56 @@ CommandLine::PrintGroups (void) const
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "Registered TypeId groups:" << std::endl;
|
||||
os << "Registered TypeId groups:" << std::endl;
|
||||
|
||||
for (std::list<std::string>::const_iterator k = groups.begin ();
|
||||
k != groups.end ();
|
||||
++k)
|
||||
{
|
||||
std::cout << " " << *k << std::endl;
|
||||
os << " " << *k << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CommandLine::HandleArgument (std::string name, std::string value) const
|
||||
CommandLine::HandleArgument (const std::string &name, const std::string &value) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this << name << value);
|
||||
|
||||
NS_LOG_DEBUG ("Handle arg name=" << name << " value=" << value);
|
||||
NS_LOG_DEBUG ("Handle arg name="<<name<<" value="<<value);
|
||||
if (name == "PrintHelp" || name == "help")
|
||||
{
|
||||
// method below never returns.
|
||||
PrintHelp ();
|
||||
PrintHelp (std::cout);
|
||||
std::exit (0);
|
||||
}
|
||||
else if (name == "PrintGroups")
|
||||
{
|
||||
// method below never returns.
|
||||
PrintGroups ();
|
||||
PrintGroups (std::cout);
|
||||
std::exit (0);
|
||||
}
|
||||
else if (name == "PrintTypeIds")
|
||||
{
|
||||
// method below never returns.
|
||||
PrintTypeIds ();
|
||||
PrintTypeIds (std::cout);
|
||||
std::exit (0);
|
||||
}
|
||||
else if (name == "PrintGlobals")
|
||||
{
|
||||
// method below never returns.
|
||||
PrintGlobals ();
|
||||
PrintGlobals (std::cout);
|
||||
std::exit (0);
|
||||
}
|
||||
else if (name == "PrintGroup")
|
||||
{
|
||||
// method below never returns.
|
||||
PrintGroup (value);
|
||||
PrintGroup (std::cout, value);
|
||||
std::exit (0);
|
||||
}
|
||||
else if (name == "PrintAttributes")
|
||||
{
|
||||
// method below never returns.
|
||||
PrintAttributes (value);
|
||||
PrintAttributes (std::cout, value);
|
||||
std::exit (0);
|
||||
}
|
||||
else
|
||||
@@ -378,7 +378,7 @@ CommandLine::HandleArgument (std::string name, std::string value) const
|
||||
{
|
||||
std::cerr << "Invalid command-line arguments: --"
|
||||
<< name << "=" << value << std::endl;
|
||||
PrintHelp ();
|
||||
PrintHelp (std::cerr);
|
||||
std::exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,6 +203,22 @@ public:
|
||||
*/
|
||||
std::string GetName () const;
|
||||
|
||||
/**
|
||||
* \brief Print program usage to the desired output stream
|
||||
*
|
||||
* Handler for \c \-\-PrintHelp and \c \-\-help: print Usage(), argument names, and help strings
|
||||
*
|
||||
* Alternatively, an overloaded operator << can be used:
|
||||
* @code
|
||||
* CommandLine cmd;
|
||||
* cmd.Parse (argc, argv);
|
||||
* ...
|
||||
*
|
||||
* std::cerr << cmd;
|
||||
* @endcode
|
||||
*/
|
||||
void PrintHelp (std::ostream &os) const;
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
@@ -279,29 +295,25 @@ private:
|
||||
* \param name the argument name
|
||||
* \param value the command line value
|
||||
*/
|
||||
void HandleArgument (std::string name, std::string value) const;
|
||||
/**
|
||||
* Handler for \c \-\-PrintHelp and \c \-\-help: print Usage(), argument names, and help strings
|
||||
*/
|
||||
void PrintHelp (void) const;
|
||||
void HandleArgument (const std::string &name, const std::string &value) const;
|
||||
/** Handler for \c \-\-PrintGlobals: print all global variables and values */
|
||||
void PrintGlobals (void) const;
|
||||
void PrintGlobals (std::ostream &os) const;
|
||||
/**
|
||||
* Handler for \c \-\-PrintAttributes: print the attributes for a given type.
|
||||
*
|
||||
* \param type the TypeId whose Attributes should be displayed
|
||||
*/
|
||||
void PrintAttributes (std::string type) const;
|
||||
void PrintAttributes (std::ostream &os, const std::string &type) const;
|
||||
/**
|
||||
* Handler for \c \-\-PrintGroup: print all types belonging to a given group.
|
||||
*
|
||||
* \param group the name of the TypeId group to display
|
||||
*/
|
||||
void PrintGroup (std::string group) const;
|
||||
void PrintGroup (std::ostream &os, const std::string &group) const;
|
||||
/** Handler for \c \-\-PrintTypeIds: print all TypeId names. */
|
||||
void PrintTypeIds (void) const;
|
||||
void PrintTypeIds (std::ostream &os) const;
|
||||
/** Handler for \c \-\-PrintGroups: print all TypeId group names */
|
||||
void PrintGroups (void) const;
|
||||
void PrintGroups (std::ostream &os) const;
|
||||
/**
|
||||
* Copy constructor
|
||||
*
|
||||
@@ -399,6 +411,26 @@ CommandLineHelper::UserItemParse (const std::string value, T & val)
|
||||
return !iss.bad () && !iss.fail ();
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Overloaded operator << to print program usage (shortcut for CommandLine::PrintHelper)
|
||||
* \see CommandLine::PrintHelper
|
||||
*
|
||||
* Example usage:
|
||||
* @code
|
||||
* CommandLine cmd;
|
||||
* cmd.Parse (argc, argv);
|
||||
* ...
|
||||
*
|
||||
* std::cerr << cmd;
|
||||
* @endcode
|
||||
*/
|
||||
inline std::ostream &
|
||||
operator << (std::ostream &os, const CommandLine &cmd)
|
||||
{
|
||||
cmd.PrintHelp (os);
|
||||
return os;
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* COMMAND_LINE_H */
|
||||
|
||||
Reference in New Issue
Block a user