/*
 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:   Expr.h
 * Author: alain
 *
 * Created on October 29, 2017, 10:21 PM
 */

#ifndef EXPR_H
#define EXPR_H
#include <string>
#include "Value.h"

namespace SURELOG {

class ExprFactory;    
class ExprBuilder;
  
class Expr {
public:
friend ExprFactory;    
    Expr() : m_val(NULL) , m_valR(NULL), m_leftExpr(NULL), m_rightExpr(NULL), m_type(None) {}
    Expr(Value* val) : m_val(val), m_valR(NULL), m_leftExpr(NULL), m_rightExpr(NULL), m_type(Scalar) {}
    Expr(Value* valL, Value* valR): m_val(valL), m_valR(valR), m_leftExpr(NULL), m_rightExpr(NULL), m_type(Range) {}
    Expr(const Expr& orig);
    typedef enum { None,
                   Scalar,
                   Range,
                   Add, 
                   Minus, 
                   Mult, 
                   Div, 
                   Modulo, 
                   Neg } ExprType;
    
    Expr* makeExpr(Expr* leftExpr, Expr* rightExpr, ExprType type) { m_leftExpr = leftExpr; m_rightExpr = rightExpr; m_type = type; return this; }
    ExprType getType() { return m_type; }
    Value* eval();
    std::pair<Value*, Value*> evalRange();
    virtual ~Expr();
private:
       
    Value*   m_val;
    Value*   m_valR;
    Expr*    m_leftExpr;
    Expr*    m_rightExpr;
    ExprType m_type;
    ExprFactory* m_factory;
};


class ExprFactory {
public:
friend Expr;
friend ExprBuilder;
    ExprFactory();
    
    Expr* newExpr();
    Expr* newExpr(Value* val);
    Expr* newExpr(Value* valL, Value* valR);
    
    void deleteExpr(Expr*);
    
private:    
    ValueFactory m_valueFactory;
    
};


};

#endif /* EXPR_H */



