15#include "ns3/command-line.h" 
   16#include "ns3/config.h" 
   17#include "ns3/global-value.h" 
   19#include "ns3/node-container.h" 
   20#include "ns3/object-vector.h" 
   21#include "ns3/object.h" 
   22#include "ns3/pointer.h" 
   23#include "ns3/simple-channel.h" 
   24#include "ns3/string.h" 
   25#include "ns3/system-path.h" 
   97std::map<std::string, ns3::TypeId::AttributeInformation>
 
  100    std::map<std::string, ns3::TypeId::AttributeInformation> index;
 
  104        index[info.
name] = info;
 
 
  115std::map<std::string, ns3::TypeId::TraceSourceInformation>
 
  118    std::map<std::string, ns3::TypeId::TraceSourceInformation> index;
 
  122        index[info.
name] = info;
 
 
 
  149        commentStart = 
"===============================================================\n";
 
  152        file = 
"File: introspected-doxygen.txt";
 
 
  255    void Print(std::ostream& os) 
const;
 
  262    std::vector<std::string> 
Get(
TypeId tid) 
const;
 
  295    std::vector<std::pair<TypeId, std::string>> 
m_output;
 
 
  347        os << item.first.GetName() << 
" -> " << item.second << std::endl;
 
 
  355    std::ostringstream oss;
 
 
  384std::vector<std::string>
 
  388    std::vector<std::string> paths;
 
  391        if (item.first == tid)
 
  393            paths.push_back(item.second);
 
 
  418    std::sort(t.begin(), t.end());
 
  419    t.erase(std::unique(t.begin(), t.end()), t.end());
 
 
  422std::vector<std::string>
 
  451        if (ptrChecker != 
nullptr)
 
  453            TypeId pointee = ptrChecker->GetPointeeTypeId();
 
  458            if (objectTypeId == pointee)
 
  475        const auto vectorChecker =
 
  477        if (vectorChecker != 
nullptr)
 
  479            TypeId item = vectorChecker->GetItemTypeId();
 
  493            std::string childName = 
"$" + child.
GetName();
 
  503        if (item.first == tid || item.second == tid)
 
  506            if (item.first == tid)
 
  510            if (item.second == tid)
 
  514            std::string name = 
"$" + other.
GetName();
 
 
  534    static bool mapped = 
false;
 
 
  588typedef std::map<std::string, int32_t> 
NameMap;
 
  603    static bool mapped = 
false;
 
  628        std::transform(
name.begin(), 
name.end(), 
name.begin(), ::toupper);
 
  636    for (
const auto& item : noTids)
 
 
  657    static bool mapped = 
false;
 
  664    for (
const auto& item : nameMap)
 
  677            groups[group].insert(tid);
 
 
  721        os << 
"Introspection did not find any typical Config paths." << 
breakBoth << std::endl;
 
  727        os << tid.
GetName() << 
" is accessible through the following paths" 
  728           << 
" with Config::Set and Config::Connect:" << std::endl;
 
  730        for (
const auto& path : paths)
 
 
  755    for (
const auto& [
name, info] : index)
 
  760           << info.checker->GetValueTypeName() << 
listLineStop << std::endl;
 
  762        std::string underType;
 
  763        if (info.checker->HasUnderlyingTypeInformation())
 
  767            std::string valType = info.checker->GetValueTypeName();
 
  768            underType = info.checker->GetUnderlyingTypeInformation();
 
  769            bool handled = 
false;
 
  770            if ((valType != 
"ns3::EnumValue") && (underType != 
"std::string"))
 
  773                if (valType == 
"ns3::PointerValue")
 
  775                    const auto ptrChecker =
 
  777                    if (ptrChecker != 
nullptr)
 
  780                           << 
"< " << 
reference << ptrChecker->GetPointeeTypeId().GetName() << 
">";
 
  784                else if (valType == 
"ns3::ObjectPtrContainerValue")
 
  786                    const auto ptrChecker =
 
  788                    if (ptrChecker != 
nullptr)
 
  791                           << 
