AddressSet getObjectDiffs(Iterator<T> iter1, Iterator<T> iter2, TaskMonitor monitor)
				throws CancelledException {
			AddressSet addrs = new AddressSet();
			T o1 = null;
			T o2 = null;
			AddressSet a1 = new AddressSet();
			AddressSet a2 = new AddressSet();
			AddressSet a2CompatibleWith1 = DiffUtility.getCompatibleAddressSet(a2, program1);
			if (iter1.hasNext()) {
				o1 = iter1.next(); // Get first object in iterator1
				a1 = getAddressSet(o1, getProgramOne());
			}
			if (iter2.hasNext()) {
				o2 = iter2.next(); // Get first object in iterator2
				a2 = getAddressSet(o2, getProgramTwo());
				a2CompatibleWith1 = DiffUtility.getCompatibleAddressSet(a2, program1);
			}
//			int i=0;
			while ((o1 != null) && (o2 != null)) {
				boolean move1 = false;
				boolean move2 = false;
				int result = compare(o1, o2);
				if (result < 0) {
					// o1 < o2
					addrs.add(a1);
					move1 = true;
				}
				else if (result > 0) {
					// o1 > o2
					addrs.add(a2CompatibleWith1);
					move2 = true;
				}
				else {
					// o1 == o2
					// Now see if what we're interested about in each program's
					// object is different.
					if (!isSame(o1, o2)) {
						addrs.add(a1);
						addrs.add(a2CompatibleWith1);
					}
					move1 = true;
					move2 = true;
				}
//				if (++i == DISPLAY_GRANULARITY) {
				monitor.setMessage(
					monitorMsg + ": " + (move1 ? a1.getMinAddress().toString(showAddressSpace)
							: a2.getMinAddress().toString(showAddressSpace)));
//					i = 0;
//				}
				if (move1) {
					if (iter1.hasNext()) {
						o1 = iter1.next();
						a1 = getAddressSet(o1, getProgramOne());
					}
					else {
						o1 = null;
					}
				}
				if (move2) {
					if (iter2.hasNext()) {
						o2 = iter2.next();
						a2 = getAddressSet(o2, getProgramTwo());
						a2CompatibleWith1 = DiffUtility.getCompatibleAddressSet(a2, program1);
					}
					else {
						o2 = null;
					}
				}
				checkCancelled(monitor);
			}
			// Put remaining iterator1 addresses in the address set.
			if (o1 != null) {
				addrs.add(a1);
			}
			while (iter1.hasNext()) {
				o1 = iter1.next();
				a1 = getAddressSet(o1, getProgramOne());
				addrs.add(a1);
				checkCancelled(monitor);
//				if (++i == DISPLAY_GRANULARITY) {
				monitor.setMessage(
					monitorMsg + ": " + (a1.getMinAddress().toString(showAddressSpace)));
//					i = 0;
//				}
			}
			// Put remaining iterator2 addresses in the address set.
			if (o2 != null) {
				addrs.add(a2CompatibleWith1);
			}
			while (iter2.hasNext()) {
				checkCancelled(monitor);
				o2 = iter2.next();
				a2 = getAddressSet(o2, getProgramTwo());
				Address min = a2.getMinAddress();
				if (min != null) {
					a2CompatibleWith1 = DiffUtility.getCompatibleAddressSet(a2, program1);
					addrs.add(a2CompatibleWith1);
//					if (++i == DISPLAY_GRANULARITY) {
					monitor.setMessage(monitorMsg + ": " + (min.toString(showAddressSpace)));
//						i = 0;
//					}
				}
			}

			return addrs;
		}
Determines where the property of interest to the comparator is different
between program1 and program2. This is for use with object iterators as
opposed to determining differences using a code unit iterator.
(For example, object iterators are used for equates and functions.)
@param iter1 the program1 object iterator
@param iter2 the program2 object iterator
@param monitor the task monitor for indicating the progress of
determining differences. This monitor reports the progress to the user.
@return the addresses where the comparator determined the objects
of interest was different. null if canceled.
The addresses in this address set are derived from program1.
@throws CancelledException if the user canceled the Diff.
Ghidra/Features/Base/src/main/java/ghidra/program/util/ProgramDiff.java