doc: align documentation and classes to match and remove warnings.

This commit is contained in:
Tommaso Pecorella
2024-02-16 22:34:42 -06:00
parent 24aad01e9c
commit 6fb9855af5
19 changed files with 226 additions and 151 deletions

View File

@@ -2232,7 +2232,7 @@ SEARCH_INCLUDES = YES
## Allow doxygen to find generated include files, such as ns3/core-config.h
INCLUDE_PATH = build
INCLUDE_PATH = build/include
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the

View File

@@ -248,10 +248,10 @@ REappend filter_blacklistRE "cairo-wideint"
# Functions with varying numbers of arguments
# Explicit template instantiation declaration
REappend filter_blacklistRE "MakeCallback< ObjectBase \\* >(ObjectBase \\*"
# REappend filter_blacklistRE "MakeCallback< ObjectBase \\* >(ObjectBase \\*"
# ATTRIBUTE_HELPER_CPP( and _HEADER(
REappend filter_blacklistRE "ATTRIBUTE_HELPER_\\(CPP\\|HEADER\\)"
# REappend filter_blacklistRE "ATTRIBUTE_HELPER_\\(CPP\\|HEADER\\)"
# Filter out regular expression for black list, -e, -t and -F
filter_outRE=""

View File

@@ -225,10 +225,18 @@ class AttributeChecker : public SimpleRefCount<AttributeChecker>
virtual bool Copy(const AttributeValue& source, AttributeValue& destination) const = 0;
};
/**
* \ingroup attributes
* \defgroup attribute_EmptyAttribute EmptyAttribute Attribute
* AttributeValue implementation for EmptyAttribute
*/
/**
* \brief A class for an empty attribute value.
*
* \ingroup attributes
* \ingroup attribute_EmptyAttribute
*
* \see AttributeValue
*/
class EmptyAttributeValue : public AttributeValue
{
@@ -262,6 +270,8 @@ class EmptyAttributeValue : public AttributeValue
/**
* \brief An accessor for EmptyAttributeValue
*
* \ingroup attribute_EmptyAttribute
*
* Does nothing, since every EmptyAttributeValue is the same.
*/
class EmptyAttributeAccessor : public AttributeAccessor
@@ -276,7 +286,7 @@ class EmptyAttributeAccessor : public AttributeAccessor
};
/**
* \ingroup attributes
* \ingroup attribute_EmptyAttribute
*
* \brief Create an empty AttributeAccessor.
*
@@ -291,6 +301,8 @@ MakeEmptyAttributeAccessor()
/**
* \brief A checker for EmptyAttributeValue
*
* \ingroup attribute_EmptyAttribute
*
* Does nothing, since every EmptyAttributeValue does not contain anything and
* is, of course, valid.
*/
@@ -308,7 +320,7 @@ class EmptyAttributeChecker : public AttributeChecker
};
/**
* \ingroup attributes
* \ingroup attribute_EmptyAttribute
*
* \brief Create an empty AttributeChecker.
*

View File

@@ -24,7 +24,7 @@
/**
* \file
* \ingroup attribute_Boolean
* ns3::BooleanValue attribute value implementaation.
* ns3::BooleanValue attribute value implementation.
*/
namespace ns3
@@ -38,7 +38,7 @@ BooleanValue::BooleanValue()
NS_LOG_FUNCTION(this);
}
BooleanValue::BooleanValue(bool value)
BooleanValue::BooleanValue(const bool& value)
: m_value(value)
{
NS_LOG_FUNCTION(this << value);

View File

@@ -37,12 +37,7 @@ class BooleanValue : public AttributeValue
{
public:
BooleanValue();
/**
* Construct from an explicit value.
*
* \param [in] value The boolean value to begin with.
*/
BooleanValue(bool value);
BooleanValue(const bool& value);
void Set(bool value);
bool Get() const;
template <typename T>

View File

@@ -38,8 +38,8 @@ CallbackValue::CallbackValue()
NS_LOG_FUNCTION(this);
}
CallbackValue::CallbackValue(const CallbackBase& base)
: m_value(base)
CallbackValue::CallbackValue(const CallbackBase& value)
: m_value(value)
{
}
@@ -49,11 +49,17 @@ CallbackValue::~CallbackValue()
}
void
CallbackValue::Set(CallbackBase base)
CallbackValue::Set(const CallbackBase& value)
{
NS_LOG_FUNCTION(&base);
NS_LOG_FUNCTION(&value);
m_value = value;
}
m_value = base;
CallbackBase
CallbackValue::Get()
{
NS_LOG_FUNCTION(this);
return m_value;
}
Ptr<AttributeValue>

