#pragma once
#include <boost/tuple/tuple.hpp>

/**
 * @brief This class exists for documentation purposes. 
 *        A Condition class evaluates a condition, possibly with respect to some input arguments.
 */
class Condition
{
  // bool evaluate()
};

/**
 * @brief Trivial class indicating the absence of any condition on a transition.
 */
class NoCondition : public Condition
{
public:
  bool evaluate() const { return true; }
};

/**
 * @brief The negation of some condition.
 */
template <class NegatedCondition>
class Not : public Condition
{
public:
  Not(NegatedCondition condition)
    : m_condition(condition)
  {
  }
  //template <class Arguments>
  //bool evaluate(Arguments& args) 
  //{ 
  //  return !m_condition.evaluate(args);
  //}
  bool evaluate()
  {
    return !m_condition.evaluate();
  }
  template <class T1>
  bool evaluate(T1 t1)
  {
    return !m_condition.evaluate(t1);
  }
  template <class T1, class T2>
  bool evaluate(T1 t1, T2 t2)
  {
    return !m_condition.evaluate(t1, t2);
  }
  template <class T1, class T2, class T3>
  bool evaluate(T1 t1, T2 t2, T3 t3)
  {
    return !m_condition.evaluate(t1, t2, t3);
  }
  template <class T1, class T2, class T3, class T4>
  bool evaluate(T1 t1, T2 t2, T3 t3, T4 t4)
  {
    return !m_condition.evaluate(t1, t2, t3, t4);
  }
  template <class T1, class T2, class T3, class T4, class T5>
  bool evaluate(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5)
  {
    return !m_condition.evaluate(t1, t2, t3, t4, t5);
  }

protected:
  NegatedCondition m_condition;
};
