Пример #1
0
        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);
        }
Пример #2
0
        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);
        }