View File

@@ -805,18 +805,12 @@ namespace ns3
class CallbackValue : public AttributeValue
{
public:
/** Constructor */
CallbackValue();
/**
* Copy constructor
* \param [in] base Callback to copy
*/
CallbackValue(const CallbackBase& base);
/** Destructor */
CallbackValue(const CallbackBase& value);
~CallbackValue() override;
/** \param [in] base The CallbackBase to use */
void Set(CallbackBase base);
/* Documented by print-introspected-doxygen.cc */
// Documented by print-introspected-doxygen.cc
void Set(const CallbackBase& value);
CallbackBase Get();
template <typename T>
bool GetAccessor(T& value) const;
/** \return A copy of this CallBack */

View File

@@ -62,12 +62,7 @@ class EnumValue : public AttributeValue
{
public:
EnumValue();
/**
* Construct from an explicit value.
*
* \param [in] value The value to begin with.
*/
EnumValue(T value);
EnumValue(const T& value);
void Set(T value);
T Get() const;
@@ -85,7 +80,7 @@ template <typename T>
EnumValue<T>::EnumValue() = default;
template <typename T>
EnumValue<T>::EnumValue(T value)
EnumValue<T>::EnumValue(const T& value)
: m_value(value)
{
}

View File

@@ -36,6 +36,13 @@
namespace ns3
{
// Explicit instantiation declaration
/**
* \ingroup callback
* Explicit instantiation for ObjectBase
* \return A wrapper Callback
* \sa ns3::MakeCallback
*/
template Callback<ObjectBase*> MakeCallback<ObjectBase*>(ObjectBase* (*)());
template Callback<ObjectBase*>::Callback();
template class CallbackImpl<ObjectBase*>;

View File

@@ -47,10 +47,19 @@ operator<<(std::ostream& os, const std::pair<A, B>& p)
return os;
}
// Doxygen for this class is auto-generated by
// utils/print-introspected-doxygen.h
/**
* \ingroup attributes
* \defgroup attribute_Pair Pair Attribute
* AttributeValue implementation for Pair
*/
/** Hold objects of type std::pair<A, B>. */
/**
* \ingroup attribute_Pair
* AttributeValue implementation for Pair.
* Hold objects of type std::pair<A, B>.
*
* \see AttributeValue
*/
template <class A, class B>
class PairValue : public AttributeValue
{
@@ -64,14 +73,18 @@ class PairValue : public AttributeValue
/** Type returned by Get or passed in Set. */
typedef typename std::pair<first_type, second_type> result_type;
PairValue();
PairValue()
: m_value(std::make_pair(Create<A>(), Create<B>())){};
/**
* Construct this PairValue from a std::pair
*
* \param [in] value Value with which to construct.
*/
PairValue(const result_type& value); // "import" constructor
PairValue(const result_type& value)
{
Set(value);
}; // "import" constructor
// Inherited
Ptr<AttributeValue> Copy() const override;
@@ -86,16 +99,30 @@ class PairValue : public AttributeValue
* \return stored value as std::pair<A, B>.
*/
result_type Get() const;
/* Documented by print-introspected-doxygen.cc */
/**
* Set the value.
* \param [in] value The value to adopt.
*/
void Set(const result_type& value);
/**
* Access the Pair value as type \p T.
* \tparam T \explicit The type to cast to.
* \param [out] value The Pair value, as type \p T.
* \returns true.
*/
template <typename T>
bool GetAccessor(T& value) const;
private:
value_type m_value;
value_type m_value; //!< The stored Pair instance.
};
/**
* \ingroup attribute_Pair
* AttributeChecker implementation for PairValue.
* \see AttributeChecker
*/
class PairChecker : public AttributeChecker
{
public:
@@ -120,6 +147,8 @@ class PairChecker : public AttributeChecker
};
/**
* \ingroup attribute_Pair
*
* Make a PairChecker from a PairValue.
*
* This function returns a Pointer to a non-const instance to
@@ -131,6 +160,8 @@ template <class A, class B>
Ptr<AttributeChecker> MakePairChecker(const PairValue<A, B>& value);
/**
* \ingroup attribute_Pair
*
* Make a PairChecker from abscissa and ordinate AttributeCheckers.
*
* This function returns a Pointer to a const instance since both
@@ -145,6 +176,8 @@ Ptr<const AttributeChecker> MakePairChecker(Ptr<const AttributeChecker> firstche
Ptr<const AttributeChecker> secondchecker);
/**
* \ingroup attribute_Pair
*
* Make a PairChecker without abscissa and ordinate AttributeCheckers.
*
* \return Pointer to PairChecker instance.
@@ -152,6 +185,16 @@ Ptr<const AttributeChecker> MakePairChecker(Ptr<const AttributeChecker> firstche
template <class A, class B>
Ptr<AttributeChecker> MakePairChecker();
/**
* \ingroup attribute_Pair
*
* Create an AttributeAccessor for std::pair<>.
* \tparam A \explicit The type of pair.first.
* \tparam B \explicit The type of pair.second.
* \tparam T1 \deduced The argument pair type.
* \param [in] a1 The std::pair to be accessed.
* \returns The AttributeAccessor.
*/
template <typename A, typename B, typename T1>
Ptr<const AttributeAccessor> MakePairAccessor(T1 a1);
@@ -171,6 +214,8 @@ namespace internal
{
/**
* \ingroup attribute_Pair
*
* Internal checker class templated to each AttributeChecker
* for each entry in the pair.
*/
@@ -272,18 +317,6 @@ MakePairChecker()
return MakeSimpleAttributeChecker<T, internal::PairChecker<A, B>>(pairName, underlyingType);
}
template <class A, class B>
PairValue<A, B>::PairValue()
: m_value(std::make_pair(Create<A>(), Create<B>()))
{
}
template <class A, class B>
PairValue<A, B>::PairValue(const typename PairValue<A, B>::result_type& value)
{
Set(value);
}
template <class A, class B>
Ptr<AttributeValue>
PairValue<A, B>::Copy() const
@@ -374,14 +407,6 @@ PairValue<A, B>::GetAccessor(T& value) const
return true;
}
/**
* Create an AttributeAccessor for std::pair<>.
* \tparam A \explicit The type of pair.first.
* \tparam B \explicit The type of pair.second.
* \tparam T1 \deduced The argument pair type.
* \param [in] a1 The std::pair to be accessed.
* \returns The AttributeAccessor.
*/
template <typename A, typename B, typename T1>
Ptr<const AttributeAccessor>
MakePairAccessor(T1 a1)

View File

@@ -40,7 +40,7 @@ PointerValue::PointerValue()
NS_LOG_FUNCTION(this);
}
PointerValue::PointerValue(Ptr<Object> object)
PointerValue::PointerValue(const Ptr<Object>& object)
: m_value(object)
{
NS_LOG_FUNCTION(object);

View File

@@ -31,8 +31,19 @@
namespace ns3
{
// Additional docs for class PointerValue:
/** Hold objects of type Ptr<T>. */
/**
* \ingroup attributes
* \defgroup attribute_Pointer Pointer Attribute
* AttributeValue implementation for Pointer.
* Hold objects of type Ptr<T>.
*/
/**
* \ingroup attribute_Pointer
* \class ns3::PointerValue "pointer.h"
* AttributeValue implementation for Pointer. Hold objects of type Ptr<T>.
* \see AttributeValue
*/
class PointerValue : public AttributeValue
{
public:
@@ -43,7 +54,7 @@ class PointerValue : public AttributeValue
*
* \param [in] object The object to begin with.
*/
PointerValue(Ptr<Object> object);
PointerValue(const Ptr<Object>& object);
/**
* Set the value from by reference an Object.
@@ -74,14 +85,26 @@ class PointerValue : public AttributeValue
template <typename T>
operator Ptr<T>() const;
// Documentation generated by print-introspected-doxygen.cc
/**
* Set the value.
* \param [in] value The value to adopt.
*/
template <typename T>
void Set(const Ptr<T>& value);
/** \tparam T \explicit The type to cast to. */
/**
* \returns The Pointer value.
* \tparam T \explicit The type to cast to.
*/
template <typename T>
Ptr<T> Get() const;
/**
* Access the Pointer value as type \p T.
* \tparam T \explicit The type to cast to.
* \param [out] value The Pointer value, as type \p T.
* \returns true.
*/
template <typename T>
bool GetAccessor(Ptr<T>& value) const;
@@ -90,9 +113,14 @@ class PointerValue : public AttributeValue
bool DeserializeFromString(std::string value, Ptr<const AttributeChecker> checker) override;
private:
Ptr<Object> m_value;
Ptr<Object> m_value; //!< The stored Pointer instance.
};
/**
* \ingroup attribute_Pointer
* AttributeChecker implementation for PointerValue.
* \see AttributeChecker
*/
class PointerChecker : public AttributeChecker
{
public:
@@ -104,6 +132,7 @@ class PointerChecker : public AttributeChecker
};
/**
* \ingroup attribute_Pointer
* Create a PointerChecker for a type.
* \tparam T \explicit The underlying type.
* \returns The PointerChecker.
@@ -123,7 +152,10 @@ namespace ns3
namespace internal
{
/** PointerChecker implementation. */
/**
* \ingroup attribute_Pointer
* PointerChecker implementation.
*/
template <typename T>
class PointerChecker : public ns3::PointerChecker
{
@@ -226,6 +258,23 @@ PointerValue::GetAccessor(Ptr<T>& v) const
ATTRIBUTE_ACCESSOR_DEFINE(Pointer);
// Documentation of the functions defined by the macro.
// not documented by print-introspected-doxygen because
// Pointer has custom functions.
/**
* \ingroup attribute_Pointer
* \fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakePointerAccessor (T1 a1)
* \copydoc ns3::MakeAccessorHelper(T1)
* \see AttributeAccessor
*/
/**
* \ingroup attribute_Pointer
* \fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakePointerAccessor (T1 a1, T2 a2)
* \copydoc ns3::MakeAccessorHelper(T1,T2)
* \see AttributeAccessor
*/
template <typename T>
Ptr<AttributeChecker>
MakePointerChecker()

View File

@@ -57,12 +57,21 @@ operator<<(std::ostream& os, const std::tuple<Args...>& t)
return os;
}
// Doxygen for this class is auto-generated by
// utils/print-introspected-doxygen.h
/**
* \ingroup attributes
* \defgroup attribute_Tuple Tuple Attribute
* AttributeValue implementation for Tuple
*/
/**
* \ingroup attribute_Tuple
*
* AttributeValue implementation for Tuple.
*
* Hold objects of type std::tuple<Args...>.
* \tparam Args \explicit The list of AttributeValues to be held by this TupleValue
*
* \see AttributeValue
*/
template <class... Args>
class TupleValue : public AttributeValue
@@ -96,6 +105,8 @@ class TupleValue : public AttributeValue
result_type Get() const;
/**
* Set the stored values.
*
* \param value The stored value
*/
void Set(const result_type& value);
@@ -110,6 +121,7 @@ class TupleValue : public AttributeValue
*
* \tparam T \deduced the type of the given variable (normally, the argument type
* of a set method or the type of a data member)
* \param [out] value The stored value
* \return true if the given variable was set
*/
template <typename T>
@@ -131,6 +143,8 @@ class TupleValue : public AttributeValue
};
/**
* \ingroup attribute_Tuple
*
* Create a TupleValue object. Enable to write code like this snippet:
*
* \code
@@ -149,6 +163,8 @@ template <class T1, class T2>
auto MakeTupleValue(T2 t);
/**
* \ingroup attribute_Tuple
*
* Checker for attribute values storing tuples.
*/
class TupleChecker : public AttributeChecker
@@ -163,6 +179,8 @@ class TupleChecker : public AttributeChecker
};
/**
* \ingroup attribute_Tuple
*
* Create a TupleChecker from AttributeCheckers associated with TupleValue elements.
*
* \tparam Args \explicit Attribute value types
@@ -174,6 +192,8 @@ template <class... Args, class... Ts>
Ptr<const AttributeChecker> MakeTupleChecker(Ts... checkers);
/**
* \ingroup attribute_Tuple
*
* Create an AttributeAccessor for a class data member of type tuple,
* or a lone class get functor or set method.
*
@@ -188,6 +208,8 @@ template <class... Args, class T1>
Ptr<const AttributeAccessor> MakeTupleAccessor(T1 a1);
/**
* \ingroup attribute_Tuple
*
* Create an AttributeAccessor using a pair of get functor
* and set methods from a class.
*
@@ -343,6 +365,8 @@ namespace internal
{
/**
* \ingroup attribute_Tuple
*
* Internal checker class templated to each AttributeChecker
* for each entry in the tuple.
*/
@@ -418,6 +442,8 @@ class TupleChecker : public ns3::TupleChecker
};
/**
* \ingroup attribute_Tuple
*
* Helper class defining static methods for MakeTupleChecker and MakeTupleAccessor
* that are called when user specifies the list of AttributeValue types included
* in a TupleValue type.
@@ -454,6 +480,8 @@ struct TupleHelper
};
/**
* \ingroup attribute_Tuple
*
* Helper class defining static methods for MakeTupleValue, MakeTupleChecker and
* MakeTupleAccessor that are called when user provides a std::tuple of the
* AttributeValue types included in a TupleValue type.

View File

@@ -27,7 +27,7 @@
/**
* \file
* \ingroup attribute_Vector
* \ingroup geometry
* ns3::Vector, ns3::Vector2D and ns3::Vector3D attribute value implementations.
*/

