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

};  // namespace SURELOG

#endif /* EXPR_H */
