@@ -445,6 +445,63 @@ bool DemangledTypeNode::HasTemplateArguments() const
445445}
446446
447447
448+ bool DemangledTypeNode::IsStructurallyEqual (const DemangledTypeNode& other) const
449+ {
450+ if (m_typeClass != other.m_typeClass || m_ntrClass != other.m_ntrClass ||
451+ m_pointerReference != other.m_pointerReference || m_nameType != other.m_nameType ||
452+ m_callingConventionName != other.m_callingConventionName ||
453+ m_pointerSuffixBits != other.m_pointerSuffixBits ||
454+ m_returnTypeConfidence != other.m_returnTypeConfidence ||
455+ m_const != other.m_const || m_volatile != other.m_volatile ||
456+ m_signed != other.m_signed || m_hasVariableArgs != other.m_hasVariableArgs ||
457+ m_hasTemplateArgs != other.m_hasTemplateArgs || m_width != other.m_width ||
458+ m_widthKind != other.m_widthKind || m_altName != other.m_altName ||
459+ m_spaceAfterTemplateComma != other.m_spaceAfterTemplateComma ||
460+ m_memberPointerOwnerName != other.m_memberPointerOwnerName ||
461+ m_isMemberPointer != other.m_isMemberPointer || m_elements != other.m_elements ||
462+ m_nameSegments != other.m_nameSegments )
463+ return false ;
464+
465+ auto nodesEqual = [](const vector<DemangledTypeNode>& a, const vector<DemangledTypeNode>& b) {
466+ if (a.size () != b.size ())
467+ return false ;
468+ for (size_t i = 0 ; i < a.size (); i++)
469+ {
470+ if (!a[i].IsStructurallyEqual (b[i]))
471+ return false ;
472+ }
473+ return true ;
474+ };
475+
476+ if (!nodesEqual (m_nameSegmentNodes, other.m_nameSegmentNodes ) ||
477+ !nodesEqual (m_memberPointerOwnerNameNodes, other.m_memberPointerOwnerNameNodes ))
478+ return false ;
479+
480+ auto typePtrsEqual = [](const std::shared_ptr<DemangledTypeNode>& a, const std::shared_ptr<DemangledTypeNode>& b) {
481+ if (!a || !b)
482+ return a == b;
483+ return a->IsStructurallyEqual (*b);
484+ };
485+
486+ if (!typePtrsEqual (m_childType, other.m_childType ) ||
487+ !typePtrsEqual (m_implicitThisParameterType, other.m_implicitThisParameterType ))
488+ return false ;
489+
490+ auto paramsEqual = [&typePtrsEqual](const vector<Param>& a, const vector<Param>& b) {
491+ if (a.size () != b.size ())
492+ return false ;
493+ for (size_t i = 0 ; i < a.size (); i++)
494+ {
495+ if (a[i].name != b[i].name || !typePtrsEqual (a[i].type , b[i].type ))
496+ return false ;
497+ }
498+ return true ;
499+ };
500+
501+ return paramsEqual (m_templateArgs, other.m_templateArgs ) && paramsEqual (m_params, other.m_params );
502+ }
503+
504+
448505void DemangledTypeNode::SetTemplateArguments (vector<Param> args, bool spaceAfterComma)
449506{
450507 m_templateArgs = std::move (args);
0 commit comments