"< " << 
reference << ptrChecker->GetItemTypeId().GetName() << 
">";
 
  797                auto match = [&uType = std::as_const(underType)](
const std::string& s) {
 
  798                    return uType.rfind(s, 0) == 0; 
 
  801                if (match(
"bool") || match(
"double") || match(
"int8_t") || match(
"uint8_t") ||
 
  802                    match(
"int16_t") || match(
"uint16_t") || match(
"int32_t") ||
 
  803                    match(
"uint32_t") || match(
"int64_t") || match(
"uint64_t"))
 
  817            std::string value = info.initialValue->SerializeToString(info.checker);
 
  818            if (underType == 
"std::string" && value.empty())
 
  825        bool moreFlags{
false};
 
  831                                                   std::string msg) -> 
void {
 
  832            if (myInfo.flags & flag && hasFunc)
 
 
  866        os << 
"No Attributes are defined for this type." << 
breakBoth << std::endl;
 
 
  904    for (
const auto& [
name, info] : index)
 
  914        os << 
"Callback signature: " << info.callback << std::endl;
 
 
  939        os << 
"No TraceSources are defined for this type." << 
breakBoth << std::endl;
 
 
  974    std::size_t arch = (
sizeof(
void*) * CHAR_BIT);
 
  977       << arch << 
"-bit architecture)." << std::endl;
 
 
 1027    for (
const auto& item : nameMap)
 
 1030        if (item.second < 0)
 
 
 1053    os << 
commentStart << 
page << 
"TypeIdList All ns3::TypeId's\n" << std::endl;
 
 1054    os << 
"This is a list of all" << 
reference << 
"ns3::TypeId's.\n" 
 1055       << 
"For more information see the" << 
reference << 
"ns3::TypeId " 
 1056       << 
"section of this API documentation and the" << 
referenceNo << 
"TypeId section " 
 1057       << 
"in the Configuration and " << 
referenceNo << 
"Attributes chapter of the Manual.\n" 
 1065    for (
const auto& item : nameMap)
 
 1068        if (item.second < 0)
 
 
 1095    os << 
commentStart << 
page << 
"AttributeList All Attributes\n" << std::endl;
 
 1096    os << 
"This is a list of all" << 
reference << 
"attributes classes.  " 
 1097       << 
"For more information see the" << 
reference << 
"attributes " 
 1098       << 
"section of this API documentation and the Attributes sections " 
 1099       << 
"in the Tutorial and Manual.\n" 
 1105    for (
const auto& item : nameMap)
 
 1108        if (item.second < 0)
 
 1124        for (
const auto& [
name, info] : index)
 
 
 1144    os << 
commentStart << 
page << 
"GlobalValueList All GlobalValues\n" << std::endl;
 
 1145    os << 
"This is a list of all" << 
reference << 
"ns3::GlobalValue instances.\n" 
 1146       << 
"See ns3::GlobalValue for how to set these." << std::endl;
 
 1152        (*i)->GetValue(val);
 
 1155           << (*i)->GetHelp() << 
".  Default value: " << val.
Get() << 
"." << 
listLineStop 
 
 1172    os << 
commentStart << 
page << 
"GroupsList All Object Groups\n" << std::endl;
 
 1173    os << 
"This is a list of all Object Groups.\n" 
 1174       << 
"Objects are added to groups by " << 
hrefStart << 
"ns3::TypeId::SetGroupName()" << 
hrefMid 
 1175       << 
"ns3::TypeId::SetGroupName" << 
hrefStop << 
"\n" 
 1180    for (
const auto& g : groups)
 
 1185        for (
const auto& tid : g.second)
 
 
 1204    os << 
commentStart << 
page << 
"LogComponentList All LogComponents\n" << std::endl;
 
 1205    os << 
"This is a list of all" << 
reference << 
"ns3::LogComponent instances.\n" << std::endl;
 
 1213    std::size_t widthL = std::string(
"Log Component").size();
 
 1214    std::size_t widthR = std::string(
"file").size();
 
 1215    for (
const auto& it : (*logs))
 
 1217        widthL = std::max(widthL, it.first.size());
 
 1218        std::string 
file = it.second->File();
 
 1221        while (
file.find(
"../") == 0)
 
 1225        widthR = std::max(widthR, 
file.size());
 
 1227    const std::string tLeft(
"| ");
 
 1228    const std::string tMid(
" | ");
 
 1229    const std::string tRight(
" |");
 
 1232    os << tLeft << std::setw(widthL) << std::left << 
"Log Component" << tMid << std::setw(widthR)
 
 1233       << std::left << 
"File" << tRight << std::endl;
 
 1234    os << tLeft << 
":" << std::string(widthL - 1, 
'-') << tMid << 
":" 
 1235       << std::string(widthR - 1, 
'-') << tRight << std::endl;
 
 1237    for (
const auto& it : (*logs))
 
 1239        std::string 
file = it.second->File();
 
 1242        while (
file.find(
"../") == 0)
 
 1247        os << tLeft << std::setw(widthL) << std::left << it.first << tMid << std::setw(widthR)
 
 1248           << 
file << tRight << std::endl;
 
 1250    os << std::right << std::endl;
 
 
 1266    os << 
commentStart << 
page << 
"TraceSourceList All TraceSources\n" << std::endl;
 
 1267    os << 
"This is a list of all" << 
reference << 
"tracing sources.  " 
 1268       << 
"For more information see the " << 
reference << 
"tracing " 
 1269       << 
"section of this API documentation and the Tracing sections " 
 1270       << 
"in the Tutorial and Manual.\n" 
 1277    for (
const auto& item : nameMap)
 
 1280        if (item.second < 0)
 
 1297        for (
const auto& [
name, info] : index)
 
 
 1329    std::string section = 
"attribute_" + 
name;
 
 1335       << 
"AttributeValue implementation for " << 
name << 
"\n";
 
 
 1356                            const std::string& 
name,
 
 1357                            const std::string& type,
 
 1358                            const std::string& header)
 
 1365    std::string valClass = 
