#pragma once
#include <cstdint>
#include <string>
#include <vector>
#include <map>
#include <mdf/mdstring.h>
namespace mdf {
class MdVariable;
using MdVariableList = std::map<std::string, MdVariable>;
using MdArrayIndexList = std::vector<uint64_t>;
class MdVariable : public MdString {
public:
void Variable(std::string variable);
[[nodiscard]] const std::string& Variable() const;
void CnBlockName(std::string name);
[[nodiscard]] const std::string& CnBlockName() const;
void CnSourceName(std::string name);
[[nodiscard]] const std::string& CnSourceName() const;
void CnSourcePath(std::string path);
[[nodiscard]] const std::string& CnSourcePath() const;
void CgBlockName(std::string name);
[[nodiscard]] const std::string& CgBlockName() const;
void CgSourceName(std::string name);
[[nodiscard]] const std::string& CgSourceName() const;
void CgSourcePath(std::string path);
[[nodiscard]] const std::string& CgSourcePath() const;
void AddArrayIndex(uint64_t index);
[[nodiscard]] const MdArrayIndexList& ArrayIndexes() const;
[[nodiscard]] MdArrayIndexList& ArrayIndexes();
void Raw(bool raw);
[[nodiscard]] bool Raw() const;
void ToXml(IXmlNode& root_node, const std::string& tag_name) const override;
void FromXml(const IXmlNode& var_node) override;
private:
std::string cn_; std::string cs_; std::string cp_; std::string gn_; std::string gs_; std::string gp_;
std::vector<uint64_t> index_list_;
bool raw_ = false;
};
}