[HarfBuzz] harfbuzz: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Sun Oct 15 20:11:06 UTC 2017


 src/hb-set-private.hh |   64 +++++++++++++++++++++++++++++++++++---------------
 1 file changed, 45 insertions(+), 19 deletions(-)

New commits:
commit f8a0ec50e23264fdfe9e3a5a2e0453a87f415b3d
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sun Oct 15 16:10:35 2017 -0400

    [set] Add fallback implementation of int-vector type

diff --git a/src/hb-set-private.hh b/src/hb-set-private.hh
index cd795bc5..227a5507 100644
--- a/src/hb-set-private.hh
+++ b/src/hb-set-private.hh
@@ -35,31 +35,64 @@
  * hb_set_t
  */
 
-struct Union
+struct HbOpOr
 {
   static const bool passthru_left = true;
   static const bool passthru_right = true;
   template <typename T> static void process (T &o, const T &a, const T &b) { o = a | b; }
 };
-struct Intersect
+struct HbOpAnd
 {
   static const bool passthru_left = false;
   static const bool passthru_right = false;
   template <typename T> static void process (T &o, const T &a, const T &b) { o = a & b; }
 };
-struct Subtract
+struct HbOpMinus
 {
   static const bool passthru_left = true;
   static const bool passthru_right = false;
   template <typename T> static void process (T &o, const T &a, const T &b) { o = a & ~b; }
 };
-struct SymmetricDifference
+struct HbOpXor
 {
   static const bool passthru_left = true;
   static const bool passthru_right = true;
   template <typename T> static void process (T &o, const T &a, const T &b) { o = a ^ b; }
 };
 
+template <typename elt_t, unsigned int byte_size>
+struct vector_like_t
+{
+  elt_t& operator [] (unsigned int i) { return v[i]; }
+  const elt_t& operator [] (unsigned int i) const { return v[i]; }
+
+  template <class Op>
+  inline vector_like_t process (const vector_like_t &o) const
+  {
+    vector_like_t r;
+    for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
+      Op::process (r.v[i], v[i], o.v[i]);
+    return r;
+  }
+  inline vector_like_t operator | (const vector_like_t &o) const
+  { return process<HbOpOr> (o); }
+  inline vector_like_t operator & (const vector_like_t &o) const
+  { return process<HbOpAnd> (o); }
+  inline vector_like_t operator ^ (const vector_like_t &o) const
+  { return process<HbOpXor> (o); }
+  inline vector_like_t operator ~ () const
+  {
+    vector_like_t r;
+    for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
+      r.v[i] = ~v[i];
+    return r;
+  }
+
+  private:
+  static_assert (byte_size / sizeof (elt_t) * sizeof (elt_t) == byte_size);
+  elt_t v[byte_size / sizeof (elt_t)];
+};
+
 struct hb_set_t
 {
   struct page_map_t
@@ -156,22 +189,15 @@ struct hb_set_t
       return 0;
     }
 
-    typedef uint64_t elt_t;
-
     static const unsigned int PAGE_BITS = 512; /* Use to tune. */
     static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, "");
 
-#if 1
+    typedef uint64_t elt_t;
+
+#if 0
     typedef elt_t vector_t __attribute__((vector_size (PAGE_BITS / 8)));
 #else
-  struct vector_t
-    {
-      elt_t& operator [] (unsigned int i) { return v[i]; }
-      const elt_t& operator [] (unsigned int i) const { return v[i]; }
-
-      private:
-      elt_t v[PAGE_BITS / (sizeof (elt_t) * 8)];
-    };
+    typedef vector_like_t<elt_t, PAGE_BITS / 8> vector_t;
 #endif
 
     vector_t v;
@@ -383,19 +409,19 @@ struct hb_set_t
 
   inline void union_ (const hb_set_t *other)
   {
-    process<Union> (other);
+    process<HbOpOr> (other);
   }
   inline void intersect (const hb_set_t *other)
   {
-    process<Intersect> (other);
+    process<HbOpAnd> (other);
   }
   inline void subtract (const hb_set_t *other)
   {
-    process<Subtract> (other);
+    process<HbOpMinus> (other);
   }
   inline void symmetric_difference (const hb_set_t *other)
   {
-    process<SymmetricDifference> (other);
+    process<HbOpXor> (other);
   }
   inline bool next (hb_codepoint_t *codepoint) const
   {


More information about the HarfBuzz mailing list