/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2014 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#ifndef cmConditionEvaluator_h
#define cmConditionEvaluator_h

#include "cmCommand.h"
#include "cmExpandedCommandArgument.h"

#include <list>

class cmConditionEvaluator
{
public:
  typedef std::list<cmExpandedCommandArgument> cmArgumentList;

  cmConditionEvaluator(cmMakefile& makefile,
                       cmListFileContext const& context,
                       cmListFileBacktrace const& bt);

  // this is a shared function for both If and Else to determine if the
  // arguments were valid, and if so, was the response true. If there is
  // an error, the errorString will be set.
  bool IsTrue(const std::vector<cmExpandedCommandArgument> &args,
      std::string &errorString,
      cmake::MessageType &status);

  static cmListFileContext GetConditionContext(cmMakefile* mf,
      const cmCommandContext& command, std::string const& filePath);

private:
  // Filter the given variable definition based on policy CMP0054.
  const char* GetDefinitionIfUnquoted(
      const cmExpandedCommandArgument& argument) const;

  const char* GetVariableOrString(
      const cmExpandedCommandArgument& argument) const;

  bool IsKeyword(std::string const& keyword,
    cmExpandedCommandArgument& argument) const;

  bool GetBooleanValue(
    cmExpandedCommandArgument& arg) const;

  bool GetBooleanValueOld(
    cmExpandedCommandArgument const& arg, bool one) const;

  bool GetBooleanValueWithAutoDereference(
    cmExpandedCommandArgument &newArg,
    std::string &errorString,
    cmake::MessageType &status,
    bool oneArg = false) const;

  void IncrementArguments(
    cmArgumentList &newArgs,
    cmArgumentList::iterator &argP1,
    cmArgumentList::iterator &argP2) const;

  void HandlePredicate(bool value, int &reducible,
     cmArgumentList::iterator &arg,
     cmArgumentList &newArgs,
     cmArgumentList::iterator &argP1,
     cmArgumentList::iterator &argP2) const;

  void HandleBinaryOp(bool value, int &reducible,
     cmArgumentList::iterator &arg,
     cmArgumentList &newArgs,
     cmArgumentList::iterator &argP1,
     cmArgumentList::iterator &argP2);

  bool HandleLevel0(cmArgumentList &newArgs,
      std::string &errorString,
      cmake::MessageType &status);

  bool HandleLevel1(cmArgumentList &newArgs,
      std::string &, cmake::MessageType &);

  bool HandleLevel2(cmArgumentList &newArgs,
      std::string &errorString,
      cmake::MessageType &status);

  bool HandleLevel3(cmArgumentList &newArgs,
      std::string &errorString,
      cmake::MessageType &status);

  bool HandleLevel4(cmArgumentList &newArgs,
      std::string &errorString,
      cmake::MessageType &status);

  cmMakefile& Makefile;
  cmListFileContext ExecutionContext;
  cmListFileBacktrace Backtrace;
  cmPolicies::PolicyStatus Policy12Status;
  cmPolicies::PolicyStatus Policy54Status;
  cmPolicies::PolicyStatus Policy57Status;
  cmPolicies::PolicyStatus Policy64Status;
};

#endif
