Make the source code introspection program output text
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
#include "ns3/object.h"
|
||||
#include "ns3/pointer.h"
|
||||
#include "ns3/object-vector.h"
|
||||
@@ -13,26 +14,55 @@ using namespace ns3;
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("PrintIntrospectedDoxygen");
|
||||
|
||||
namespace
|
||||
{
|
||||
std::string anchor;
|
||||
std::string boldStart;
|
||||
std::string boldStop;
|
||||
std::string breakBoth;
|
||||
std::string breakHtmlOnly;
|
||||
std::string breakTextOnly;
|
||||
std::string brief;
|
||||
std::string commentStart;
|
||||
std::string commentStop;
|
||||
std::string defgroupAttributeListStart;
|
||||
std::string defgroupAttributeListStop;
|
||||
std::string defgroupGlobalValueListStart;
|
||||
std::string defgroupGlobalValueListStop;
|
||||
std::string defgroupTraceSourceListStart;
|
||||
std::string defgroupTraceSourceListStop;
|
||||
std::string functionStart;
|
||||
std::string functionStop;
|
||||
std::string indentHtmlOnly;
|
||||
std::string ingroupConstructs;
|
||||
std::string listStart;
|
||||
std::string listStop;
|
||||
std::string listLineStart;
|
||||
std::string listLineStop;
|
||||
std::string reference;
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
void
|
||||
PrintAttributes (TypeId tid, std::ostream &os)
|
||||
{
|
||||
os << "<ul>"<<std::endl;
|
||||
os << listStart << std::endl;
|
||||
for (uint32_t j = 0; j < tid.GetAttributeN (); j++)
|
||||
{
|
||||
struct TypeId::AttributeInformation info = tid.GetAttribute(j);
|
||||
os << "<li><b>" << info.name << "</b>: "
|
||||
os << listLineStart << boldStart << info.name << boldStop << ": "
|
||||
<< info.help << std::endl;
|
||||
os << " <ul>" << std::endl
|
||||
<< " <li>Set with class: \\ref " << info.checker->GetValueTypeName () << "</li>" << std::endl;
|
||||
os << " " << listStart << std::endl
|
||||
<< " " << listLineStart << "Set with class: " << reference << info.checker->GetValueTypeName () << listLineStop << std::endl;
|
||||
if (info.checker->HasUnderlyingTypeInformation ())
|
||||
{
|
||||
os << " <li>Underlying type: \\ref " << info.checker->GetUnderlyingTypeInformation () << "</li>" << std::endl;
|
||||
os << " " << listLineStart << "Underlying type: " << reference << info.checker->GetUnderlyingTypeInformation () << listLineStop << std::endl;
|
||||
}
|
||||
if (info.flags & TypeId::ATTR_CONSTRUCT && info.accessor->HasSetter ())
|
||||
{
|
||||
os << " <li>Initial value: " << info.initialValue->SerializeToString (info.checker) << "</li>" << std::endl;
|
||||
os << " " << listLineStart << "Initial value: " << info.initialValue->SerializeToString (info.checker) << listLineStop << std::endl;
|
||||
}
|
||||
os << " <li>Flags: ";
|
||||
os << " " << listLineStart << "Flags: ";
|
||||
if (info.flags & TypeId::ATTR_CONSTRUCT && info.accessor->HasSetter ())
|
||||
{
|
||||
os << "construct ";
|
||||
@@ -45,26 +75,26 @@ PrintAttributes (TypeId tid, std::ostream &os)
|
||||
{
|
||||
os << "read ";
|
||||
}
|
||||
os << "</li>" << std::endl;
|
||||
os << " </ul> " << std::endl;
|
||||
os << listLineStop << std::endl;
|
||||
os << " " << listStop << " " << std::endl;
|
||||
|
||||
}
|
||||
os << "</ul>" << std::endl;
|
||||
os << listStop << std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
PrintTraceSources (TypeId tid, std::ostream &os)
|
||||
{
|
||||
os << "<ul>"<<std::endl;
|
||||
os << listStart << std::endl;
|
||||
for (uint32_t i = 0; i < tid.GetTraceSourceN (); ++i)
|
||||
{
|
||||
struct TypeId::TraceSourceInformation info = tid.GetTraceSource (i);
|
||||
os << "<li><b>" << info.name << "</b>: "
|
||||
os << listLineStart << boldStart << info.name << boldStop << ": "
|
||||
<< info.help
|
||||
<< std::endl;
|
||||
os << "</li>" << std::endl;
|
||||
os << listLineStop << std::endl;
|
||||
}
|
||||
os << "</ul>"<<std::endl;
|
||||
os << listStop << std::endl;
|
||||
}
|
||||
|
||||
|
||||
@@ -259,8 +289,100 @@ StaticInformation::find_and_replace( std::string &source, const std::string find
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
PrintHelp (const char *program_name)
|
||||
{
|
||||
std::cout << "Usage: " << program_name << " [options]" << std::endl
|
||||
<< std::endl
|
||||
<< "Options:" << std::endl
|
||||
<< " --help : print these options" << std::endl
|
||||
<< " --output-text : format output as plain text" << std::endl;
|
||||
}
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
bool outputText = false;
|
||||
char *programName = argv[0];
|
||||
|
||||
argv++;
|
||||
|
||||
while (*argv != 0)
|
||||
{
|
||||
char *arg = *argv;
|
||||
|
||||
if (strcmp (arg, "--help") == 0)
|
||||
{
|
||||
PrintHelp (programName);
|
||||
return 0;
|
||||
}
|
||||
else if (strcmp(arg, "--output-text") == 0)
|
||||
{
|
||||
outputText = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// un-recognized command-line argument
|
||||
PrintHelp (programName);
|
||||
return 0;
|
||||
}
|
||||
argv++;
|
||||
}
|
||||
|
||||
if (outputText)
|
||||
{
|
||||
anchor = "";
|
||||
boldStart = "";
|
||||
boldStop = "";
|
||||
breakBoth = "\n";
|
||||
breakHtmlOnly = "";
|
||||
breakTextOnly = "\n";
|
||||
brief = "";
|
||||
commentStart = "===============================================================\n";
|
||||
commentStop = "";
|
||||
defgroupAttributeListStart = "";
|
||||
defgroupAttributeListStop = "\n";
|
||||
defgroupGlobalValueListStart = "";
|
||||
defgroupGlobalValueListStop = "";
|
||||
defgroupTraceSourceListStart = "";
|
||||
defgroupTraceSourceListStop = "\n";
|
||||
functionStart = "";
|
||||
functionStop = "\n\n";
|
||||
indentHtmlOnly = "";
|
||||
ingroupConstructs = "";
|
||||
listStart = "";
|
||||
listStop = "";
|
||||
listLineStart = " * ";
|
||||
listLineStop = "";
|
||||
reference = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
anchor = "\\anchor ";
|
||||
boldStart = "<b>";
|
||||
boldStop = "</b>";
|
||||
breakBoth = "<br>";
|
||||
breakHtmlOnly = "<br>";
|
||||
breakTextOnly = "";
|
||||
brief = "\\brief ";
|
||||
commentStart = "/*!";
|
||||
commentStop = "*/";
|
||||
defgroupAttributeListStart = "\\defgroup AttributeList ";
|
||||
defgroupAttributeListStop = "";
|
||||
defgroupGlobalValueListStart = "\\defgroup GlobalValueList ";
|
||||
defgroupGlobalValueListStop = "";
|
||||
defgroupTraceSourceListStart = "\\defgroup TraceSourceList ";
|
||||
defgroupTraceSourceListStop = "";
|
||||
functionStart = "\\fn ";
|
||||
functionStop = "";
|
||||
indentHtmlOnly = " ";
|
||||
ingroupConstructs = "\\ingroup constructs\n";
|
||||
listStart = "<ul>";
|
||||
listStop = "</ul>";
|
||||
listLineStart = "<li>";
|
||||
listLineStop = "</li>";
|
||||
reference = "\\ref ";
|
||||
}
|
||||
|
||||
NodeContainer c; c.Create (1);
|
||||
|
||||
StaticInformation info;
|
||||
@@ -278,37 +400,67 @@ int main (int argc, char *argv[])
|
||||
info.Gather (object->GetInstanceTypeId ());
|
||||
}
|
||||
|
||||
std::map< std::string, uint32_t> nameMap;
|
||||
std::map< std::string, uint32_t>::const_iterator nameMapIterator;
|
||||
|
||||
// Create a map from the class names to their index in the vector of
|
||||
// TypeId's so that the names will end up in alphabetical order.
|
||||
for (uint32_t i = 0; i < TypeId::GetRegisteredN (); i++)
|
||||
{
|
||||
std::cout << "/*!" << std::endl;
|
||||
TypeId tid = TypeId::GetRegistered (i);
|
||||
if (tid.MustHideFromDocumentation ())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
std::cout << "\\fn static TypeId " << tid.GetName () << "::GetTypeId (void)" << std::endl;
|
||||
std::cout << "\\brief This method returns the TypeId associated to \\ref " << tid.GetName ()
|
||||
|
||||
// Capitalize all of letters in the name so that it sorts
|
||||
// correctly in the map.
|
||||
std::string name = tid.GetName ();
|
||||
for (uint32_t j = 0; j < name.length (); j++)
|
||||
{
|
||||
name[j] = toupper (name[j]);
|
||||
}
|
||||
|
||||
// Save this name's index.
|
||||
nameMap[name] = i;
|
||||
}
|
||||
|
||||
// Iterate over the map, which will print the class names in
|
||||
// alphabetical order.
|
||||
for (nameMapIterator = nameMap.begin (); nameMapIterator != nameMap.end (); nameMapIterator++)
|
||||
{
|
||||
// Get the class's index out of the map;
|
||||
uint32_t i = nameMapIterator->second;
|
||||
|
||||
std::cout << commentStart << std::endl;
|
||||
TypeId tid = TypeId::GetRegistered (i);
|
||||
if (tid.MustHideFromDocumentation ())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
std::cout << functionStart << "static TypeId " << tid.GetName () << "::GetTypeId (void)" << functionStop << std::endl;
|
||||
std::cout << brief << "This method returns the TypeId associated to " << reference << tid.GetName () << "."
|
||||
<< std::endl << std::endl;
|
||||
std::vector<std::string> paths = info.Get (tid);
|
||||
if (!paths.empty ())
|
||||
{
|
||||
std::cout << "This object is accessible through the following paths with Config::Set and Config::Connect:"
|
||||
<< std::endl;
|
||||
std::cout << "<ul>" << std::endl;
|
||||
std::cout << listStart << std::endl;
|
||||
for (uint32_t k = 0; k < paths.size (); ++k)
|
||||
{
|
||||
std::string path = paths[k];
|
||||
std::cout << "<li>" << path << "</li>" << std::endl;
|
||||
std::cout << listLineStart << path << listLineStop << breakTextOnly << std::endl;
|
||||
}
|
||||
std::cout << "</ul>" << std::endl;
|
||||
std::cout << listStop << std::endl;
|
||||
}
|
||||
if (tid.GetAttributeN () == 0)
|
||||
{
|
||||
std::cout << "No Attributes defined for this type.<br>" << std::endl;
|
||||
std::cout << "No Attributes defined for this type." << breakBoth << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Attributes defined for this type:<br>" << std::endl;
|
||||
std::cout << "Attributes defined for this type:" << breakHtmlOnly << std::endl;
|
||||
PrintAttributes (tid, std::cout);
|
||||
}
|
||||
{
|
||||
@@ -317,7 +469,7 @@ int main (int argc, char *argv[])
|
||||
{
|
||||
if (tmp.GetAttributeN () != 0)
|
||||
{
|
||||
std::cout << "Attributes defined in parent class " << tmp.GetName () << ":<br>" << std::endl;
|
||||
std::cout << "Attributes defined in parent class " << tmp.GetName () << ":" << breakHtmlOnly << std::endl;
|
||||
PrintAttributes (tmp, std::cout);
|
||||
}
|
||||
tmp = tmp.GetParent ();
|
||||
@@ -325,11 +477,11 @@ int main (int argc, char *argv[])
|
||||
}
|
||||
if (tid.GetTraceSourceN () == 0)
|
||||
{
|
||||
std::cout << "No TraceSources defined for this type.<br>" << std::endl;
|
||||
std::cout << "No TraceSources defined for this type." << breakBoth << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "TraceSources defined for this type:<br>" << std::endl;
|
||||
std::cout << "TraceSources defined for this type:" << breakHtmlOnly << std::endl;
|
||||
PrintTraceSources (tid, std::cout);
|
||||
}
|
||||
{
|
||||
@@ -338,19 +490,19 @@ int main (int argc, char *argv[])
|
||||
{
|
||||
if (tmp.GetTraceSourceN () != 0)
|
||||
{
|
||||
std::cout << "TraceSources defined in parent class " << tmp.GetName () << ":<br>" << std::endl;
|
||||
std::cout << "TraceSources defined in parent class " << tmp.GetName () << ":" << breakHtmlOnly << std::endl;
|
||||
PrintTraceSources (tmp, std::cout);
|
||||
}
|
||||
tmp = tmp.GetParent ();
|
||||
}
|
||||
}
|
||||
std::cout << "*/" << std::endl;
|
||||
std::cout << commentStop << std::endl;
|
||||
}
|
||||
|
||||
|
||||
std::cout << "/*!" << std::endl
|
||||
<< "\\ingroup constructs" << std::endl
|
||||
<< "\\defgroup TraceSourceList The list of all trace sources." << std::endl;
|
||||
std::cout << commentStart << std::endl
|
||||
<< ingroupConstructs
|
||||
<< defgroupTraceSourceListStart << "The list of all trace sources." << defgroupTraceSourceListStop << std::endl;
|
||||
for (uint32_t i = 0; i < TypeId::GetRegisteredN (); ++i)
|
||||
{
|
||||
TypeId tid = TypeId::GetRegistered (i);
|
||||
@@ -359,21 +511,20 @@ int main (int argc, char *argv[])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
std::cout << "<b>" << tid.GetName () << "</b><br>" << std::endl
|
||||
<< "<ul>" << std::endl;
|
||||
std::cout << boldStart << tid.GetName () << boldStop << breakHtmlOnly << std::endl
|
||||
<< listStart << std::endl;
|
||||
for (uint32_t j = 0; j < tid.GetTraceSourceN (); ++j)
|
||||
{
|
||||
struct TypeId::TraceSourceInformation info = tid.GetTraceSource(j);
|
||||
std::cout << "<li>" << info.name << ": " << info.help << "</li>" << std::endl;
|
||||
std::cout << listLineStart << info.name << ": " << info.help << listLineStop << std::endl;
|
||||
}
|
||||
std::cout << "</ul>" << std::endl;
|
||||
std::cout << listStop << std::endl;
|
||||
}
|
||||
std::cout << "*/" << std::endl;
|
||||
std::cout << commentStop << std::endl;
|
||||
|
||||
|
||||
std::cout << "/*!" << std::endl
|
||||
<< "\\ingroup constructs" << std::endl
|
||||
<< "\\defgroup AttributeList The list of all attributes." << std::endl;
|
||||
std::cout << commentStart << std::endl
|
||||
<< ingroupConstructs
|
||||
<< defgroupAttributeListStart << "The list of all attributes." << defgroupAttributeListStop << std::endl;
|
||||
for (uint32_t i = 0; i < TypeId::GetRegisteredN (); ++i)
|
||||
{
|
||||
TypeId tid = TypeId::GetRegistered (i);
|
||||
@@ -382,31 +533,31 @@ int main (int argc, char *argv[])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
std::cout << "<b>" << tid.GetName () << "</b><br>" << std::endl
|
||||
<< "<ul>" << std::endl;
|
||||
std::cout << boldStart << tid.GetName () << boldStop << breakHtmlOnly << std::endl
|
||||
<< listStart << std::endl;
|
||||
for (uint32_t j = 0; j < tid.GetAttributeN (); ++j)
|
||||
{
|
||||
struct TypeId::AttributeInformation info = tid.GetAttribute(j);
|
||||
std::cout << "<li>" << info.name << ": " << info.help << "</li>" << std::endl;
|
||||
std::cout << listLineStart << info.name << ": " << info.help << listLineStop << std::endl;
|
||||
}
|
||||
std::cout << "</ul>" << std::endl;
|
||||
std::cout << listStop << std::endl;
|
||||
}
|
||||
std::cout << "*/" << std::endl;
|
||||
std::cout << commentStop << std::endl;
|
||||
|
||||
|
||||
|
||||
std::cout << "/*!" << std::endl
|
||||
<< "\\ingroup constructs" << std::endl
|
||||
<< "\\defgroup GlobalValueList The list of all global values." << std::endl
|
||||
<< "<ul>" << std::endl;
|
||||
std::cout << commentStart << std::endl
|
||||
<< ingroupConstructs
|
||||
<< defgroupGlobalValueListStart << "The list of all global values." << defgroupGlobalValueListStop << std::endl
|
||||
<< listStart << std::endl;
|
||||
for (GlobalValue::Iterator i = GlobalValue::Begin (); i != GlobalValue::End (); ++i)
|
||||
{
|
||||
StringValue val;
|
||||
(*i)->GetValue (val);
|
||||
std::cout << " <li><b>\\anchor GlobalValue" << (*i)->GetName () << " " << (*i)->GetName () << "</b>: " << (*i)->GetHelp () << "(" << val.Get () << ")</li>" << std::endl;
|
||||
std::cout << indentHtmlOnly << listLineStart << boldStart << anchor << "GlobalValue" << (*i)->GetName () << " " << (*i)->GetName () << boldStop << ": " << (*i)->GetHelp () << "(" << val.Get () << ")" << listLineStop << std::endl;
|
||||
}
|
||||
std::cout << "</ul>" << std::endl
|
||||
<< "*/" << std::endl;
|
||||
std::cout << listStop << std::endl
|
||||
<< commentStop << std::endl;
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user