diff options
author | Carlo Zancanaro <carlo@pc-4w14-0.cs.usyd.edu.au> | 2012-10-15 17:10:06 +1100 |
---|---|---|
committer | Carlo Zancanaro <carlo@pc-4w14-0.cs.usyd.edu.au> | 2012-10-15 17:10:06 +1100 |
commit | be1de4be954c80875ad4108e0a33e8e131b2f2c0 (patch) | |
tree | 1fbbecf276bf7c7bdcbb4dd446099d6d90eaa516 /clang/include/clang/Analysis/Analyses/IntervalSolver/Operator.hpp | |
parent | c4626a62754862d20b41e8a46a3574264ea80e6d (diff) | |
parent | f1bd2e48c5324d3f7cda4090c87f8a5b6f463ce2 (diff) |
Merge branch 'master' of ssh://bitbucket.org/czan/honours
Diffstat (limited to 'clang/include/clang/Analysis/Analyses/IntervalSolver/Operator.hpp')
-rw-r--r-- | clang/include/clang/Analysis/Analyses/IntervalSolver/Operator.hpp | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/clang/include/clang/Analysis/Analyses/IntervalSolver/Operator.hpp b/clang/include/clang/Analysis/Analyses/IntervalSolver/Operator.hpp new file mode 100644 index 0000000..08c66ff --- /dev/null +++ b/clang/include/clang/Analysis/Analyses/IntervalSolver/Operator.hpp @@ -0,0 +1,173 @@ +#ifndef OPERATOR_HPP +#define OPERATOR_HPP + +#include <vector> + +template<typename Domain> +struct Operator { + virtual ~Operator() { } + + virtual Domain eval(const std::vector<Domain>&) const = 0; + + virtual void print(std::ostream&) const = 0; +}; + +template<typename Domain> +struct Maximum : public Operator<Domain> { + virtual Domain eval(const std::vector<Domain>& arguments) const { + Domain result = -infinity<Domain>(); + for (typename std::vector<Domain>::const_iterator it = arguments.begin(); + it != arguments.end(); + ++it) { + result = (result < *it ? *it : result); + } + return result; + } + void print(std::ostream& cout) const { + cout << "max"; + } +}; + + +template<class T> +T minimum(const T& l, const T& r) { + return (l < r ? l : r); +} +template<typename Domain> +struct Minimum : public Operator<Domain> { + virtual Domain eval(const std::vector<Domain>& arguments) const { + Domain result = infinity<Domain>(); + for (typename std::vector<Domain>::const_iterator it = arguments.begin(); + it != arguments.end(); + ++it) { + result = minimum(*it, result); //*it < result ? *it : result); + } + return result; + } + void print(std::ostream& cout) const { + cout << "min"; + } +}; + +template<typename Domain> +struct Negation : public Operator<Domain> { + virtual Domain eval(const std::vector<Domain>& arguments) const { + if (arguments.size() > 1) + throw "Too many arguments to a negation."; + return -arguments[0]; + } + void print(std::ostream& cout) const { + cout << "-"; + } +}; + +template<typename Domain> +struct Addition : public Operator<Domain> { + virtual Domain eval(const std::vector<Domain>& arguments) const { + Domain result = 0; + for (typename std::vector<Domain>::const_iterator it = arguments.begin(); + it != arguments.end(); + ++it) { + result += *it; + } + return result; + } + void print(std::ostream& cout) const { + cout << "add"; + } +}; + +template<typename Domain> +struct Subtraction : public Operator<Domain> { + virtual Domain eval(const std::vector<Domain>& arguments) const { + Domain result = 0; + for (typename std::vector<Domain>::const_iterator it = arguments.begin(); + it != arguments.end(); + ++it) { + if (it == arguments.begin()) + result = *it; + else + result -= *it; + } + return result; + } + void print(std::ostream& cout) const { + cout << "sub"; + } +}; + +template<typename Domain> +struct Multiplication : public Operator<Domain> { + virtual Domain eval(const std::vector<Domain>& arguments) const { + Domain result = 1; + for (typename std::vector<Domain>::const_iterator it = arguments.begin(), + end = arguments.end(); + it != end; + ++it) { + result *= *it; + } + return result; + } + void print(std::ostream& cout) const { + cout << "mult"; + } +}; + +template<typename Domain> +struct Comma : public Operator<Domain> { + virtual Domain eval(const std::vector<Domain>& arguments) const { + if (arguments[0] == -infinity<Domain>()) { + return -infinity<Domain>(); + } + return arguments[1]; + } + void print(std::ostream& cout) const { + cout << "comma"; + } +}; + +template<typename Domain> +struct Guard : public Operator<Domain> { + virtual Domain eval(const std::vector<Domain>& arguments) const { + Domain result = arguments[2]; + if (arguments[0] < arguments[1]) { + result = -infinity<Domain>(); + } + return result; + } + void print(std::ostream& cout) const { + cout << "guard"; + } +}; + +/*#include "TemplateConstraintMatrix.hpp" + +template<typename Domain> +struct MinimumCostFlow : public Operator<Domain> { + MinimumCostFlow() { + } + Domain solve(const Domain& d) const { + + } + virtual Domain eval(const std::vector<Domain>& arguments) const { + if (arguments.size() != 1) + throw "Incorrect number of arguments."; + return solve(arguments[0]); + } + void print(std::ostream& cout) const { + cout << "minCostFlow"; + } +private: + TemplateConstraintMatrix& constraint; // T + std::vector<Domain> guard; // c + std::vector<std::vector<Domain>> multiplication; //A + unsigned int row; +};*/ + +template<typename T> +std::ostream& operator<<(std::ostream& cout, const Operator<T>& op) { + op.print(cout); + return cout; +} + +#endif |