private boolean isStructurePart(Structure full, Structure part, Set<Long> visitedDataTypes) {
		// Both structures should be equal in length
		if (full.getLength() != part.getLength()) {
			return false;
		}

		DataTypeComponent[] partComps = part.getDefinedComponents();

		// Find a match in the full structure's component list for each
		// component in the partial structure.
		// Use resolveConflict() == USE_EXISTING to test for equiv in addition to
		// isEquiv().
		// Ensure that two components in the partial struct don't map to the same
		// component in the full structure.

		for (DataTypeComponent partDTC : partComps) {
			DataType partDT = partDTC.getDataType();
			if (partDT.isZeroLength()) {
				// don't try to match zero length fields, so skip
				continue;
			}
			DataTypeComponent fullDTCAt = (partDTC.getDataType() instanceof BitFieldDataType)
					? getBitfieldByOffsets(full, partDTC)
					: getBestMatchingDTC(full, partDTC);
			if (fullDTCAt == null || fullDTCAt.getOffset() != partDTC.getOffset() ||
				!SystemUtilities.isEqual(fullDTCAt.getFieldName(), partDTC.getFieldName())) {
				return false;
			}
			if (!isMemberFieldPartiallyCompatible(fullDTCAt, partDTC, visitedDataTypes)) {
				return false;
			}
		}

		return true;
	}
Returns true if one union is a subset of another union.
<p>
Each component of the candidate partial union must be present in the 'full'
union and must be 'equiv'.
<p>
Order of components is ignored, except for unnamed components, which receive
a default name created using their ordinal position.

@param full             {@link Union} datatype that is expected to be a
                        superset of the next param.
@param part             {@link Union} datatype that is expected to be a
                        subset of the previous param.
@param visitedDataTypes identity map of datatypes to prevent loops.
@return true if part is a subset (or equal) to full.
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DWARFDataTypeConflictHandler.java