[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [lmi] master e6010c2 1/2: Add Max() and Min() to PETE
From: |
Greg Chicares |
Subject: |
[lmi-commits] [lmi] master e6010c2 1/2: Add Max() and Min() to PETE |
Date: |
Fri, 26 Feb 2021 15:46:41 -0500 (EST) |
branch: master
commit e6010c23bb50fffc048bdc89901a5f5438657ef5
Author: Gregory W. Chicares <gchicares@sbcglobal.net>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>
Add Max() and Min() to PETE
"min" and "max" would be more natural, but would cause ambiguities with
std::min() and std::max(). Calling "::max" and "::min" would prevent
such ambiguities, at least in the simple unit test, but someone might
define those in the global namespace, or introduce std:: versions there
with "using". Something like "PETE::max()" would be safest, but ugly.
* tools/pete-2.1.1/PETE/Tools/PeteOps.in: Add Max() and Min().
* tools/pete-2.1.1/et_vector_test.cpp: Test Max() and Min().
* tools/pete-2.1.1/PETE/OperatorTags.h: Automatically regenerated.
* tools/pete-2.1.1/PETE/Tools/PeteOps.cpp: Automatically regenerated.
* tools/pete-2.1.1/et_vector_operators.hpp: Automatically regenerated.
Regenerated thus:
pushd tools/pete-2.1.1/
(make -f Makefile maintainer-clean && \
make -f Makefile && \
./et_vector_test && \
make -f Makefile distclean ) 2>&1 |less
popd
---
tools/pete-2.1.1/PETE/OperatorTags.h | 22 +++
tools/pete-2.1.1/PETE/Tools/PeteOps.cpp | 10 ++
tools/pete-2.1.1/PETE/Tools/PeteOps.in | 8 ++
tools/pete-2.1.1/et_vector_operators.hpp | 224 +++++++++++++++++++++++++++++++
tools/pete-2.1.1/et_vector_test.cpp | 11 ++
5 files changed, 275 insertions(+)
diff --git a/tools/pete-2.1.1/PETE/OperatorTags.h
b/tools/pete-2.1.1/PETE/OperatorTags.h
index fb931b8..ca2b276 100644
--- a/tools/pete-2.1.1/PETE/OperatorTags.h
+++ b/tools/pete-2.1.1/PETE/OperatorTags.h
@@ -435,6 +435,28 @@ struct FnArcTan2
}
};
+struct FnMax
+{
+ PETE_EMPTY_CONSTRUCTORS(FnMax)
+ template<class T1, class T2>
+ inline typename BinaryReturn<T1, T2, FnMax >::Type_t
+ operator()(const T1 &a, const T2 &b) const
+ {
+ return ((a < b) ? b : a);
+ }
+};
+
+struct FnMin
+{
+ PETE_EMPTY_CONSTRUCTORS(FnMin)
+ template<class T1, class T2>
+ inline typename BinaryReturn<T1, T2, FnMin >::Type_t
+ operator()(const T1 &a, const T2 &b) const
+ {
+ return ((a < b) ? a : b);
+ }
+};
+
struct OpLT
{
PETE_EMPTY_CONSTRUCTORS(OpLT)
diff --git a/tools/pete-2.1.1/PETE/Tools/PeteOps.cpp
b/tools/pete-2.1.1/PETE/Tools/PeteOps.cpp
index 1286c55..9ba895c 100644
--- a/tools/pete-2.1.1/PETE/Tools/PeteOps.cpp
+++ b/tools/pete-2.1.1/PETE/Tools/PeteOps.cpp
@@ -193,6 +193,16 @@ void peteOps(map<string,vector<OperatorDescriptor> > &m)
"atan2",
"return (atan2(a,b));",
""));
+ m["binaryOps"].push_back(
+ OperatorDescriptor("FnMax",
+ "Max",
+ "return ((a < b) ? b : a);",
+ ""));
+ m["binaryOps"].push_back(
+ OperatorDescriptor("FnMin",
+ "Min",
+ "return ((a < b) ? a : b);",
+ ""));
m["binaryStdOps"].push_back(
OperatorDescriptor("ApplyBinary",
"apply_binary",
diff --git a/tools/pete-2.1.1/PETE/Tools/PeteOps.in
b/tools/pete-2.1.1/PETE/Tools/PeteOps.in
index 40f6ffe..b6d556f 100644
--- a/tools/pete-2.1.1/PETE/Tools/PeteOps.in
+++ b/tools/pete-2.1.1/PETE/Tools/PeteOps.in
@@ -147,6 +147,14 @@ binaryOps
TAG = "FnArcTan2"
FUNCTION = "atan2"
EXPR = "return (atan2(a,b));"
+-----
+ TAG = "FnMax"
+ FUNCTION = "Max"
+ EXPR = "return ((a < b) ? b : a);"
+-----
+ TAG = "FnMin"
+ FUNCTION = "Min"
+ EXPR = "return ((a < b) ? a : b);"
binaryBoolOps
-----
diff --git a/tools/pete-2.1.1/et_vector_operators.hpp
b/tools/pete-2.1.1/et_vector_operators.hpp
index 99019cb..b487ac0 100644
--- a/tools/pete-2.1.1/et_vector_operators.hpp
+++ b/tools/pete-2.1.1/et_vector_operators.hpp
@@ -436,6 +436,34 @@ atan2(const std::vector<T1> & l,const std::vector<T2> & r)
}
template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMax,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> >::Expression_t
+Max(const std::vector<T1> & l,const std::vector<T2> & r)
+{
+ typedef BinaryNode<FnMax,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<std::vector<T1> >::make(l),
+ CreateLeaf<std::vector<T2> >::make(r)));
+}
+
+template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMin,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> >::Expression_t
+Min(const std::vector<T1> & l,const std::vector<T2> & r)
+{
+ typedef BinaryNode<FnMin,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<std::vector<T1> >::make(l),
+ CreateLeaf<std::vector<T2> >::make(r)));
+}
+
+template<class T1,class T2>
inline typename MakeReturn<BinaryNode<OpLT,
typename CreateLeaf<std::vector<T1> >::Leaf_t,
typename CreateLeaf<std::vector<T2> >::Leaf_t> >::Expression_t
@@ -730,6 +758,34 @@ atan2(const std::vector<T1> & l,const Expression<T2> & r)
}
template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMax,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> >::Expression_t
+Max(const std::vector<T1> & l,const Expression<T2> & r)
+{
+ typedef BinaryNode<FnMax,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<std::vector<T1> >::make(l),
+ CreateLeaf<Expression<T2> >::make(r)));
+}
+
+template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMin,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> >::Expression_t
+Min(const std::vector<T1> & l,const Expression<T2> & r)
+{
+ typedef BinaryNode<FnMin,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<std::vector<T1> >::make(l),
+ CreateLeaf<Expression<T2> >::make(r)));
+}
+
+template<class T1,class T2>
inline typename MakeReturn<BinaryNode<OpLT,
typename CreateLeaf<std::vector<T1> >::Leaf_t,
typename CreateLeaf<Expression<T2> >::Leaf_t> >::Expression_t
@@ -1024,6 +1080,34 @@ atan2(const Expression<T1> & l,const std::vector<T2> & r)
}
template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMax,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> >::Expression_t
+Max(const Expression<T1> & l,const std::vector<T2> & r)
+{
+ typedef BinaryNode<FnMax,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<Expression<T1> >::make(l),
+ CreateLeaf<std::vector<T2> >::make(r)));
+}
+
+template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMin,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> >::Expression_t
+Min(const Expression<T1> & l,const std::vector<T2> & r)
+{
+ typedef BinaryNode<FnMin,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<Expression<T1> >::make(l),
+ CreateLeaf<std::vector<T2> >::make(r)));
+}
+
+template<class T1,class T2>
inline typename MakeReturn<BinaryNode<OpLT,
typename CreateLeaf<Expression<T1> >::Leaf_t,
typename CreateLeaf<std::vector<T2> >::Leaf_t> >::Expression_t
@@ -1318,6 +1402,34 @@ atan2(const std::vector<T1> & l,const T2 & r)
}
template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMax,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
+Max(const std::vector<T1> & l,const T2 & r)
+{
+ typedef BinaryNode<FnMax,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<T2 >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<std::vector<T1> >::make(l),
+ CreateLeaf<T2 >::make(r)));
+}
+
+template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMin,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
+Min(const std::vector<T1> & l,const T2 & r)
+{
+ typedef BinaryNode<FnMin,
+ typename CreateLeaf<std::vector<T1> >::Leaf_t,
+ typename CreateLeaf<T2 >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<std::vector<T1> >::make(l),
+ CreateLeaf<T2 >::make(r)));
+}
+
+template<class T1,class T2>
inline typename MakeReturn<BinaryNode<OpLT,
typename CreateLeaf<std::vector<T1> >::Leaf_t,
typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
@@ -1612,6 +1724,34 @@ atan2(const T1 & l,const std::vector<T2> & r)
}
template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMax,
+ typename CreateLeaf<T1 >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> >::Expression_t
+Max(const T1 & l,const std::vector<T2> & r)
+{
+ typedef BinaryNode<FnMax,
+ typename CreateLeaf<T1 >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<T1 >::make(l),
+ CreateLeaf<std::vector<T2> >::make(r)));
+}
+
+template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMin,
+ typename CreateLeaf<T1 >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> >::Expression_t
+Min(const T1 & l,const std::vector<T2> & r)
+{
+ typedef BinaryNode<FnMin,
+ typename CreateLeaf<T1 >::Leaf_t,
+ typename CreateLeaf<std::vector<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<T1 >::make(l),
+ CreateLeaf<std::vector<T2> >::make(r)));
+}
+
+template<class T1,class T2>
inline typename MakeReturn<BinaryNode<OpLT,
typename CreateLeaf<T1 >::Leaf_t,
typename CreateLeaf<std::vector<T2> >::Leaf_t> >::Expression_t
@@ -2180,6 +2320,34 @@ atan2(const Expression<T1> & l,const Expression<T2> & r)
}
template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMax,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> >::Expression_t
+Max(const Expression<T1> & l,const Expression<T2> & r)
+{
+ typedef BinaryNode<FnMax,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<Expression<T1> >::make(l),
+ CreateLeaf<Expression<T2> >::make(r)));
+}
+
+template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMin,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> >::Expression_t
+Min(const Expression<T1> & l,const Expression<T2> & r)
+{
+ typedef BinaryNode<FnMin,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<Expression<T1> >::make(l),
+ CreateLeaf<Expression<T2> >::make(r)));
+}
+
+template<class T1,class T2>
inline typename MakeReturn<BinaryNode<OpLT,
typename CreateLeaf<Expression<T1> >::Leaf_t,
typename CreateLeaf<Expression<T2> >::Leaf_t> >::Expression_t
@@ -2474,6 +2642,34 @@ atan2(const Expression<T1> & l,const T2 & r)
}
template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMax,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
+Max(const Expression<T1> & l,const T2 & r)
+{
+ typedef BinaryNode<FnMax,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<T2 >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<Expression<T1> >::make(l),
+ CreateLeaf<T2 >::make(r)));
+}
+
+template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMin,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
+Min(const Expression<T1> & l,const T2 & r)
+{
+ typedef BinaryNode<FnMin,
+ typename CreateLeaf<Expression<T1> >::Leaf_t,
+ typename CreateLeaf<T2 >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<Expression<T1> >::make(l),
+ CreateLeaf<T2 >::make(r)));
+}
+
+template<class T1,class T2>
inline typename MakeReturn<BinaryNode<OpLT,
typename CreateLeaf<Expression<T1> >::Leaf_t,
typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
@@ -2768,6 +2964,34 @@ atan2(const T1 & l,const Expression<T2> & r)
}
template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMax,
+ typename CreateLeaf<T1 >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> >::Expression_t
+Max(const T1 & l,const Expression<T2> & r)
+{
+ typedef BinaryNode<FnMax,
+ typename CreateLeaf<T1 >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<T1 >::make(l),
+ CreateLeaf<Expression<T2> >::make(r)));
+}
+
+template<class T1,class T2>
+inline typename MakeReturn<BinaryNode<FnMin,
+ typename CreateLeaf<T1 >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> >::Expression_t
+Min(const T1 & l,const Expression<T2> & r)
+{
+ typedef BinaryNode<FnMin,
+ typename CreateLeaf<T1 >::Leaf_t,
+ typename CreateLeaf<Expression<T2> >::Leaf_t> Tree_t;
+ return MakeReturn<Tree_t>::make(Tree_t(
+ CreateLeaf<T1 >::make(l),
+ CreateLeaf<Expression<T2> >::make(r)));
+}
+
+template<class T1,class T2>
inline typename MakeReturn<BinaryNode<OpLT,
typename CreateLeaf<T1 >::Leaf_t,
typename CreateLeaf<Expression<T2> >::Leaf_t> >::Expression_t
diff --git a/tools/pete-2.1.1/et_vector_test.cpp
b/tools/pete-2.1.1/et_vector_test.cpp
index a238fed..048a245 100644
--- a/tools/pete-2.1.1/et_vector_test.cpp
+++ b/tools/pete-2.1.1/et_vector_test.cpp
@@ -68,4 +68,15 @@ int main()
assign(v0, apply_binary(std::plus<double>(), v0, 100.0));
assign(v0, apply_binary(std::plus<double>(), 10000.0, v0));
show_vector(v0);
+
+ // Test Min() and Max().
+ std::vector<double> v2 = {1.2, 2.3, 3.4, 7.7};
+ std::vector<double> v3 = {1.9, 2.9, 3.9, 0.0};
+ std::vector<double> v4(v2.size());
+ assign(v4, Max(v2, v3));
+ show_vector(v4);
+ assign(v4, Min(v2, v3));
+ show_vector(v4);
+
+ std::cout << "Completed." << std::endl;
}