blob: c28ee1fae853c20ba029be584181a5d1495f0d8c [file] [log] [blame] [edit]
/*
Copyright 2019 Alain Dargelas
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
* File: Value.h
* Author: alain
*
* Created on October 29, 2017, 10:33 PM
*/
#ifndef VALUE_H
#define VALUE_H
#include <string>
namespace SURELOG {
class Expr;
class LValue;
class StValue;
class ValueFactory;
class Value {
public:
friend Expr;
friend ValueFactory;
typedef enum {
None,
Binary,
Hexadecimal,
Octal,
Unsigned,
Integer,
Double,
String
} ValueType;
virtual unsigned short getSize() = 0; // size in bits
virtual unsigned short getNbWords() = 0; // nb of 64 bits words necessary to encode the size
virtual ValueType getType() = 0;
virtual bool isLValue() = 0; // is large value (more than one 64 bit word)
virtual unsigned long getValueUL(unsigned short index = 0) = 0;
virtual long getValueL(unsigned short index = 0) = 0;
virtual double getValueD(unsigned short index = 0) = 0;
virtual std::string getValueS() = 0;
virtual void set(unsigned long val) = 0;
virtual void set(long val) = 0;
virtual void set(double val) = 0;
virtual void set(unsigned long val, ValueType type, unsigned short size) = 0;
virtual void set(std::string val) = 0;
virtual bool operator< (Value& rhs) = 0;
bool operator> (Value& rhs){ return rhs < (*this); }
bool operator<=(Value& rhs){ return !(*this > rhs); }
bool operator>=(Value& rhs){ return !(*this < rhs); }
virtual bool operator==(Value& rhs) = 0;
bool operator!=(Value& rhs){ return !((*this) == rhs); }
virtual void u_plus(Value* a) = 0;
virtual void u_minus(Value* a) = 0;
virtual void u_not(Value* a) = 0;
virtual void u_tilda(Value* a) = 0;
virtual void incr() = 0;
virtual void decr() = 0;
virtual void plus(Value* a, Value* b) = 0;
virtual void minus(Value* a, Value* b) = 0;
virtual void mult(Value* a, Value* b) = 0;
virtual void div(Value* a, Value* b) = 0;
virtual void mod(Value* a, Value* b) = 0;
virtual void greater(Value* a, Value* b) = 0;
virtual void greater_equal(Value* a, Value* b) = 0;
virtual void lesser(Value* a, Value* b) = 0;
virtual void lesser_equal(Value* a, Value* b) = 0;
virtual void equiv(Value* a, Value* b) = 0;
virtual void logAnd(Value* a, Value* b) = 0;
virtual void logOr(Value* a, Value* b) = 0;
virtual void bitwAnd(Value* a, Value* b) = 0;
virtual void bitwOr(Value* a, Value* b) = 0;
virtual void bitwXor(Value* a, Value* b) = 0;
virtual void notEqual(Value* a, Value* b) = 0;
virtual void shiftLeft(Value* a, Value* b) = 0;
virtual void shiftRight(Value* a, Value* b) = 0;
protected:
unsigned int nbWords_(unsigned int size);
};
class SValue : public Value {
friend LValue;
public:
SValue() { m_value = 0; m_size = 0; }
SValue(unsigned long val) { m_value = val; m_size = 64; }
SValue(long val) { m_value = val; m_size = 64; }
SValue(double val) { m_value = (unsigned long) val; m_size = 64; }
SValue(unsigned long val, unsigned short size) { m_value = val; m_size = size; }
unsigned short getSize() { return m_size; }
unsigned short getNbWords() { return 1; }
bool isLValue() { return false; }
ValueType getType() { return None; }
void set(unsigned long val);
void set(long val);
void set(double val);
void set(unsigned long val, ValueType type, unsigned short size);
void set(std::string val) { m_value = 6969696969; m_size = 6969; }
bool operator< (Value& rhs) { return m_value < (dynamic_cast<SValue*>(&rhs))->m_value; }
bool operator==(Value& rhs) { return m_value == (dynamic_cast<SValue*>(&rhs))->m_value; }
unsigned long getValueUL(unsigned short index = 0) { return m_value;}
long getValueL(unsigned short index = 0) { return (long) m_value;}
double getValueD(unsigned short index = 0) { return (double) m_value;}
std::string getValueS() { return "NOT_A_STRING_VALUE"; }
virtual ~SValue();
void u_plus(Value* a);
void u_minus(Value* a);
void u_not(Value* a);
void u_tilda(Value* a);
void incr();
void decr();
void plus(Value* a, Value* b);
void minus(Value* a, Value* b);
void mult(Value* a, Value* b);
void div(Value* a, Value* b);
void mod(Value* a, Value* b);
void greater(Value* a, Value* b);
void greater_equal(Value* a, Value* b);
void lesser(Value* a, Value* b);
void lesser_equal(Value* a, Value* b);
void equiv(Value* a, Value* b);
void logAnd(Value* a, Value* b);
void logOr(Value* a, Value* b);
void bitwAnd(Value* a, Value* b);
void bitwOr(Value* a, Value* b);
void bitwXor(Value* a, Value* b);
void notEqual(Value* a, Value* b);
void shiftLeft(Value* a, Value* b);
void shiftRight(Value* a, Value* b);
private:
unsigned long m_value;
unsigned short m_size;
};
class ValueFactory {
public:
ValueFactory();
Value* newSValue();
Value* newLValue();
Value* newStValue();
Value* newValue(SValue& initVal);
Value* newValue(LValue& initVal);
Value* newValue(StValue& initVal);
void deleteValue(Value*);
protected:
LValue* m_headFree;
LValue* m_headInUse;
};
class LValue : public Value {
friend ValueFactory;
public:
LValue(LValue&);
LValue() { m_type = None; m_nbWords = 0; m_valueArray = NULL; }
LValue(ValueType type, SValue* values, unsigned short nbWords) { m_type = type, m_valueArray = values; m_nbWords = nbWords;}
LValue(unsigned long val);
LValue(long val);
LValue(double val);
LValue(unsigned long val, ValueType type, unsigned short size);
unsigned short getSize();
unsigned short getNbWords() { return m_nbWords; }
bool isLValue() { return true; }
ValueType getType() { return (ValueType) m_type; }
virtual ~LValue();
void set(unsigned long val);
void set(long val);
void set(double val);
void set(unsigned long val, ValueType type, unsigned short size);
void set(std::string val) { }
bool operator< (Value& rhs);
bool operator==(Value& rhs);
unsigned long getValueUL(unsigned short index = 0) { return ((index < m_nbWords) ? m_valueArray[index].m_value : 0);}
long getValueL(unsigned short index = 0) { return ((index < m_nbWords) ? (long) m_valueArray[index].m_value : 0);}
double getValueD(unsigned short index = 0) { return ((index < m_nbWords) ? (double) m_valueArray[index].m_value : 0);}
std::string getValueS() { return "NOT_A_STRING_VALUE"; }
void u_plus(Value* a);
void u_minus(Value* a);
void u_not(Value* a);
void u_tilda(Value* a);
void incr();
void decr();
void plus(Value* a, Value* b);
void minus(Value* a, Value* b);
void mult(Value* a, Value* b);
void div(Value* a, Value* b);
void mod(Value* a, Value* b);
void greater(Value* a, Value* b);
void greater_equal(Value* a, Value* b);
void lesser(Value* a, Value* b);
void lesser_equal(Value* a, Value* b);
void equiv(Value* a, Value* b);
void logAnd(Value* a, Value* b);
void logOr(Value* a, Value* b);
void bitwAnd(Value* a, Value* b);
void bitwOr(Value* a, Value* b);
void bitwXor(Value* a, Value* b);
void notEqual(Value* a, Value* b);
void shiftLeft(Value* a, Value* b);
void shiftRight(Value* a, Value* b);
void adjust(Value* a);
private:
unsigned short m_type;
unsigned short m_nbWords;
SValue* m_valueArray;
LValue* m_prev;
LValue* m_next;
};
class StValue : public Value {
friend LValue;
public:
StValue() { m_value = ""; m_size = 0; }
StValue(std::string val) { m_value = val; m_size = val.size(); }
unsigned short getSize() { return m_size; }
unsigned short getNbWords() { return 1; }
bool isLValue() { return false; }
ValueType getType() { return String; }
void set(unsigned long val) { m_value = std::to_string(val); }
void set(long val) { m_value = std::to_string(val); }
void set(double val) { m_value = std::to_string(val); }
void set(unsigned long val, ValueType type, unsigned short size) { m_value = std::to_string(val); }
void set(std::string val) { m_value = val; m_size = val.size(); }
bool operator< (Value& rhs) { return m_value < (dynamic_cast<StValue*>(&rhs))->m_value; }
bool operator==(Value& rhs) { return m_value == (dynamic_cast<StValue*>(&rhs))->m_value; }
unsigned long getValueUL(unsigned short index = 0) { return atol(m_value.c_str());}
long getValueL(unsigned short index = 0) { return (long) atol(m_value.c_str());}
double getValueD(unsigned short index = 0) { return (double) atof(m_value.c_str());}
std::string getValueS() { return m_value; }
virtual ~StValue();
void u_plus(Value* a) {}
void u_minus(Value* a) {}
void u_not(Value* a) {}
void u_tilda(Value* a) {}
void incr() {}
void decr() {}
void plus(Value* a, Value* b) {}
void minus(Value* a, Value* b) {}
void mult(Value* a, Value* b) {}
void div(Value* a, Value* b) {}
void mod(Value* a, Value* b) {}
void greater(Value* a, Value* b) {}
void greater_equal(Value* a, Value* b) {}
void lesser(Value* a, Value* b) {}
void lesser_equal(Value* a, Value* b) {}
void equiv(Value* a, Value* b) {}
void logAnd(Value* a, Value* b) {}
void logOr(Value* a, Value* b) {}
void bitwAnd(Value* a, Value* b) {}
void bitwOr(Value* a, Value* b) {}
void bitwXor(Value* a, Value* b) {}
void notEqual(Value* a, Value* b) {}
void shiftLeft(Value* a, Value* b) {}
void shiftRight(Value* a, Value* b) {}
private:
std::string m_value;
unsigned short m_size;
};
};
#endif /* VALUE_H */