//== SimpleConstraintManager.h ----------------------------------*- C++ -*--==//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  Code shared between BasicConstraintManager and RangeConstraintManager.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H
#define LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H

#include "clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"

namespace clang {

namespace ento {

class SimpleConstraintManager : public ConstraintManager {
  SubEngine &SU;
  BasicValueFactory &BVF;
public:
  SimpleConstraintManager(SubEngine &subengine, BasicValueFactory &BV)
    : SU(subengine), BVF(BV) {}
  virtual ~SimpleConstraintManager();

  //===------------------------------------------------------------------===//
  // Common implementation for the interface provided by ConstraintManager.
  //===------------------------------------------------------------------===//

  ProgramStateRef assume(ProgramStateRef state, DefinedSVal Cond,
                        bool Assumption);

  ProgramStateRef assume(ProgramStateRef state, Loc Cond, bool Assumption);

  ProgramStateRef assume(ProgramStateRef state, NonLoc Cond, bool Assumption);

  ProgramStateRef assumeSymRel(ProgramStateRef state,
                              const SymExpr *LHS,
                              BinaryOperator::Opcode op,
                              const llvm::APSInt& Int);

protected:

  //===------------------------------------------------------------------===//
  // Interface that subclasses must implement.
  //===------------------------------------------------------------------===//

  // Each of these is of the form "$sym+Adj <> V", where "<>" is the comparison
  // operation for the method being invoked.
  virtual ProgramStateRef assumeSymNE(ProgramStateRef state, SymbolRef sym,
                                     const llvm::APSInt& V,
                                     const llvm::APSInt& Adjustment) = 0;

  virtual ProgramStateRef assumeSymEQ(ProgramStateRef state, SymbolRef sym,
                                     const llvm::APSInt& V,
                                     const llvm::APSInt& Adjustment) = 0;

  virtual ProgramStateRef assumeSymLT(ProgramStateRef state, SymbolRef sym,
                                     const llvm::APSInt& V,
                                     const llvm::APSInt& Adjustment) = 0;

  virtual ProgramStateRef assumeSymGT(ProgramStateRef state, SymbolRef sym,
                                     const llvm::APSInt& V,
                                     const llvm::APSInt& Adjustment) = 0;

  virtual ProgramStateRef assumeSymLE(ProgramStateRef state, SymbolRef sym,
                                     const llvm::APSInt& V,
                                     const llvm::APSInt& Adjustment) = 0;

  virtual ProgramStateRef assumeSymGE(ProgramStateRef state, SymbolRef sym,
                                     const llvm::APSInt& V,
                                     const llvm::APSInt& Adjustment) = 0;

  //===------------------------------------------------------------------===//
  // Internal implementation.
  //===------------------------------------------------------------------===//

  BasicValueFactory &getBasicVals() const { return BVF; }

  bool canReasonAbout(SVal X) const;

  ProgramStateRef assumeAux(ProgramStateRef state,
                                Loc Cond,
                                bool Assumption);

  ProgramStateRef assumeAux(ProgramStateRef state,
                                NonLoc Cond,
                                bool Assumption);

  ProgramStateRef assumeAuxForSymbol(ProgramStateRef State,
                                         SymbolRef Sym,
                                         bool Assumption);
};

} // end GR namespace

} // end clang namespace

#endif
