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

  enum class Type {
    None,
    Binary,
    Hexadecimal,
    Octal,
    Unsigned,
    Integer,
    Double,
    String
  };

  virtual ~Value() {}

  virtual unsigned short getSize() const = 0;  // size in bits

  // nb of 64 bits words necessary to encode the size
  virtual unsigned short getNbWords() const = 0;

  virtual Type getType() const = 0;

  // is large value (more than one 64 bit word)
  virtual bool isLValue() const = 0;

  virtual uint64_t getValueUL(unsigned short index = 0) const = 0;
  virtual int64_t getValueL(unsigned short index = 0) const = 0;
  virtual double getValueD(unsigned short index = 0) const = 0;
  virtual std::string getValueS() const = 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, Type type, unsigned short size) = 0;
  virtual void set(const std::string& val) = 0;

  virtual bool operator<(const Value& rhs) const = 0;
  virtual bool operator==(const Value& rhs) const = 0;

  bool operator>(const Value& rhs) const { return rhs < (*this); }
  bool operator<=(const Value& rhs) const { return !(*this > rhs); }
  bool operator>=(const Value& rhs) const { return !(*this < rhs); }
  bool operator!=(const Value& rhs) const { return !((*this) == rhs); }

  virtual void u_plus(const Value* a) = 0;
  virtual void u_minus(const Value* a) = 0;
  virtual void u_not(const Value* a) = 0;
  virtual void u_tilda(const Value* a) = 0;
  virtual void incr() = 0;
  virtual void decr() = 0;
  virtual void plus(const Value* a, const Value* b) = 0;
  virtual void minus(const Value* a, const Value* b) = 0;
  virtual void mult(const Value* a, const Value* b) = 0;
  virtual void div(const Value* a, const Value* b) = 0;
  virtual void mod(const Value* a, const Value* b) = 0;

  virtual void greater(const Value* a, const Value* b) = 0;
  virtual void greater_equal(const Value* a, const Value* b) = 0;
  virtual void lesser(const Value* a, const Value* b) = 0;
  virtual void lesser_equal(const Value* a, const Value* b) = 0;
  virtual void equiv(const Value* a, const Value* b) = 0;
  virtual void logAnd(const Value* a, const Value* b) = 0;
  virtual void logOr(const Value* a, const Value* b) = 0;
  virtual void bitwAnd(const Value* a, const Value* b) = 0;
  virtual void bitwOr(const Value* a, const Value* b) = 0;
  virtual void bitwXor(const Value* a, const Value* b) = 0;
  virtual void notEqual(const Value* a, const Value* b) = 0;
  virtual void shiftLeft(const Value* a, const Value* b) = 0;
  virtual void shiftRight(const Value* a, const 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, unsigned short size) : m_value(val), m_size(size) {}
  SValue(uint64_t val) : SValue(val, 64) {}
  SValue(int64_t val) : SValue(val, 64) {}
  SValue(double val) : SValue((uint64_t)val, 64) {}
  ~SValue() final;

  unsigned short getSize() const final { return m_size; }
  unsigned short getNbWords() const final { return 1; }
  bool isLValue() const final { return false; }
  Type getType() const final { return Type::None; }
  void set(uint64_t val) final;
  void set(int64_t val) final;
  void set(double val) final;
  void set(uint64_t val, Type type, unsigned short size) final;
  void set(const std::string& val) final {
    m_value = 6969696969;
    m_size = 6969;
  }

  bool operator<(const Value& rhs) const final {
    return m_value < (dynamic_cast<const SValue*>(&rhs))->m_value;
  }
  bool operator==(const Value& rhs) const final {
    return m_value == (dynamic_cast<const SValue*>(&rhs))->m_value;
  }
  uint64_t getValueUL(unsigned short index = 0) const final { return m_value; }
  int64_t getValueL(unsigned short index = 0) const final {
    return (int64_t)m_value;
  }
  double getValueD(unsigned short index = 0) const final {
    return (double)m_value;
  }
  std::string getValueS() const final { return "NOT_A_STRING_VALUE"; }

  void u_plus(const Value* a) final;
  void u_minus(const Value* a) final;
  void u_not(const Value* a) final;
  void u_tilda(const Value* a) final;
  void incr() final;
  void decr() final;
  void plus(const Value* a, const Value* b) final;
  void minus(const Value* a, const Value* b) final;
  void mult(const Value* a, const Value* b) final;
  void div(const Value* a, const Value* b) final;
  void mod(const Value* a, const Value* b) final;
  void greater(const Value* a, const Value* b) final;
  void greater_equal(const Value* a, const Value* b) final;
  void lesser(const Value* a, const Value* b) final;
  void lesser_equal(const Value* a, const Value* b) final;
  void equiv(const Value* a, const Value* b) final;
  void logAnd(const Value* a, const Value* b) final;
  void logOr(const Value* a, const Value* b) final;
  void bitwAnd(const Value* a, const Value* b) final;
  void bitwOr(const Value* a, const Value* b) final;
  void bitwXor(const Value* a, const Value* b) final;
  void notEqual(const Value* a, const Value* b) final;
  void shiftLeft(const Value* a, const Value* b) final;
  void shiftRight(const Value* a, const Value* b) final;

 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(const LValue&);
  LValue() : m_type(Type::None), m_nbWords(0), m_valueArray(nullptr) {}
  LValue(Type type, SValue* values, unsigned short nbWords)
    : m_type(type), m_nbWords(nbWords), m_valueArray(values) {}
  LValue(uint64_t val);
  LValue(int64_t val);
  LValue(double val);
  LValue(uint64_t val, Type type, unsigned short size);
  ~LValue() final;

  unsigned short getSize() const final;
  unsigned short getNbWords() const final { return m_nbWords; }
  bool isLValue() const final { return true; }
  Type getType() const final { return m_type; }


  void set(uint64_t val) final;
  void set(int64_t val) final;
  void set(double val) final;
  void set(uint64_t val, Type type, unsigned short size) final;
  void set(const std::string& val) final {}
  bool operator<(const Value& rhs) const final;
  bool operator==(const Value& rhs) const final;

  uint64_t getValueUL(unsigned short index = 0) const final {
    return ((index < m_nbWords) ? m_valueArray[index].m_value : 0);
  }
  int64_t getValueL(unsigned short index = 0) const final {
    return ((index < m_nbWords) ? (int64_t)m_valueArray[index].m_value : 0);
  }
  double getValueD(unsigned short index = 0) const final {
    return ((index < m_nbWords) ? (double)m_valueArray[index].m_value : 0);
  }
  std::string getValueS() const final { return "NOT_A_STRING_VALUE"; }
  void u_plus(const Value* a) final;
  void u_minus(const Value* a) final;
  void u_not(const Value* a) final;
  void u_tilda(const Value* a) final;
  void incr() final;
  void decr() final;
  void plus(const Value* a, const Value* b) final;
  void minus(const Value* a, const Value* b) final;
  void mult(const Value* a, const Value* b) final;
  void div(const Value* a, const Value* b) final;
  void mod(const Value* a, const Value* b) final;
  void greater(const Value* a, const Value* b) final;
  void greater_equal(const Value* a, const Value* b) final;
  void lesser(const Value* a, const Value* b) final;
  void lesser_equal(const Value* a, const Value* b) final;
  void equiv(const Value* a, const Value* b) final;
  void logAnd(const Value* a, const Value* b) final;
  void logOr(const Value* a, const Value* b) final;
  void bitwAnd(const Value* a, const Value* b) final;
  void bitwOr(const Value* a, const Value* b) final;
  void bitwXor(const Value* a, const Value* b) final;
  void notEqual(const Value* a, const Value* b) final;
  void shiftLeft(const Value* a, const Value* b) final;
  void shiftRight(const Value* a, const Value* b) final;

  void adjust(const Value* a);

 private:
  Type 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(const std::string& val) : m_value(val), m_size(val.size()) {}
  ~StValue() final;

  unsigned short getSize() const final { return m_size; }
  unsigned short getNbWords() const final { return 1; }
  bool isLValue() const final { return false; }
  Type getType() const final { return Type::String; }
  void set(uint64_t val) final { m_value = std::to_string(val); }
  void set(int64_t val) final { m_value = std::to_string(val); }
  void set(double val) final { m_value = std::to_string(val); }
  void set(uint64_t val, Type type, unsigned short size) final {
    m_value = std::to_string(val);
  }
  void set(const std::string& val) final {
    m_value = val;
    m_size = val.size();
  }
  bool operator<(const Value& rhs) const final {
    return m_value < (dynamic_cast<const StValue*>(&rhs))->m_value;
  }
  bool operator==(const Value& rhs) const final {
    return m_value == (dynamic_cast<const StValue*>(&rhs))->m_value;
  }
  uint64_t getValueUL(unsigned short index = 0) const final {
    return atol(m_value.c_str());
  }
  int64_t getValueL(unsigned short index = 0) const final {
    return (int64_t)atol(m_value.c_str());
  }
  double getValueD(unsigned short index = 0) const final {
    return strtod(m_value.c_str(), NULL);
  }
  std::string getValueS() const final { return m_value; }

  void u_plus(const Value* a) final {}
  void u_minus(const Value* a) final {}
  void u_not(const Value* a) final {}
  void u_tilda(const Value* a) final {}
  void incr() final {}
  void decr() final {}
  void plus(const Value* a, const Value* b) final {}
  void minus(const Value* a, const Value* b) final {}
  void mult(const Value* a, const Value* b) final {}
  void div(const Value* a, const Value* b) final {}
  void mod(const Value* a, const Value* b) final {}
  void greater(const Value* a, const Value* b) final {}
  void greater_equal(const Value* a, const Value* b) final {}
  void lesser(const Value* a, const Value* b) final {}
  void lesser_equal(const Value* a, const Value* b) final {}
  void equiv(const Value* a, const Value* b) final {}
  void logAnd(const Value* a, const Value* b) final {}
  void logOr(const Value* a, const Value* b) final {}
  void bitwAnd(const Value* a, const Value* b) final {}
  void bitwOr(const Value* a, const Value* b) final {}
  void bitwXor(const Value* a, const Value* b) final {}
  void notEqual(const Value* a, const Value* b) final {}
  void shiftLeft(const Value* a, const Value* b) final {}
  void shiftRight(const Value* a, const Value* b) final {}

 private:
  std::string m_value;
  unsigned short m_size;
};

};  // namespace SURELOG

#endif /* VALUE_H */
