class OneSlotPerExecutionSlotAllocator extends AbstractExecutionSlotAllocator implements SlotOwner {

	@Override
	public List<SlotExecutionVertexAssignment> allocateSlotsFor(
			final List<ExecutionVertexSchedulingRequirements> executionVertexSchedulingRequirements) {

		validateSchedulingRequirements(executionVertexSchedulingRequirements);

		validateNoCoLocationConstraint(executionVertexSchedulingRequirements);

		// LinkedHashMap is needed to retain the given order
		final LinkedHashMap<SlotRequestId, SlotExecutionVertexAssignment> slotExecutionVertexAssignments =
			createSlotExecutionVertexAssignments(executionVertexSchedulingRequirements);

		final Map<ExecutionVertexID, SlotRequestId> executionVertexSlotRequestIds = slotExecutionVertexAssignments
			.entrySet()
			.stream()
			.collect(Collectors.toMap(e -> e.getValue().getExecutionVertexId(), Map.Entry::getKey));

		final List<CompletableFuture<PhysicalSlotRequest>> physicalSlotRequestFutures =
			createPhysicalSlotRequestFutures(
				executionVertexSchedulingRequirements,
				executionVertexSlotRequestIds);

		allocateSlotsForAssignments(
			physicalSlotRequestFutures,
			slotExecutionVertexAssignments);

		return Collections.unmodifiableList(new ArrayList<>(slotExecutionVertexAssignments.values()));
	}

	  OneSlotPerExecutionSlotAllocator(
			final BulkSlotProvider slotProvider,
			final PreferredLocationsRetriever preferredLocationsRetriever,
			final boolean slotWillBeOccupiedIndefinitely,
			final Time allocationTimeout);

}