private bool ResourceMatch(ResourceRequirements resourceRequirements, string resourceString, int height) { Dictionary <IdentifierManager.RegexTypes, int> resources = GetResourceInArea(resourceString, height); foreach (IdentifierManager.RegexTypes resourceType in m_resStringInfo.GetResourceTypes()) { // there is no such resource if (!resources.ContainsKey(resourceType) && resourceRequirements.GetResourceRequirement(resourceType) > 0) { return(false); } // there are too less of them else if (resources[resourceType] < resourceRequirements.GetResourceRequirement(resourceType)) { return(false); } } // prepare bins Dictionary <IdentifierManager.RegexTypes, Dictionary <int, int> > bins = new Dictionary <IdentifierManager.RegexTypes, Dictionary <int, int> >(); foreach (IdentifierManager.RegexTypes resourceType in m_resStringInfo.GetResourceTypes()) { if (!bins.ContainsKey(resourceType)) { bins.Add(resourceType, new Dictionary <int, int>()); } bins[resourceType] = GetBins(resourceType, resourceString, height); } // every chain (except CLBs) has to fit into resources (first fit) foreach (IdentifierManager.RegexTypes resourceType in m_resStringInfo.GetResourceTypes().Where(rt => rt != IdentifierManager.RegexTypes.CLB)) { // copy! Dictionary <int, int> bin = new Dictionary <int, int>(bins[resourceType]); for (int i = 0; i < resourceRequirements.Chains[resourceType].Count; i++) { bool binFound = false; for (int b = 0; b < bin.Count; b++) { if (bin[b] - resourceRequirements.Chains[resourceType][i] >= 0) { bin[b] -= resourceRequirements.Chains[resourceType][i]; binFound = true; break; } } if (!binFound) { return(false); } } } return(true); }
private Fragmentation GetFragmentation(SelectionInfo selInfo, int height, ResourceRequirements resourceRequirements) { Dictionary <IdentifierManager.RegexTypes, int> resources = GetResourceInArea(selInfo.ResourceString, height); Fragmentation result = new Fragmentation(); foreach (IdentifierManager.RegexTypes resourceType in m_resStringInfo.GetResourceTypes()) { result.ResourceTypeFragmentation[resourceType] = resources[resourceType] - resourceRequirements.GetResourceRequirement(resourceType); } return(result); }