lmi-commits
[Top][All Lists]
Advanced

[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;
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]