#pragma once #include "util.h" #include "locator.h" //#include "argtype.h" #include "argument_set.h" namespace klammerstate { inline std::string no_value = "\0"; } class Var { public: Var() = default; Var(std::string name, std::string value=klammerstate::no_value, std::string delim=":", std::string desc="", Locator loc=Locator(), Argtype argtype=Argtype()) : m_name(name) , m_value(value) , m_delim(delim) , m_desc(desc) , m_loc(loc) , m_argtype(argtype) {}; bool defined(); std::string m_name {}; std::string m_value {}; std::string m_delim {}; std::string m_desc {}; Locator m_loc {}; Argtype m_argtype {}; }; namespace klammerstate { inline std::string shell_environment_name = "Shell environment"; } class Frame { public: Frame(std::string name) : m_name(name) {}; std::vector names() const; void set(std::string name, std::string value, std::string delim=":", std::string desc="", Locator loc=Locator(), Argtype argtype=Argtype()); std::pair get(std::string name); std::string m_name {}; std::map m_vars {}; }; class State { public: static int class_id; void open_frame(std::string name); void close_frame(); void set(std::string name, std::string value, bool update=false, std::string delim=" ", std::string desc="", Locator loc=Locator(), Argtype argtype=Argtype()); void set(std::map varmap); void set(const std::map& varmap, const Parameter_set& parameters); void replace(std::string name, std::string value, bool error_if_not_defined=true); void add_environment_frame(); Var get(std::string name, bool error_if_not_defined=false, Locator loc=Locator()); std::string value(std::string name, bool error_if_not_defined=true, Locator loc=Locator()); std::string subst(std::string text, bool quote_values=false); void subst(std::vector::iterator begin, std::vector::iterator end); void parse_state_katoms(std::vector::iterator begin, std::vector::iterator end, katom_list katoms); std::vector all_names(); void add_search_dir(const std::string& dir); std::string python_code(); std::string describe(bool show_environment=false, int margin_size=2) const; std::vector m_frames {}; // Directories of the files the Machine has read (input files, klammer // sets, @read targets), in reading order: @eval finds Python modules // and :cpp libraries next to the file that uses them (see python_code() // and Eval::eval_command). std::vector m_search_dirs {}; // @@@state Image_search_path :set :append :replace :argtype :desc // Parameter_set m_parameters = Parameter_set("name :set :append :replace :argtype :delim :desc"); Parameter_set m_parameters = Parameter_set("name :value :append :replace :delim :desc"); };