public void assignParameterStorage(PrototypePieces proto, DataTypeManager dtManager,
			ArrayList<ParameterPieces> res, boolean addAutoParams) {
		outputParams.assignMap(proto, dtManager, res, addAutoParams);
		inputParams.assignMap(proto, dtManager, res, addAutoParams);

		if (hasThis && addAutoParams && res.size() > 1) {
			int thisIndex = 1;
			if (res.get(1).hiddenReturnPtr && res.size() > 2) {
				if (inputParams.isThisBeforeRetPointer()) {
					// pointer has been bumped by auto-return-storage
					res.get(1).swapMarkup(res.get(2));	// must swap storage and position for slots 1 and 2
				}
				else {
					thisIndex = 2;
				}
			}
			res.get(thisIndex).isThisPointer = true;
		}
	}
Calculate input and output storage locations given a function prototype

The data-types of the function prototype are passed in. Based on this model, a
location is selected for each (input and output) parameter and passed back to the
caller.  The passed back storage locations are ordered with the output storage
as the first entry, followed by the input storage locations.  The model has the option
of inserting a hidden return value pointer in the input storage locations.

If the model cannot assign storage, the ParameterPieces will have a null Address.
@param proto is the function prototype parameter data-types
@param dtManager is the manager used to create indirect data-types
@param res will hold the storage addresses for each parameter
@param addAutoParams is true if auto parameters (like the this pointer) should be processed
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/PrototypeModel.java