vector InstanceSelector::Select()

in src/vswhere.lib/InstanceSelector.cpp [98:166]


vector<ISetupInstancePtr> InstanceSelector::Select(_In_opt_ IEnumSetupInstances* pEnum) const
{
    vector<ISetupInstancePtr> instances;
    if (pEnum)
    {
        HRESULT hr = S_OK;
        unsigned long celtFetched = 0;
        ISetupInstance* pInstances[1] = {};

        do
        {
            celtFetched = 0;

            hr = pEnum->Next(1, pInstances, &celtFetched);
            if (SUCCEEDED(hr) && celtFetched)
            {
                ISetupInstancePtr instance(pInstances[0], false);
                if (IsMatch(instance))
                {
                    instances.push_back(instance);
                }
            }
        } while (SUCCEEDED(hr) && celtFetched);
    }

    if (m_args.get_Legacy() && m_provider.HasLegacyInstances())
    {
        vector<LPCWSTR> versions =
        {
            L"14.0",
            L"12.0",
            L"11.0",
            L"10.0",
        };

        for (const auto version : versions)
        {
            ISetupInstancePtr instance;

            // Currently only support version checks.
            if (m_provider.TryGetLegacyInstance(version, &instance) && IsVersionMatch(instance))
            {
                instances.push_back(instance);
            }
        }
    }

    if (1 < instances.size())
    {
        if (m_args.get_Latest() || m_args.get_Sort())
        {
            sort(instances.begin(), instances.end(), [&](const ISetupInstancePtr& a, const ISetupInstancePtr& b) -> bool
            {
                // Reverse the sort with addition of -sort using existing algorithm.
                return !Less(a, b);
            });

            if (m_args.get_Latest())
            {
                return vector<ISetupInstancePtr>
                {
                    instances.front(),
                };
            }
        }
    }

    return instances;
}