View File

@@ -318,47 +318,53 @@ ATTRIBUTE_HELPER_HEADER(Vector3D);
ATTRIBUTE_HELPER_HEADER(Vector2D);
/**
* \ingroup attribute_Vector3D
* \relates Vector3D
* Vector alias typedef for compatibility with mobility models
*/
typedef Vector3D Vector;
/**
* \ingroup attribute_Vector3D
* \relates Vector3D
* Vector alias typedef for compatibility with mobility models
*/
typedef Vector3DValue VectorValue;
/**
* \ingroup attribute_Vector3D
* \relates Vector3D
* Vector alias typedef for compatibility with mobility models
*/
typedef Vector3DChecker VectorChecker;
// Document these by hand so they go in group attribute_Vector3D
/**
* \relates Vector3D
* \fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakeVectorAccessor (T1 a1)
* \copydoc ns3::MakeAccessorHelper(T1)
* \see AttributeAccessor
*/
/**
* \relates Vector3D
* \fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakeVectorAccessor (T1 a1, T2 a2)
* \copydoc ns3::MakeAccessorHelper(T1,T2)
* \see AttributeAccessor
*/
ATTRIBUTE_ACCESSOR_DEFINE(Vector);
/**
* \relates Vector3D
* \returns The AttributeChecker.
* \see AttributeChecker
*/
Ptr<const AttributeChecker> MakeVectorChecker();
} // namespace ns3
// Document these by hand so they go in group attribute_Vector3D
/*!
\ingroup attribute_Vector3D
\fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakeVectorAccessor (T1 a1)
\copydoc ns3::MakeAccessorHelper(T1)
\see AttributeAccessor
*/
/*!
\ingroup attribute_Vector3D
\fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakeVectorAccessor (T1 a1, T2 a2)
\copydoc ns3::MakeAccessorHelper(T1,T2)
\see AttributeAccessor
*/
/*!
\ingroup attribute_Vector3D
\fn ns3::Ptr<const ns3::AttributeChecker> ns3::MakeVectorChecker ()
\returns The AttributeChecker.
\see AttributeChecker
*/
#endif /* NS3_VECTOR_H */

