← index
cplusplus2x.Examples/C++20/MasterX/src/apps/ats/include/symbol.hpp
Source: cplusplus2x.Examples/C++20/MasterX/src/apps/ats/include/symbol.hpp
#ifndef __SYMBOL_HPP__
#define __SYMBOL_HPP__

#include <algorithm>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>

extern std::ostringstream stream;

namespace symbol {

    class Value {
      public:
        std::string text;
        double value;
        Value();
        Value(const Value &v);
        Value(const std::string &text, const double &value);
    };

    class Variable {
      public:
        std::string name;
        Variable();
        ~Variable();
        Variable(const std::string &name, const Value &v);
        Variable(const std::string &name, const unsigned long arr_size);
        bool operator<(const Variable &v) const;
        void createArray(const std::string &n, const unsigned long arr_size);
        void create(const std::string &n, const Value &v);
        void free();
        void setValue(const Value &v);
        Value &getValue() const;
        std::string &get_text();
        std::string &get_text(unsigned long index);
        double &get_double();
        double &get_double(unsigned long index);
        bool isArray() const { return is_array; }
        unsigned long arraySize() const { return array_size; }
        friend std::ostream &operator<<(std::ostream &out, Variable &v);

      private:
        bool is_array;
        unsigned long array_size;
        Value *values;
    };

    class Symbol {
      public:
        Symbol();
        Symbol(const Symbol &s);
        Symbol(const Symbol &&s);
        Symbol &operator=(const Symbol &s);
        Symbol &operator=(const Symbol &&s);
        bool empty() const { return var.empty(); }
        bool exisits(const std::string &name);
        bool get(const std::string &name, Variable &v);
        Variable &operator[](const std::string &index);
        Variable &variable(const std::string &index);
        void list_sorted(std::ostream &out);
        void clear();
        bool remove(const std::string &n);
        friend std::ostream &operator<<(std::ostream &out, Symbol &s);

      protected:
        std::unordered_map<std::string, Variable> var;
    };

} // namespace symbol

#endif