blob: 4468713e162b74e1ca5c515c7ff10ac7e5f4690e [file] [log] [blame]
/*
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 <stdint.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 uint64_t getValueUL(unsigned short index = 0) = 0;
virtual int64_t getValueL(unsigned short index = 0) = 0;
virtual double getValueD(unsigned short index = 0) = 0;
virtual std::string getValueS() = 0;
virtual void set(uint64_t val) = 0;
virtual void set(int64_t val) = 0;
virtual void set(double val) = 0;
virtual void set(uint64_t 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(uint64_t val) {
m_value = val;
m_size = 64;
}
SValue(int64_t val) {
m_value = val;
m_size = 64;
}
SValue(double val) {
m_value = (uint64_t)val;
m_size = 64;
}
SValue(uint64_t 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(uint64_t val);
void set(int64_t val);
void set(double val);
void set(uint64_t 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;
}
uint64_t getValueUL(unsigned short index = 0) { return m_value; }
int64_t getValueL(unsigned short index = 0) { return (int64_t)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:
uint64_t 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(uint64_t val);
LValue(int64_t val);
LValue(double val);
LValue(uint64_t 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(uint64_t val);
void set(int64_t val);
void set(double val);
void set(uint64_t val, ValueType type, unsigned short size);
void set(std::string val) {}
bool operator<(Value& rhs);
bool operator==(Value& rhs);
uint64_t getValueUL(unsigned short index = 0) {
return ((index < m_nbWords) ? m_valueArray[index].m_value : 0);
}
int64_t getValueL(unsigned short index = 0) {
return ((index < m_nbWords) ? (int64_t)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(uint64_t val) { m_value = std::to_string(val); }
void set(int64_t val) { m_value = std::to_string(val); }
void set(double val) { m_value = std::to_string(val); }
void set(uint64_t 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;
}
uint64_t getValueUL(unsigned short index = 0) {
return atol(m_value.c_str());
}
int64_t getValueL(unsigned short index = 0) {
return (int64_t)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;
};
}; // namespace SURELOG
#endif /* VALUE_H */