protected AddressRangeIterator doGetAddressRanges(RecAddress start, RecAddress end,
			boolean forward) {
		Iterator<Entry<ValueShape, DBTraceObjectValueData>> mapIt = map
				.reduce(TraceObjectValueQuery
						.intersecting(EntryKeyDimension.INSTANCE.absoluteMin(),
							EntryKeyDimension.INSTANCE.absoluteMax(), Lifespan.ALL, start, end)
						.starting(forward ? AddressDimension.FORWARD : AddressDimension.BACKWARD))
				.orderedEntries()
				.iterator();
		Iterator<Entry<ValueShape, DBTraceObjectValueData>> fltIt =
			IteratorUtils.filteredIterator(mapIt, e -> predicate.test(e.getValue()));
		Iterator<AddressRange> rawIt =
			IteratorUtils.transformedIterator(fltIt, e -> e.getKey().getRange(factory));
		return new UnionAddressRangeIterator(rawIt, forward);
	}
An address set view that unions all addresses where an entry satisfying the given predicate
exists.

<p>
The caller may reduce the map given to this view. Reduction is preferable to using a
predicate, where possible, because reduction benefits from the index.

@param factory the trace's address factory
@param lock the lock on the database
@param map the map
@param predicate a predicate to further filter entries
Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueMapAddressSetView.java