/*
 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 */
