From c07f7dbc72463dba9da7f1772ed73d350a4db127 Mon Sep 17 00:00:00 2001 From: "M.X. Grey" Date: Thu, 7 Jan 2016 18:05:46 -0500 Subject: [PATCH] finished implementation and integration of SpecializedNodeManagers --- dart/common/NameManager.h | 2 +- dart/common/detail/NameManager.h | 7 -- dart/dynamics/Addon.h | 141 +++++++++++++++++++++++- dart/dynamics/BodyNode.h | 6 +- dart/dynamics/Skeleton.h | 5 +- dart/dynamics/SpecializedNodeManager.h | 11 +- dart/dynamics/detail/Addon.h | 138 ----------------------- dart/dynamics/detail/BasicNodeManager.h | 9 +- 8 files changed, 162 insertions(+), 157 deletions(-) diff --git a/dart/common/NameManager.h b/dart/common/NameManager.h index de7cea302c995..c2c12ae079b34 100644 --- a/dart/common/NameManager.h +++ b/dart/common/NameManager.h @@ -71,7 +71,7 @@ class NameManager const std::string& _defaultName = "default"); /// Destructor - virtual ~NameManager(); + virtual ~NameManager() = default; /// Set a new pattern for name generation. /// diff --git a/dart/common/detail/NameManager.h b/dart/common/detail/NameManager.h index 0a9e1a4e09a60..120f7d619f8ec 100644 --- a/dart/common/detail/NameManager.h +++ b/dart/common/detail/NameManager.h @@ -58,13 +58,6 @@ NameManager::NameManager(const std::string& _managerName, // Do nothing } -//============================================================================== -template -NameManager::~NameManager() -{ - // Do nothing -} - //============================================================================== template bool NameManager::setPattern(const std::string& _newPattern) diff --git a/dart/dynamics/Addon.h b/dart/dynamics/Addon.h index 51d215e4da495..4c4b84aa3950a 100644 --- a/dart/dynamics/Addon.h +++ b/dart/dynamics/Addon.h @@ -38,7 +38,7 @@ #define DART_DYNAMICS_ADDON_H_ #include "dart/common/Addon.h" -#include "dart/dynamics/Skeleton.h" +#include "dart/dynamics/SmartPointer.h" namespace dart { namespace dynamics { @@ -228,6 +228,145 @@ class AddonWithProtectedStateAndPropertiesInSkeleton : public common::Addon } // namespace dynamics } // namespace dart +//============================================================================== +#define DART_DYNAMICS_ADDON_PROPERTY_CONSTRUCTOR( ClassName, UpdatePropertiesMacro )\ + ClassName (const ClassName &) = delete;\ + inline ClassName (dart::common::AddonManager* mgr, const PropertiesData& properties)\ + : AddonWithProtectedPropertiesInSkeleton< Base, PropertiesData, ManagerType, UpdatePropertiesMacro, Optional>(mgr, properties) { } + +//============================================================================== +#define DART_DYNAMICS_JOINT_ADDON_CONSTRUCTOR( ClassName )\ + DART_DYNAMICS_ADDON_PROPERTY_CONSTRUCTOR( ClassName, &detail::JointPropertyUpdate ) + +//============================================================================== +#define DART_DYNAMICS_ADDON_STATE_PROPERTY_CONSTRUCTORS( ClassName, UpdateStateMacro, UpdatePropertiesMacro )\ + ClassName (const ClassName &) = delete;\ + inline ClassName (dart::common::AddonManager* mgr, const StateData& state = StateData(), const PropertiesData& properties = PropertiesData())\ + : AddonWithProtectedStateAndPropertiesInSkeleton< Base, StateData, PropertiesData, ManagerType, UpdateStateMacro, UpdatePropertiesMacro, Optional >(mgr, state, properties) { }\ + inline ClassName (dart::common::AddonManager* mgr, const PropertiesData& properties, const StateData state = StateData())\ + : AddonWithProtectedStateAndPropertiesInSkeleton< Base, StateData, PropertiesData, ManagerType, UpdateStateMacro, UpdatePropertiesMacro, Optional >(mgr, properties, state) { } + +//============================================================================== +#define DART_DYNAMICS_SET_ADDON_PROPERTY_CUSTOM( Type, Name, Update )\ + inline void set ## Name (const Type & value)\ + { mProperties.m ## Name = value; Update(this); incrementSkeletonVersion(); } + +//============================================================================== +#define DART_DYNAMICS_SET_ADDON_PROPERTY( Type, Name )\ + DART_DYNAMICS_SET_ADDON_PROPERTY_CUSTOM( Type, Name, UpdateProperties ) + +//============================================================================== +#define DART_DYNAMICS_GET_ADDON_PROPERTY( Type, Name )\ + inline const Type& get ## Name () const\ + { return mProperties.m ## Name; } + +//============================================================================== +#define DART_DYNAMICS_SET_GET_ADDON_PROPERTY( Type, Name )\ + DART_DYNAMICS_SET_ADDON_PROPERTY( Type, Name )\ + DART_DYNAMICS_GET_ADDON_PROPERTY( Type, Name ) + +//============================================================================== +#define DART_DYNAMICS_SET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, PluralName, Size, UpdatePrefix )\ + void set ## SingleName (size_t index, const SingleType & value)\ + {\ + if( index >= Size )\ + {\ + dterr << "[" #Class << "::set" #SingleName << "] Invalid index (" << index << "). "\ + << "The specified index must be less than " #Size << "!\n";\ + assert(false); return;\ + }\ + this->mProperties.m ## PluralName [index] = value;\ + UpdatePrefix :: UpdateProperties(this);\ + this->incrementSkeletonVersion();\ + }\ + void set ## PluralName (const VectorType & vec)\ + {\ + this->mProperties.m ## PluralName = vec;\ + UpdatePrefix :: UpdateProperties(this);\ + this->incrementSkeletonVersion();\ + } + +//============================================================================== +#define DART_DYNAMICS_GET_ADDON_PROPERTY_ARRAY(Class, SingleType, VectorType, SingleName, PluralName, Size)\ + inline const SingleType& get ## SingleName (size_t index) const\ + {\ + if(index >= Size)\ + {\ + dterr << "[" #Class << "::get" #SingleName << "] Invalid index (" << index << "). "\ + << "The specified index must be less than " #Size << "!\n";\ + assert(false); index = 0;\ + }\ + return this->mProperties.m ## PluralName [index];\ + }\ + inline const VectorType& get ## PluralName () const\ + {\ + return this->mProperties.m ## PluralName;\ + } + +//============================================================================== +#define DART_DYNAMICS_IRREGULAR_SET_GET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, PluralName, Size, UpdatePrefix )\ + DART_DYNAMICS_SET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, PluralName, Size, UpdatePrefix )\ + DART_DYNAMICS_GET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, PluralName, Size ) + +//============================================================================== +#define DART_DYNAMICS_SET_GET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, Size, UpdatePrefix )\ + DART_DYNAMICS_IRREGULAR_SET_GET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, SingleName ## s, Size, UpdatePrefix ) + +//============================================================================== +#define DART_DYNAMICS_IRREGULAR_SET_GET_MULTIDOF_ADDON( SingleType, VectorType, SingleName, PluralName )\ + DART_DYNAMICS_IRREGULAR_SET_GET_ADDON_PROPERTY_ARRAY( MultiDofJointAddon, SingleType, VectorType, SingleName, PluralName, DOF, MultiDofJoint::Addon ) + +//============================================================================== +#define DART_DYNAMICS_SET_GET_MULTIDOF_ADDON( SingleType, VectorType, SingleName )\ + DART_DYNAMICS_IRREGULAR_SET_GET_MULTIDOF_ADDON( SingleType, VectorType, SingleName, SingleName ## s ) + +//============================================================================== +#define DETAIL_DART_ADDON_PROPERTIES_UPDATE( AddonName, GetAddon )\ + AddonName :: UpdateProperties( GetAddon () );\ + GetAddon ()->incrementSkeletonVersion(); + +//============================================================================== +#define DETAIL_DART_ADDON_STATE_PROPERTIES_UPDATE( AddonName, GetAddon )\ + AddonName :: UpdateState( GetAddon () );\ + DETAIL_DART_ADDON_PROPERTIES_UPDATE( AddonName, GetAddon ); + +//============================================================================== +// Used for Addons that have Properties (but no State) inside of a Skeleton +#define DART_DYNAMICS_SKEL_PROPERTIES_ADDON_INLINE( AddonName )\ + DETAIL_DART_SPECIALIZED_ADDON_INLINE( AddonName,\ + DETAIL_DART_ADDON_PROPERTIES_UPDATE( AddonName, get ## AddonName ) ) + +//============================================================================== +// Used for Addons that have both State and Properties inside of a Skeleton +#define DART_DYNAMICS_SKEL_ADDON_INLINE( AddonName )\ + DETAIL_DART_SPECIALIZED_ADDON_INLINE( AddonName,\ + DETAIL_DART_ADDON_STATE_PROPERTIES_UPDATE( AddonName, get ## AddonName ) ) + +//============================================================================== +// Used for edge cases, such as nested template classes, that have Properties +// (but no State) inside of a Skeleton +#define DART_DYNAMICS_IRREGULAR_SKEL_PROPERTIES_ADDON_INLINE( TypeName, HomogenizedName )\ + DETAIL_DART_IRREGULAR_SPECIALIZED_ADDON_INLINE( TypeName, HomogenizedName,\ + DETAIL_DART_ADDON_PROPERTIES_UPDATE( TypeName, get ## HomogenizedName ) ) + +//============================================================================== +// Used for edge cases, such as nested template classes, that have both State +// and Properties inside of a Skeleton +#define DART_DYNAMICS_IRREGULAR_SKEL_ADDON_INLINE( TypeName, HomogenizedName )\ + DETAIL_DART_IRREGULAR_SPECIALIZED_ADDON_INLINE( TypeName, HomogenizedName,\ + DETAIL_DART_ADDON_STATE_PROPERTIES_UPDATE( TypeName, get ## HomogenizedName ) ) + +//============================================================================== +// Used for nested-class Addons that have Properties (but no State) inside of a Skeleton +#define DART_DYNAMICS_NESTED_SKEL_PROPERTIES_ADDON_INLINE( ParentName, AddonName )\ + DART_DYNAMICS_IRREGULAR_SKEL_PROPERTIES_ADDON_INLINE( ParentName :: AddonName, ParentName ## AddonName ) + +//============================================================================== +// Used for nested-class Addons that have both State and Properties inside of a Skeleton +#define DART_DYNAMICS_NESTED_SKEL_ADDON_INLINE( ParentName, AddonName )\ + DART_DYNAMICS_IRREGULAR_SKEL_ADDON_INLINE( ParentName :: AddonName, ParentName ## AddonName ) + +#include "dart/dynamics/Skeleton.h" #include "dart/dynamics/detail/Addon.h" #endif // DART_DYNAMICS_ADDON_H_ diff --git a/dart/dynamics/BodyNode.h b/dart/dynamics/BodyNode.h index 3e9dc5e952785..4afea264bf46d 100644 --- a/dart/dynamics/BodyNode.h +++ b/dart/dynamics/BodyNode.h @@ -84,7 +84,7 @@ class Marker; /// BodyNode of the BodyNode. class BodyNode : public virtual common::AddonManager, - public virtual detail::BasicNodeManagerForBodyNode, + public virtual SpecializedNodeManagerForBodyNode, public SkeletonRefCountingBase, public TemplatedJacobianNode { @@ -1236,7 +1236,7 @@ class BodyNode : } // namespace dart #include "dart/dynamics/Skeleton.h" -// Developer's Note: Skeleton.h needs to be included after the BodyNode class is -// defined in order for the header dependencies to work out correctly. +// These headers need to be included after the BodyNode class is defined in +// order for the header dependencies to work out correctly. #endif // DART_DYNAMICS_BODYNODE_H_ diff --git a/dart/dynamics/Skeleton.h b/dart/dynamics/Skeleton.h index 7d805e7b0c5ee..cdce46f80208e 100644 --- a/dart/dynamics/Skeleton.h +++ b/dart/dynamics/Skeleton.h @@ -58,7 +58,7 @@ namespace dynamics { /// class Skeleton class Skeleton : public virtual common::AddonManager, public MetaSkeleton, - public virtual detail::BasicNodeManagerForSkeleton + public virtual SpecializedNodeManagerForSkeleton { public: @@ -1313,6 +1313,9 @@ class Skeleton : public virtual common::AddonManager, } // namespace dynamics } // namespace dart +#include "dart/dynamics/EndEffector.h" +#include "dart/dynamics/detail/SpecializedNodeManager.h" + #include "dart/dynamics/detail/Skeleton.h" #include "dart/dynamics/detail/BodyNode.h" diff --git a/dart/dynamics/SpecializedNodeManager.h b/dart/dynamics/SpecializedNodeManager.h index 5d63596fd6549..f3d89913da64a 100644 --- a/dart/dynamics/SpecializedNodeManager.h +++ b/dart/dynamics/SpecializedNodeManager.h @@ -37,6 +37,7 @@ #ifndef DART_DYNAMICS_SPECIALIZEDNODEMANAGER_H_ #define DART_DYNAMICS_SPECIALIZEDNODEMANAGER_H_ +#include "dart/common/Virtual.h" #include "dart/dynamics/detail/BasicNodeManager.h" #include "dart/dynamics/NodeManagerJoiner.h" @@ -114,8 +115,8 @@ class SpecializedNodeManagerForBodyNode : template class SpecializedNodeManagerForBodyNode : public NodeManagerJoinerForBodyNode< - SpecializedNodeManagerForBodyNode, - SpecializedNodeManagerForBodyNode > { }; + common::Virtual< SpecializedNodeManagerForBodyNode >, + common::Virtual< SpecializedNodeManagerForBodyNode > > { }; //============================================================================== /// Declaration of the variadic template @@ -201,12 +202,12 @@ class SpecializedNodeManagerForSkeleton : template class SpecializedNodeManagerForSkeleton : public NodeManagerJoinerForSkeleton< - SpecializedNodeManagerForSkeleton, - SpecializedNodeManagerForSkeleton > { }; + common::Virtual< SpecializedNodeManagerForSkeleton >, + common::Virtual< SpecializedNodeManagerForSkeleton > > { }; } // namespace dynamics } // namespace dart -#include "dart/dynamics/detail/SpecializedNodeManager.h" +#include "dart/dynamics/BodyNode.h" #endif // DART_DYNAMICS_SPECIALIZEDNODEMANAGER_H_ diff --git a/dart/dynamics/detail/Addon.h b/dart/dynamics/detail/Addon.h index ef5977d93bfe1..9a965936353e1 100644 --- a/dart/dynamics/detail/Addon.h +++ b/dart/dynamics/detail/Addon.h @@ -461,142 +461,4 @@ setManager(common::AddonManager* newManager, bool /*transfer*/) } // namespace dynamics } // namespace dart -//============================================================================== -#define DART_DYNAMICS_ADDON_PROPERTY_CONSTRUCTOR( ClassName, UpdatePropertiesMacro )\ - ClassName (const ClassName &) = delete;\ - inline ClassName (dart::common::AddonManager* mgr, const PropertiesData& properties)\ - : AddonWithProtectedPropertiesInSkeleton< Base, PropertiesData, ManagerType, UpdatePropertiesMacro, Optional>(mgr, properties) { } - -//============================================================================== -#define DART_DYNAMICS_JOINT_ADDON_CONSTRUCTOR( ClassName )\ - DART_DYNAMICS_ADDON_PROPERTY_CONSTRUCTOR( ClassName, &detail::JointPropertyUpdate ) - -//============================================================================== -#define DART_DYNAMICS_ADDON_STATE_PROPERTY_CONSTRUCTORS( ClassName, UpdateStateMacro, UpdatePropertiesMacro )\ - ClassName (const ClassName &) = delete;\ - inline ClassName (dart::common::AddonManager* mgr, const StateData& state = StateData(), const PropertiesData& properties = PropertiesData())\ - : AddonWithProtectedStateAndPropertiesInSkeleton< Base, StateData, PropertiesData, ManagerType, UpdateStateMacro, UpdatePropertiesMacro, Optional >(mgr, state, properties) { }\ - inline ClassName (dart::common::AddonManager* mgr, const PropertiesData& properties, const StateData state = StateData())\ - : AddonWithProtectedStateAndPropertiesInSkeleton< Base, StateData, PropertiesData, ManagerType, UpdateStateMacro, UpdatePropertiesMacro, Optional >(mgr, properties, state) { } - -//============================================================================== -#define DART_DYNAMICS_SET_ADDON_PROPERTY_CUSTOM( Type, Name, Update )\ - inline void set ## Name (const Type & value)\ - { mProperties.m ## Name = value; Update(this); incrementSkeletonVersion(); } - -//============================================================================== -#define DART_DYNAMICS_SET_ADDON_PROPERTY( Type, Name )\ - DART_DYNAMICS_SET_ADDON_PROPERTY_CUSTOM( Type, Name, UpdateProperties ) - -//============================================================================== -#define DART_DYNAMICS_GET_ADDON_PROPERTY( Type, Name )\ - inline const Type& get ## Name () const\ - { return mProperties.m ## Name; } - -//============================================================================== -#define DART_DYNAMICS_SET_GET_ADDON_PROPERTY( Type, Name )\ - DART_DYNAMICS_SET_ADDON_PROPERTY( Type, Name )\ - DART_DYNAMICS_GET_ADDON_PROPERTY( Type, Name ) - -//============================================================================== -#define DART_DYNAMICS_SET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, PluralName, Size, UpdatePrefix )\ - void set ## SingleName (size_t index, const SingleType & value)\ - {\ - if( index >= Size )\ - {\ - dterr << "[" #Class << "::set" #SingleName << "] Invalid index (" << index << "). "\ - << "The specified index must be less than " #Size << "!\n";\ - assert(false); return;\ - }\ - this->mProperties.m ## PluralName [index] = value;\ - UpdatePrefix :: UpdateProperties(this);\ - this->incrementSkeletonVersion();\ - }\ - void set ## PluralName (const VectorType & vec)\ - {\ - this->mProperties.m ## PluralName = vec;\ - UpdatePrefix :: UpdateProperties(this);\ - this->incrementSkeletonVersion();\ - } - -//============================================================================== -#define DART_DYNAMICS_GET_ADDON_PROPERTY_ARRAY(Class, SingleType, VectorType, SingleName, PluralName, Size)\ - inline const SingleType& get ## SingleName (size_t index) const\ - {\ - if(index >= Size)\ - {\ - dterr << "[" #Class << "::get" #SingleName << "] Invalid index (" << index << "). "\ - << "The specified index must be less than " #Size << "!\n";\ - assert(false); index = 0;\ - }\ - return this->mProperties.m ## PluralName [index];\ - }\ - inline const VectorType& get ## PluralName () const\ - {\ - return this->mProperties.m ## PluralName;\ - } - -//============================================================================== -#define DART_DYNAMICS_IRREGULAR_SET_GET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, PluralName, Size, UpdatePrefix )\ - DART_DYNAMICS_SET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, PluralName, Size, UpdatePrefix )\ - DART_DYNAMICS_GET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, PluralName, Size ) - -//============================================================================== -#define DART_DYNAMICS_SET_GET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, Size, UpdatePrefix )\ - DART_DYNAMICS_IRREGULAR_SET_GET_ADDON_PROPERTY_ARRAY( Class, SingleType, VectorType, SingleName, SingleName ## s, Size, UpdatePrefix ) - -//============================================================================== -#define DART_DYNAMICS_IRREGULAR_SET_GET_MULTIDOF_ADDON( SingleType, VectorType, SingleName, PluralName )\ - DART_DYNAMICS_IRREGULAR_SET_GET_ADDON_PROPERTY_ARRAY( MultiDofJointAddon, SingleType, VectorType, SingleName, PluralName, DOF, MultiDofJoint::Addon ) - -//============================================================================== -#define DART_DYNAMICS_SET_GET_MULTIDOF_ADDON( SingleType, VectorType, SingleName )\ - DART_DYNAMICS_IRREGULAR_SET_GET_MULTIDOF_ADDON( SingleType, VectorType, SingleName, SingleName ## s ) - -//============================================================================== -#define DETAIL_DART_ADDON_PROPERTIES_UPDATE( AddonName, GetAddon )\ - AddonName :: UpdateProperties( GetAddon () );\ - GetAddon ()->incrementSkeletonVersion(); - -//============================================================================== -#define DETAIL_DART_ADDON_STATE_PROPERTIES_UPDATE( AddonName, GetAddon )\ - AddonName :: UpdateState( GetAddon () );\ - DETAIL_DART_ADDON_PROPERTIES_UPDATE( AddonName, GetAddon ); - -//============================================================================== -// Used for Addons that have Properties (but no State) inside of a Skeleton -#define DART_DYNAMICS_SKEL_PROPERTIES_ADDON_INLINE( AddonName )\ - DETAIL_DART_SPECIALIZED_ADDON_INLINE( AddonName,\ - DETAIL_DART_ADDON_PROPERTIES_UPDATE( AddonName, get ## AddonName ) ) - -//============================================================================== -// Used for Addons that have both State and Properties inside of a Skeleton -#define DART_DYNAMICS_SKEL_ADDON_INLINE( AddonName )\ - DETAIL_DART_SPECIALIZED_ADDON_INLINE( AddonName,\ - DETAIL_DART_ADDON_STATE_PROPERTIES_UPDATE( AddonName, get ## AddonName ) ) - -//============================================================================== -// Used for edge cases, such as nested template classes, that have Properties -// (but no State) inside of a Skeleton -#define DART_DYNAMICS_IRREGULAR_SKEL_PROPERTIES_ADDON_INLINE( TypeName, HomogenizedName )\ - DETAIL_DART_IRREGULAR_SPECIALIZED_ADDON_INLINE( TypeName, HomogenizedName,\ - DETAIL_DART_ADDON_PROPERTIES_UPDATE( TypeName, get ## HomogenizedName ) ) - -//============================================================================== -// Used for edge cases, such as nested template classes, that have both State -// and Properties inside of a Skeleton -#define DART_DYNAMICS_IRREGULAR_SKEL_ADDON_INLINE( TypeName, HomogenizedName )\ - DETAIL_DART_IRREGULAR_SPECIALIZED_ADDON_INLINE( TypeName, HomogenizedName,\ - DETAIL_DART_ADDON_STATE_PROPERTIES_UPDATE( TypeName, get ## HomogenizedName ) ) - -//============================================================================== -// Used for nested-class Addons that have Properties (but no State) inside of a Skeleton -#define DART_DYNAMICS_NESTED_SKEL_PROPERTIES_ADDON_INLINE( ParentName, AddonName )\ - DART_DYNAMICS_IRREGULAR_SKEL_PROPERTIES_ADDON_INLINE( ParentName :: AddonName, ParentName ## AddonName ) - -//============================================================================== -// Used for nested-class Addons that have both State and Properties inside of a Skeleton -#define DART_DYNAMICS_NESTED_SKEL_ADDON_INLINE( ParentName, AddonName )\ - DART_DYNAMICS_IRREGULAR_SKEL_ADDON_INLINE( ParentName :: AddonName, ParentName ## AddonName ) - #endif // DART_DYNAMICS_DETAIL_ADDON_H_ diff --git a/dart/dynamics/detail/BasicNodeManager.h b/dart/dynamics/detail/BasicNodeManager.h index 216df07b72eb4..70860d701596d 100644 --- a/dart/dynamics/detail/BasicNodeManager.h +++ b/dart/dynamics/detail/BasicNodeManager.h @@ -58,6 +58,13 @@ class BasicNodeManagerForBodyNode using NodeNameMgrMap = std::map< std::type_index, common::NameManager >; using SpecializedTreeNodes = std::map*>; + /// Default constructor + BasicNodeManagerForBodyNode() = default; + + /// Delete copy constructors and assignment operators + BasicNodeManagerForBodyNode(const BasicNodeManagerForBodyNode&) = delete; + BasicNodeManagerForBodyNode& operator=(const BasicNodeManagerForBodyNode&) = delete; + /// Get the number of Nodes corresponding to the specified type template size_t getNumNodes() const; @@ -86,7 +93,7 @@ class BasicNodeManagerForBodyNode }; -class BasicNodeManagerForSkeleton : public BasicNodeManagerForBodyNode +class BasicNodeManagerForSkeleton : public virtual BasicNodeManagerForBodyNode { public: