@Override
	protected DataTypeComponent[] getAllComponents(MemBuffer buf) {
		Memory memory = buf.getMemory();
		Address start = buf.getAddress();

		// Find index
		long index = getIndex(memory, start.add(indexOffset)) & mask;
		Integer structIndex = null;
		if (keys.length == 1) {
			structIndex = (index == keys[0]) ? Integer.valueOf(0) : Integer.valueOf(1);
		}
		else {
			structIndex = table.get(Long.valueOf(index));
		}

		if (structIndex == null) {
			Msg.error(this, "ERROR in " + name + " at " + start);
			return null;
		}
		DataType data = structs[structIndex.intValue()];

		if (data == null) {
			Msg.error(this, "ERROR in " + name + " at " + start);
			return null;
		}
		DataTypeComponent[] comps = null;
		if (data.getDescription().equalsIgnoreCase(NULL_BODY_DESCRIPTION)) {
			comps = new DataTypeComponent[1];
		}
		else {
			comps = new DataTypeComponent[2];
		}
		MemoryBufferImpl newBuf = new MemoryBufferImpl(memory, buf.getAddress());
		DataTypeInstance dti = DataTypeInstance.getDataTypeInstance(header, newBuf, false);
		if (dti == null) {
			Msg.error(this, "ERROR: problem with data at " + newBuf.getAddress());
			return null;
		}
		int len = dti.getLength();
		comps[0] =
			new ReadOnlyDataTypeComponent(header, this, len, 0, 0, dti.getDataType().getName(), "");
		if (comps.length > 1) {
			try {
				int countSize = len;
				int offset = countSize;
				newBuf = new MemoryBufferImpl(memory, buf.getAddress());
				newBuf.advance(countSize);
				dti = DataTypeInstance.getDataTypeInstance(data, newBuf, false);
				if (dti == null) {
					Msg.error(this, "ERROR: problem with data at " + newBuf.getAddress());
					return null;
				}
				len = dti.getLength();
				comps[1] =
					new ReadOnlyDataTypeComponent(dti.getDataType(), this, len, 1, offset,
						dti.getDataType().getName() + "_" + newBuf.getAddress(), "");
				//name = dti.getDataType().getName();
			}
			catch (AddressOverflowException e) {
				Msg.error(this, "ERROR: problem with data at " + newBuf.getAddress());
				return null;
			}
		}
		return comps;
	}
@see ghidra.program.model.data.DynamicDataType#getAllComponents(ghidra.program.model.mem.MemBuffer)
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/IndexedDynamicDataType.java