[meta] Add hb_reference_wrapper<>
authorBehdad Esfahbod <behdad@behdad.org>
Tue, 7 May 2019 07:03:35 +0000 (00:03 -0700)
committerBehdad Esfahbod <behdad@behdad.org>
Tue, 7 May 2019 07:05:31 +0000 (00:05 -0700)
Functionality kinda superset of std:: counterpart.

src/hb-meta.hh

index 52f6866..fc64e97 100644 (file)
@@ -138,6 +138,27 @@ struct
 
 } HB_FUNCOBJ (hb_ref);
 
+template <typename T>
+struct hb_reference_wrapper
+{
+  hb_reference_wrapper (T v) : v (v) {}
+  hb_reference_wrapper (const hb_reference_wrapper& o) : v (o.v) {}
+  bool operator == (const hb_reference_wrapper& o) const { return v == o.v; }
+  bool operator != (const hb_reference_wrapper& o) const { return v != o.v; }
+  T get () const { return v; }
+  T v;
+};
+template <typename T>
+struct hb_reference_wrapper<T&>
+{
+  hb_reference_wrapper (T& v) : v (&v) {}
+  hb_reference_wrapper (const hb_reference_wrapper& o) : v (o.v) {}
+  bool operator == (const hb_reference_wrapper& o) const { return v == o.v; }
+  bool operator != (const hb_reference_wrapper& o) const { return v != o.v; }
+  T* get () const { return v; }
+  T* v;
+};
+
 
 template <bool B, typename T = void> struct hb_enable_if {};
 template <typename T>                struct hb_enable_if<true, T> { typedef T type; };