/* 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 <atomic> #include <cstdint> #include <functional> #include <memory> #include <string> #include <utility> #include <vector> #include <cm3p/cppdap/types.h> // IWYU pragma: keep namespace cmDebugger { class cmDebuggerVariablesManager; } namespace dap { struct Variable; } namespace cmDebugger { struct cmDebuggerVariableEntry { cmDebuggerVariableEntry() : cmDebuggerVariableEntry("", "", "") { } cmDebuggerVariableEntry(std::string name, std::string value, std::string type) : Name(std::move(name)) , Value(std::move(value)) , Type(std::move(type)) { } cmDebuggerVariableEntry(std::string name, std::string value) : Name(std::move(name)) , Value(std::move(value)) , Type("string") { } cmDebuggerVariableEntry(std::string name, const char* value) : Name(std::move(name)) , Value(value == nullptr ? "" : value) , Type("string") { } cmDebuggerVariableEntry(std::string name, bool value) : Name(std::move(name)) , Value(value ? "TRUE" : "FALSE") , Type("bool") { } cmDebuggerVariableEntry(std::string name, int64_t value) : Name(std::move(name)) , Value(std::to_string(value)) , Type("int") { } cmDebuggerVariableEntry(std::string name, int value) : Name(std::move(name)) , Value(std::to_string(value)) , Type("int") { } std::string const Name; std::string const Value; std::string const Type; }; class cmDebuggerVariables { static std::atomic<int64_t> NextId; int64_t Id; std::string Name; std::string Value; std::function<std::vector<cmDebuggerVariableEntry>()> GetKeyValuesFunction; std::vector<std::shared_ptr<cmDebuggerVariables>> SubVariables; bool IgnoreEmptyStringEntries = false; bool EnableSorting = true; virtual dap::array<dap::Variable> HandleVariablesRequest(); friend class cmDebuggerVariablesManager; protected: const bool SupportsVariableType; std::shared_ptr<cmDebuggerVariablesManager> VariablesManager; void EnumerateSubVariablesIfAny( dap::array<dap::Variable>& toBeReturned) const; void ClearSubVariables(); public: cmDebuggerVariables( std::shared_ptr<cmDebuggerVariablesManager> variablesManager, std::string name, bool supportsVariableType); cmDebuggerVariables( std::shared_ptr<cmDebuggerVariablesManager> variablesManager, std::string name, bool supportsVariableType, std::function<std::vector<cmDebuggerVariableEntry>()> getKeyValuesFunc); inline int64_t GetId() const noexcept { return this->Id; } inline std::string GetName() const noexcept { return this->Name; } inline std::string GetValue() const noexcept { return this->Value; } inline void SetValue(std::string const& value) noexcept { this->Value = value; } void AddSubVariables(std::shared_ptr<cmDebuggerVariables> const& variables); inline void SetIgnoreEmptyStringEntries(bool value) noexcept { this->IgnoreEmptyStringEntries = value; } inline void SetEnableSorting(bool value) noexcept { this->EnableSorting = value; } virtual ~cmDebuggerVariables(); }; } // namespace cmDebugger