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

#include <utility>

void cmPropertyDefinitionMap::DefineProperty(const std::string& name,
                                             cmProperty::ScopeType scope,
                                             const char* ShortDescription,
                                             const char* FullDescription,
                                             bool chain)
{
  auto it = this->find(name);
  cmPropertyDefinition* prop;
  if (it == this->end()) {
    prop = &(*this)[name];
    prop->DefineProperty(name, scope, ShortDescription, FullDescription,
                         chain);
  }
}

bool cmPropertyDefinitionMap::IsPropertyDefined(const std::string& name) const
{
  return this->find(name) != this->end();
}

bool cmPropertyDefinitionMap::IsPropertyChained(const std::string& name) const
{
  auto it = this->find(name);
  if (it == this->end()) {
    return false;
  }

  return it->second.IsChained();
}
