/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#include "cmVisualStudioSlnData.h"

const cmSlnProjectEntry*
cmSlnData::GetProjectByGUID(const std::string& projectGUID) const
{
    ProjectStorage::const_iterator it(ProjectsByGUID.find(projectGUID));
    if(it != ProjectsByGUID.end())
        return &it->second;
    else
        return NULL;
}

const cmSlnProjectEntry*
cmSlnData::GetProjectByName(const std::string& projectName) const
{
    ProjectStringIndex::const_iterator it(ProjectNameIndex.find(projectName));
    if(it != ProjectNameIndex.end())
        return &it->second->second;
    else
        return NULL;
}

std::vector<cmSlnProjectEntry>
cmSlnData::GetProjects() const
{
    ProjectStringIndex::const_iterator it(this->ProjectNameIndex.begin()),
        itEnd(this->ProjectNameIndex.end());
    std::vector<cmSlnProjectEntry> result;
    for(; it != itEnd; ++it) result.push_back(it->second->second);
    return result;
}

cmSlnProjectEntry*
cmSlnData::AddProject(const std::string& projectGUID,
                      const std::string& projectName,
                      const std::string& projectRelativePath)
{
    ProjectStorage::iterator it(ProjectsByGUID.find(projectGUID));
    if(it != ProjectsByGUID.end())
        return NULL;
    it = ProjectsByGUID
             .insert(ProjectStorage::value_type(
                 projectGUID, cmSlnProjectEntry(projectGUID, projectName,
                                                projectRelativePath)))
             .first;
    ProjectNameIndex[projectName] = it;
    return &it->second;
}