View File

@@ -41,7 +41,10 @@ namespace ns3
NS_LOG_COMPONENT_DEFINE("FdReader");
// conditional compilation to avoid Doxygen errors
#ifdef __WIN32__
bool FdReader::winsock_initialized = false;
#endif
FdReader::FdReader()
: m_fd(-1),

View File

@@ -32,7 +32,6 @@ namespace dot11s
/**
* \brief a IEEE 802.11 Mesh ID element (Section 8.4.2.101 of IEEE 802.11-2012)
* \see attribute_IeMeshId
*/
class IeMeshId : public WifiInformationElement
{

View File

@@ -325,9 +325,9 @@ class MgtHeaderInPerStaProfile<Derived, std::tuple<Elems...>>
to the Per-STA Profile subelement */
};
/**
* Implementation of the templates declared above.
*/
//
// Implementation of the templates declared above.
//
template <typename Derived, typename... Elems>
template <typename T, std::enable_if_t<(std::is_same_v<std::vector<T>, Elems> + ...) == 0, int>>

View File

@@ -1227,15 +1227,7 @@ PrintAttributeValueSection(std::ostream& os, const std::string& name, const bool
<< "AttributeValue implementation for " << name << "\n";
if (seeBase)
{
// Some classes don't live in ns3::. Yuck
if (name != "IeMeshId")
{
os << seeAlso << "ns3::" << name << "\n";
}
else
{
os << seeAlso << "ns3::dot11s::" << name << "\n";
}
os << seeAlso << "ns3::" << name << "\n";
}
os << commentStop;
@@ -1271,20 +1263,12 @@ PrintAttributeValueWithName(std::ostream& os,
os << seeAlso << "AttributeValue" << std::endl;
os << commentStop;
// Copy ctor: <name>Value::<name>Value
os << commentStart << functionStart << name << qualClass << "::" << valClass;
if ((name == "EmptyAttribute") || (name == "ObjectPtrContainer"))
{
// Just default constructors.
os << "()\n";
}
else
{
// Copy constructors
os << "(const " << type << " & value)\n"
<< "Copy constructor.\n"
<< argument << "[in] value The " << name << " value to copy.\n";
}
// Ctor: <name>Value::<name>Value
os << commentStart << functionStart << qualClass << "::" << valClass;
// Constructors
os << "(const " << type << " & value)\n"
<< "Constructor.\n"
<< argument << "[in] value The " << name << " value to use.\n";
os << commentStop;
// <name>Value::Get () const
@@ -1430,7 +1414,6 @@ PrintAttributeImplementations(std::ostream& os)
{ "Box", "Box", true, "box.h" },
{ "DataRate", "DataRate", true, "data-rate.h" },
{ "Length", "Length", true, "length.h" },
{ "IeMeshId", "IeMeshId", true, "ie-dot11s-id.h" },
{ "Ipv4Address", "Ipv4Address", true, "ipv4-address.h" },
{ "Ipv4Mask", "Ipv4Mask", true, "ipv4-address.h" },
{ "Ipv6Address", "Ipv6Address", true, "ipv6-address.h" },
@@ -1446,7 +1429,6 @@ PrintAttributeImplementations(std::ostream& os)
{ "TypeId", "TypeId", true, "type-id.h" },
{ "UanModesList", "UanModesList", true, "uan-tx-mode.h" },
{ "ValueClassTest", "ValueClassTest", false, "attribute-test-suite.cc" /* core/test/ */ },
{ "Vector", "Vector", true, "vector.h" },
{ "Vector2D", "Vector2D", true, "vector.h" },
{ "Vector3D", "Vector3D", true, "vector.h" },
{ "Waypoint", "Waypoint", true, "waypoint.h" },
@@ -1454,11 +1436,10 @@ PrintAttributeImplementations(std::ostream& os)
// All three (Value, Access and Checkers) defined, but custom
{ "Boolean", "bool", false, "boolean.h" },
{ "Callback", "Callback", true, "callback.h" },
{ "Callback", "CallbackBase", true, "callback.h" },
{ "Double", "double", false, "double.h" },
{ "Enum", "int", false, "enum.h" },
{ "Enum", "T", false, "enum.h" },
{ "Integer", "int64_t", false, "integer.h" },
{ "Pointer", "Pointer", false, "pointer.h" },
{ "String", "std::string", false, "string.h" },
{ "Time", "Time", true, "nstime.h" },
{ "Uinteger", "uint64_t", false, "uinteger.h" },
@@ -1473,18 +1454,6 @@ PrintAttributeImplementations(std::ostream& os)
++i;
}
// Special cases
PrintAttributeValueSection(os, "EmptyAttribute", false);
PrintAttributeValueWithName(os, "EmptyAttribute", "EmptyAttribute", "attribute.h");
// ObjectPtrContainer is already documented.
// PrintAttributeValueSection(os, "ObjectPtrContainer", false);
// PrintAttributeValueWithName(os,
// "ObjectPtrContainer",
// "ObjectPtrContainer",
// "object-ptr-container.h");
// PrintMakeChecker(os, "ObjectPtrContainer", "object-ptr-container.h");
PrintAttributeValueSection(os, "ObjectVector", false);
PrintMakeAccessors(os, "ObjectVector");
PrintMakeChecker(os, "ObjectVector", "object-vector.h");
@@ -1493,19 +1462,6 @@ PrintAttributeImplementations(std::ostream& os)
PrintMakeAccessors(os, "ObjectMap");
PrintMakeChecker(os, "ObjectMap", "object-map.h");
PrintAttributeValueSection(os, "Pair", false);
PrintAttributeValueWithName(os, "Pair", "std::pair<A, B>", "pair.h");
PrintMakeChecker(os, "Pair", "pair.h");
PrintAttributeValueSection(os, "Tuple", false);
PrintAttributeValueWithName(os, "Tuple", "std::tuple<Args...>", "tuple.h");
PrintMakeChecker(os, "Tuple", "tuple.h");
// AttributeContainer is already documented.
// PrintAttributeValueSection (os, "AttributeContainer", false);
// PrintAttributeValueWithName (os, "AttributeContainer", "AttributeContainer",
// "attribute-container.h");
// PrintMakeChecker(os, "AttributeContainer", "attribute-container.h");
} // PrintAttributeImplementations ()
/***************************************************************