// CS 509 - Advanced Programming II
// Spring 2004
//
// An example expression template use.

#include <iostream>
#include <functional>
#include "et.h"

template <class LExpr, class RExpr>
static binary_expression <LExpr, RExpr, std::less<result_type> >
make_less(LExpr l, RExpr r) {
  return binary_expression<LExpr, RExpr, std::less<result_type> >(l, r); 
  }


template <class LExpr, class RExpr>
binary_expression <LExpr, RExpr, std::logical_or<result_type> >
make_logical_or(LExpr l, RExpr r) {
  return binary_expression<LExpr, RExpr, std::logical_or<result_type> >(l, r); 
  }


template <class LExpr, class RExpr>
static binary_expression <LExpr, RExpr, std::less<result_type> >
operator < (LExpr l, RExpr r) {
  return binary_expression<LExpr, RExpr, std::less<result_type> >(l, r); 
  }


template <class LExpr, class RExpr>
binary_expression <LExpr, RExpr, std::logical_or<result_type> >
operator || (LExpr l, RExpr r) {
  return binary_expression<LExpr, RExpr, std::logical_or<result_type> >(l, r); 
  }


static void
t1() {

  result_type t = 102.5;

  // (t < 97.6) || (99.6 < t)

  const bool abnormal =
    binary_expression<
      binary_expression<variable, literal, std::less<result_type> >,
      binary_expression<literal, variable, std::less<result_type> >,
      std::logical_or<result_type> >
      (binary_expression<variable, literal, std::less<result_type> >
         (variable(t), literal(97.6)), 
       binary_expression<literal, variable, std::less<result_type> >
         (literal(99.6), variable(t))).evaluate();
       
  std::cout << t << " is " << (abnormal ? "ab" : "") << "normal.\n";
  }


static void
t2() {

  result_type t = 98.3;

  // (t < 97.6) || (99.6 < t)

  const bool abnormal =
    make_logical_or(
      make_less(variable(t), literal(97.6)),
      make_less(literal(99.6), variable(t))).evaluate();
       
  std::cout << t << " is " << (abnormal ? "ab" : "") << "normal.\n";
  }

static void
t3() {

  result_type t = 450.0;

  // (t < 97.6) || (99.6 < t)

  const bool abnormal =
    ((variable(t) < literal(97.6)) || (literal(99.6) < variable(t))).evaluate();

  std::cout << t << " is " << (abnormal ? "ab" : "") << "normal.\n";
  }


static void
t4() {

  result_type temp = 50.0;
  variable t = temp;

  // (t < 97.6) || (99.6 < t)

  const bool abnormal =
    ((t < literal(97.6)) || (literal(99.6) < t)).evaluate();

  std::cout << temp << " is " << (abnormal ? "ab" : "") << "normal.\n";
  }


int
main() {
  t1();
  t2();
  t3();
  t4();
  }

// $Log:$


syntax highlighted by Code2HTML, v. 0.9