[algs] Accept varargs in hb_min/max
authorBehdad Esfahbod <behdad@behdad.org>
Wed, 8 May 2019 04:33:26 +0000 (21:33 -0700)
committerBehdad Esfahbod <behdad@behdad.org>
Wed, 8 May 2019 04:33:26 +0000 (21:33 -0700)
src/hb-algs.hh
src/test-algs.cc

index 7ed42d6..3b5e45f 100644 (file)
@@ -186,20 +186,38 @@ struct
 }
 HB_FUNCOBJ (hb_second);
 
-/* Note.  In min/max, we can use hb_type_identity<T> for second argument.
+/* Note.  In min/max impl, we can use hb_type_identity<T> for second argument.
  * However, that would silently convert between different-signedness integers.
  * Instead we accept two different types, such that compiler can err if
  * comparing integers of different signedness. */
 struct
 {
+  private:
   template <typename T, typename T2> auto
-  operator () (T&& a, T2&& b) const HB_AUTO_RETURN (a <= b ? a : b)
+  impl (T&& a, T2&& b) const HB_AUTO_RETURN (a <= b ? a : b)
+
+  public:
+  template <typename T> auto
+  operator () (T&& a) const HB_AUTO_RETURN (a)
+
+  template <typename T, typename... Ts> auto
+  operator () (T&& a, Ts&& ...ds) const HB_AUTO_RETURN
+  (impl (hb_forward<T> (a), (*this) (hb_forward<Ts> (ds)...)))
 }
 HB_FUNCOBJ (hb_min);
 struct
 {
+  private:
   template <typename T, typename T2> auto
-  operator () (T&& a, T2&& b) const HB_AUTO_RETURN (a >= b ? a : b)
+  impl (T&& a, T2&& b) const HB_AUTO_RETURN (a >= b ? a : b)
+
+  public:
+  template <typename T> auto
+  operator () (T&& a) const HB_AUTO_RETURN (a)
+
+  template <typename T, typename... Ts> auto
+  operator () (T&& a, Ts&& ...ds) const HB_AUTO_RETURN
+  (impl (hb_forward<T> (a), (*this) (hb_forward<Ts> (ds)...)))
 }
 HB_FUNCOBJ (hb_max);
 
index 163a79a..0a8fcbf 100644 (file)
@@ -62,5 +62,13 @@ main (int argc, char **argv)
   A a;
   hb_invoke (&A::a, a);
 
+  assert (1 == hb_min (3, 8, 1, 2));
+  assert (8 == hb_max (3, 8, 1, 2));
+
+  int x = 1, y = 2;
+  int &z = hb_min (x, y);
+  z = 3;
+  assert (x == 3);
+
   return 0;
 }