private void compare(DataType preDT, DataType postDT) {
		if (visitedTypes.containsKey(preDT)) {
			return;
		}
		visitedTypes.put(preDT, preDT);
		if (!observer.observe(preDT, postDT)) {
			return;
		}

		if (preDT instanceof Pointer && postDT instanceof Pointer) {
			compare((Pointer) preDT, (Pointer) postDT);
		}
		else if (preDT instanceof Array && postDT instanceof Array) {
			compare((Array) preDT, (Array) postDT);
		}
		else if (preDT instanceof Enum && postDT instanceof Enum) {
			compare((Enum) preDT, (Enum) postDT);
		}
		else if (preDT instanceof TypeDef && postDT instanceof TypeDef) {
			compare((TypeDef) preDT, (TypeDef) postDT);
		}
		else if (preDT instanceof FunctionDefinition && postDT instanceof FunctionDefinition) {
			compare((FunctionDefinition) preDT, (FunctionDefinition) postDT);
		}
		else if (preDT instanceof Structure && postDT instanceof Structure) {
			compare((Structure) preDT, (Structure) postDT);
		}
		else if (preDT instanceof Union && postDT instanceof Union) {
			compare((Union) preDT, (Union) postDT);
		}
	}
Object instance identity map used to prevent recursive loops when following
DataType pointers and such.  DataType path/name mapping can't be used because
there is no guarantee that impl DataType's have unique names.
<p>
Using a Map as a Set because there is no IdentityHashSet. (the value of the map entry
is not used, just the key set)
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DataTypeGraphComparator.java