name + 
"Value";
 
 1366    std::string qualClass = 
" ns3::" + valClass;
 
 1369    os << 
classStart << qualClass << 
" \"" << header << 
"\"" << std::endl;
 
 1370    os << 
"AttributeValue implementation for " << 
name << 
"." << std::endl;
 
 1371    os << 
seeAlso << 
"AttributeValue" << std::endl;
 
 1377    os << 
"(const " << type << 
" & value)\n" 
 1379       << 
argument << 
"[in] value The " << 
name << 
" value to use.\n";
 
 1389       << 
"Access the " << 
name << 
" value as type " << 
codeWord << 
"T.\n" 
 1396    if (type != 
"Callback") 
 
 1400           << 
"Set the value.\n" 
 1401           << 
argument << 
"[in] value The value to adopt.\n" 
 1407       << 
"The stored " << 
name << 
" instance.\n" 
 
 1425    std::string make = 
"ns3::Make" + 
name + 
"Accessor ";
 
 1430       << make << 
"(T1 a1)\n" 
 1431       << 
copyDoc << 
"ns3::MakeAccessorHelper(T1)\n" 
 1432       << 
seeAlso << 
"AttributeAccessor\n" 
 1438       << make << 
"(T1 a1, T2 a2)\n" 
 1439       << 
copyDoc << 
"ns3::MakeAccessorHelper(T1,T2)\n" 
 1440       << 
seeAlso << 
"AttributeAccessor\n" 
 
 1458    std::string make = 
"ns3::Make" + 
name + 
"Checker ";
 
 1464       << 
" \"" << header << 
"\"" << std::endl;
 
 1465    os << 
"AttributeChecker implementation for " << 
name << 
"Value." << std::endl;
 
 1466    os << 
seeAlso << 
"AttributeChecker" << std::endl;
 
 1473       << 
returns << 
"The AttributeChecker.\n" 
 1474       << 
