[array] Simplify copy assignment/constructor
authorBehdad Esfahbod <behdad@behdad.org>
Thu, 18 Apr 2019 14:04:10 +0000 (10:04 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 18 Apr 2019 14:04:10 +0000 (10:04 -0400)
To fix bogus MSVC warnings:

  c:\projects\harfbuzz\src\hb-array.hh(189): warning C4521: 'hb_array_t<Type>': multiple copy constructors specified [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
  c:\projects\harfbuzz\src\hb-array.hh(189): warning C4522: 'hb_array_t<Type>': multiple assignment operators specified [C:\projects\harfbuzz\build\harfbuzz.vcxproj]

src/hb-array.hh

index 74b6757..ee34dd5 100644 (file)
@@ -43,20 +43,29 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
    * Constructors.
    */
   hb_array_t () : arrayZ (nullptr), length (0) {}
-  hb_array_t (const hb_array_t<Type> &o) :
-    hb_iter_with_fallback_t<hb_array_t<Type>, Type&> (),
-    arrayZ (o.arrayZ), length (o.length) {}
-  template <typename U = Type, hb_enable_if (hb_is_const (U))>
-  hb_array_t (const hb_array_t<hb_remove_const<Type> > &o) : arrayZ (o.arrayZ), length (o.length) {}
-
   hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
   template <unsigned int length_> hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {}
 
-  template <typename U = Type, hb_enable_if (hb_is_const (U))>
-  hb_array_t& operator = (const hb_array_t<hb_remove_const<Type> > &o)
-  { arrayZ = o.arrayZ; length = o.length; return *this; }
-  hb_array_t& operator = (const hb_array_t &o)
+  template <typename U,
+           hb_enable_if (
+             hb_is_same (Type, U) ||
+             hb_is_same (hb_remove_const<Type>, U) ||
+             hb_is_same (Type, hb_remove_reference<U>) ||
+             hb_is_same (hb_remove_const<Type>, hb_remove_reference<U>)
+           )>
+  hb_array_t (const hb_array_t<U> &o) :
+    hb_iter_with_fallback_t<hb_array_t<Type>, Type&> (),
+    arrayZ (o.arrayZ), length (o.length) {}
+  template <typename U,
+           hb_enable_if (
+             hb_is_same (Type, U) ||
+             hb_is_same (hb_remove_const<Type>, U) ||
+             hb_is_same (Type, hb_remove_reference<U>) ||
+             hb_is_same (hb_remove_const<Type>, hb_remove_reference<U>)
+           )>
+  hb_array_t& operator = (const hb_array_t<U> &o)
   { arrayZ = o.arrayZ; length = o.length; return *this; }
+
   /*
    * Iterator implementation.
    */