← index
ats.web/source/variable.cpp
Source: ats.web/source/variable.cpp
#include "symbol.hpp"
#include "function.hpp"

#ifdef HAVE_CONFIG_H
#include<config.h>
#endif

extern std::ostringstream stream;

namespace symbol {
    
    Value::Value() : text(""), value(0) { }
    Value::Value(const Value &v) : text(v.text), value(v.value) { }
    Value::Value(const std::string &t, const double &v) : text(t), value(v) { }
    
    Variable::Variable() : is_array(false), array_size(0), values(nullptr) {}
    
    Variable::~Variable() {
        free();
#ifdef DEBUG_MODE
        stream << "destructor -> " << name << "\r\n";
#endif
    }
    
    void Variable::free() {
        if(values != nullptr) {
            if(is_array)
                delete [] values;
            else
                delete values;
            values = nullptr;
        }
    }
    
    Variable::Variable(const std::string &n, const Value &value)  {
        values = nullptr;
        create(n, value);
    }
    
    Variable::Variable(const std::string &n, const unsigned long arr_size) {
        values = nullptr;
        createArray(n, arr_size);
    }
    
    bool Variable::operator<(const Variable &v) const {
        if(name < v.name) return true;
        return false;
    }
    
    void Variable::setValue(const Value &v) {
        if(values != nullptr && is_array == false) {
            values->text = v.text;
            values->value = v.value;
        }
    }
    
    Value &Variable::getValue() const {
        return *values;
    }
    
    void Variable::createArray(const std::string &n, const unsigned long arr_size) {
        free();
        array_size = arr_size;
        is_array = true;
        name = n;
        values = new Value[arr_size+1];
    }
    
    void Variable::create(const std::string &n, const Value &v) {
        free();
        name = n;
        values = new Value(v.text, v.value);
        is_array = false;
        array_size = 0;
    }
    
    std::string &Variable::get_text(unsigned long index) {
        return values[index].text;
    }
    
    std::string &Variable::get_text() {
        return values->text;
    }
    
    double &Variable::get_double() {
        return values->value;
    }
    
    double &Variable::get_double(unsigned long index) {
        return values[index].value;
    }
    
    std::ostream &operator<<(std::ostream &out, Variable &v) {
        bool ohex = code.symbols["hex"].get_double()!=0;
        
        if(v.isArray() == false)
            if(ohex == false)
            	out << v.name << " = { \"" << v.get_text() << "\" : " << v.get_double() << " } ";
        	else
                out << v.name << " = { \"" << v.get_text() << "\" : $" << std::uppercase << std::hex << static_cast<int>(v.get_double()) << " } ";
        else {
            for(unsigned int i = 0; i < v.arraySize(); ++i) {
                
                if(ohex == false || v.get_double(i) < 0)
                	out << v.name << "[" << i << "] = { \"" << v.get_text(i) << "\" : " << v.get_double(i) << " }\r\n";
                else
                    out << v.name << " = { \"" << v.get_text() << "\" : $" << std::uppercase << std::hex << static_cast<int>(v.get_double(i)) << " } ";
            }
        }
        return out;
    }
}