seeAlso << 
"AttributeChecker\n" 
 
 1520      { 
"Address",        
"Address",        
true,  
"address.h"          },
 
 1521      { 
"Box",            
"Box",            
true,  
"box.h"              },
 
 1522      { 
"DataRate",       
"DataRate",       
true,  
"data-rate.h"        },
 
 1523      { 
"Length",         
"Length",         
true,  
"length.h"           },
 
 1524      { 
"Ipv4Address",    
"Ipv4Address",    
true,  
"ipv4-address.h"     },
 
 1525      { 
"Ipv4Mask",       
"Ipv4Mask",       
true,  
"ipv4-address.h"     },
 
 1526      { 
"Ipv6Address",    
"Ipv6Address",    
true,  
"ipv6-address.h"     },
 
 1527      { 
"Ipv6Prefix",     
"Ipv6Prefix",     
true,  
"ipv6-address.h"     },
 
 1528      { 
"Mac16Address",   
"Mac16Address",   
true,  
"mac16-address.h"    },
 
 1529      { 
"Mac48Address",   
"Mac48Address",   
true,  
"mac48-address.h"    },
 
 1530      { 
"Mac64Address",   
"Mac64Address",   
true,  
"mac64-address.h"    },
 
 1531      { 
"ObjectFactory",  
"ObjectFactory",  
true,  
"object-factory.h"   },
 
 1532      { 
"Priomap",        
"Priomap",        
true,  
"prio-queue-disc.h"  },
 
 1533      { 
"QueueSize",      
"QueueSize",      
true,  
"queue-size.h"       },
 
 1534      { 
"Rectangle",      
"Rectangle",      
true,  
"rectangle.h"        },
 
 1535      { 
"Ssid",           
"Ssid",           
true,  
"ssid.h"             },
 
 1536      { 
"TypeId",         
"TypeId",         
true,  
"type-id.h"          },
 
 1537      { 
"UanModesList",   
"UanModesList",   
true,  
"uan-tx-mode.h"      },
 
 1538      { 
"ValueClassTest", 
"ValueClassTest", 
false, 
"attribute-test-suite.cc"   },
 
 1539      { 
"Vector2D",       
"Vector2D",       
true,  
"vector.h"           },
 
 1540      { 
"Vector3D",       
"Vector3D",       
true,  
"vector.h"           },
 
 1541      { 
"Waypoint",       
"Waypoint",       
true,  
"waypoint.h"         },
 
 1542      { 
"WifiMode",       
"WifiMode",       
true,  
"wifi-mode.h"        },
 
 1545      { 
"Boolean",        
"bool",           
false, 
"boolean.h"          },
 
 1546      { 
"Callback",       
"CallbackBase",   
true,  
"callback.h"         },
 
 1547      { 
"Double",         
"double",         
false, 
"double.h"           },
 
 1548      { 
"Enum",           
"T",              
false, 
"enum.h"             },
 
 1549      { 
"Integer",        
"int64_t",        
false, 
"integer.h"          },
 
 1550      { 
"String",         
"std::string",    
false, 
"string.h"           },
 
 1551      { 
"Time",           
"Time",           
true,  
"nstime.h"           },
 
 1552      { 
"Uinteger",       
"uint64_t",       
false, 
"uinteger.h"         },
 
 1553      { 
"",               
"",               
false, 
"last placeholder"   }
 
 1558    while (!attributes[i].m_name.empty())
 
 
 1579main(
int argc, 
char* argv[])
 
 1586    cmd.Usage(
"Generate documentation for all ns-3 registered types, " 
 1587              "trace sources, attributes and global variables.");
 
 1588    cmd.AddValue(
"output-text", 
"format output as plain text", 
outputText);
 
 1589    cmd.AddValue(
"TypeId", 
"Print docs for just the given TypeId", typeId);
 
 1590    cmd.Parse(argc, argv);
 
 1592    if (!typeId.empty())
 
 1602            auto fqTypeId = 
"ns3::" + typeId;
 
 1606                std::cout << 
