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



