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

#include "cmConfigure.h" // IWYU pragma: keep

#include <string>
#include <unordered_map>
#include <utility>
#include <vector>

#include "cmProperty.h"

/** \class cmPropertyMap
 * \brief String property map.
 */
class cmPropertyMap
{
public:
  // -- General

  //! Clear property list
  void Clear();

  // -- Properties

  //! Set the property value
  void SetProperty(const std::string& name, const char* value);

  //! Append to the property value
  void AppendProperty(const std::string& name, const std::string& value,
                      bool asString = false);

  //! Get the property value
  cmProp GetPropertyValue(const std::string& name) const;

  //! Remove the property @a name from the map
  void RemoveProperty(const std::string& name);

  // -- Lists

  //! Get a sorted list of property keys
  std::vector<std::string> GetKeys() const;

  //! Get a sorted by key list of property key,value pairs
  std::vector<std::pair<std::string, std::string>> GetList() const;

private:
  std::unordered_map<std::string, std::string> Map_;
};
