// 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