"\nFound fully qualified name " << fqTypeId << 
"\n\n";
 
 1616            std::cerr << 
"Invalid TypeId name: " << typeId << 
"\n" << std::endl;
 
 1628    std::cout << std::endl;
 
 1631              << 
"Doxygen docs generated from the TypeId database.\n" 
 1632              << 
note << 
"This file is automatically generated by " << 
codeWord 
 1633              << 
"print-introspected-doxygen.cc. Do not edit this file! " 
 1634              << 
"Edit that file instead.\n" 
Parse command-line arguments.
static Iterator Begin()
The Begin iterator.
static Iterator End()
The End iterator.
static ComponentList * GetComponentList()
Get the list of LogComponents.
std::unordered_map< std::string, LogComponent * > ComponentList
LogComponent name map.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
static TypeId GetTypeId()
Register this type.
AttributeChecker implementation for ObjectPtrContainerValue.
AttributeChecker implementation for PointerValue.
Smart pointer class similar to boost::intrusive_ptr.
Hold variables of type string.
a unique identifier for an interface.
bool IsChildOf(TypeId other) const
Check if this TypeId is a child of another.
std::size_t GetTraceSourceN() const
Get the number of Trace sources.
bool MustHideFromDocumentation() const
Check if this TypeId should not be listed in documentation.
AttributeFlag
Flags describing when a given attribute can be read or written.
@ ATTR_GET
The attribute can be read.
@ ATTR_SET
The attribute can be written.
@ ATTR_CONSTRUCT
The attribute can be written at construction-time.
TypeId::TraceSourceInformation GetTraceSource(std::size_t i) const
Get the trace source by index.
std::string GetGroupName() const
Get the group name.
static uint16_t GetRegisteredN()
Get the number of registered TypeIds.
std::size_t GetAttributeN() const
Get the number of attributes.
TypeId GetParent() const
Get the parent of this TypeId.
static TypeId GetRegistered(uint16_t i)
Get a TypeId by index.
std::size_t GetSize() const
Get the size of this object.
TypeId::AttributeInformation GetAttribute(std::size_t i) const
Get Attribute information by index.
static bool LookupByNameFailSafe(std::string name, TypeId *tid)
Get a TypeId by name.
SupportLevel
The level of support or deprecation for attributes or trace sources.
std::string GetName() const
Get the name.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< Object > GetRootNamespaceObject(uint32_t i)
std::size_t GetRootNamespaceObjectN()
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
std::string functionStart
start of a method/function
std::string hrefStop
end of a link
std::string referenceNo
block automatic references
std::string anchor
Markup tokens.
std::string argument
function argument
std::string functionStop
end of a method/function
std::string headingStart
start of section heading (h3)
std::string headingStop
end of section heading (h3)
std::string copyDoc
copy (or refer) to docs elsewhere
std::string breakBoth
linebreak
std::string listLineStart
start unordered list item
std::map< std::string, ns3::TypeId::TraceSourceInformation > SortedTraceSourceInfo(const TypeId tid)
Alphabetize the TraceSourceInformation for a TypeId by the TraceSource name.
std::string templateArgument
template argument
std::string returns
the return value
std::string breakHtmlOnly
linebreak for html output only
std::string templArgExplicit
template argument required
std::string hrefStart
start of a link
std::string subSectionStart
start a new subsection
std::string hrefMid
middle part of a link
std::string commentStart
start of code comment
std::map< std::string, ns3::TypeId::AttributeInformation > SortedAttributeInfo(const TypeId tid)
Alphabetize the AttributeInformation for a TypeId by the Attribute name.
bool outputText
Are we generating text or Doxygen?
std::string page
start a separate page
std::string seeAlso
Reference to other docs.
std::string commentStop
end of code comment
std::string indentHtmlOnly
small indent
std::string codeWord
format next word as source code
std::string note
start a note section
std::string listLineStop
end unordered list item
std::string listStop
end unordered list
std::string classStop
end of a class
std::string breakTextOnly
linebreak for text output only
std::string brief
brief tag
std::string reference
reference tag
std::string flagSpanStop
end of Attribute flag value
std::string variable
variable or class member
std::string boldStart
start of bold span
std::string boldStop
end of bold span
std::string classStart
start of a class
std::string sectionStart
start of a section or group
std::string listStart
start unordered list
std::string flagSpanStart
start of Attribute flag value
std::string templArgDeduced
template argument deduced from function
Every class exported by the ns3 library is enclosed in the ns3 namespace.
U * PeekPointer(const Ptr< U > &p)
StaticInformation GetTypicalAggregations()
Register aggregation relationships that are not automatically detected by this introspection program.
void PrintTraceSourcesTid(std::ostream &os, const TypeId tid)
Print direct Trace sources for this TypeId.
std::set< TypeId > GroupList_t
List of TypeIds for a group.
std::map< std::string, int32_t > NameMap
Map from TypeId name to tid.
void PrintMakeAccessors(std::ostream &os, const std::string &name)
Print the AttributeValue MakeAccessor documentation for a class.
void PrintAllTraceSources(std::ostream &os)
Print the list of all Trace sources.
void PrintAllLogComponents(std::ostream &os)
Print the list of all LogComponents.
void PrintAttributeHelper(std::ostream &os, const AttributeDescriptor &attr)
Print documentation corresponding to use of the ATTRIBUTE_HELPER_HEADER macro or ATTRIBUTE_VALUE_DEFI...
void PrintTypeIdBlock(std::ostream &os, const TypeId tid)
Print the doxy block for a single TypeId.
void PrintTypeIdBlocks(std::ostream &os)
Print the doxy block for each TypeId.
std::map< std::string, GroupList_t > GroupsList_t
Collection of group names with associated TypeIds.
void PrintAllAttributes(std::ostream &os)
Print the list of all Attributes.
void PrintAttributeValueWithName(std::ostream &os, const std::string &name, const std::string &type, const std::string &header)
Print the AttributeValue documentation for a class.
GroupsList_t GetGroupsList()
Get a sorted list of TypeId groups.
void PrintSupportLevel(std::ostream &os, TypeId::SupportLevel supportLevel, std::string supportMsg)
Print the support level for an Attribute or TraceSource.
void PrintSize(std::ostream &os, const TypeId tid)
Print the size of the type represented by this tid.
void Uniquefy(T t)
Helper to keep only the unique items in a container.
void PrintAttributeImplementations(std::ostream &os)
Print documentation for Attribute implementations.
NameMap GetNameMap()
Create a map from the class names to their index in the vector of TypeId's so that the names will end...
void PrintTraceSources(std::ostream &os, const TypeId tid)
Print the Trace sources block for tid, including Trace sources declared in base classes.
void SetMarkup()
Initialize the markup strings, for either doxygen or text.
NameMap::const_iterator NameMapIterator
NameMap iterator.
void PrintConfigPaths(std::ostream &os, const TypeId tid)
Print config paths.
void PrintAllTypeIds(std::ostream &os)
Print the list of all TypeIds.
void PrintAttributes(std::ostream &os, const TypeId tid)
Print the Attributes block for tid, including Attributes declared in base classes.
void PrintAllGroups(std::ostream &os)
Print the list of all groups.
void PrintAllGlobals(std::ostream &os)
Print the list of all global variables.
void PrintMakeChecker(std::ostream &os, const std::string &name, const std::string &header)
Print the AttributeValue MakeChecker documentation for a class.
void PrintAttributeValueSection(std::ostream &os, const std::string &name, const bool seeBase=true)
Print the section definition for an AttributeValue.
void PrintAttributesTid(std::ostream &os, const TypeId tid)
Print direct Attributes for this TypeId.
Descriptor for an AttributeValue.
const std::string m_header
The header file name.
const std::string m_type
The name of the underlying type.
const std::string m_name
The base name of the resulting AttributeValue type.
const bool m_seeBase
Print a "see also" pointing to the base class.