[HarfBuzz] harfbuzz: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Tue Oct 31 20:03:06 UTC 2017


 src/hb-sort-r.hh |  147 +++++--------------------------------------------------
 1 file changed, 14 insertions(+), 133 deletions(-)

New commits:
commit 0feff4ba7b16501341c575e06b4c98a6e1bd2809
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Oct 31 14:02:32 2017 -0600

    Simplify hb-sort-r.hh
    
    See https://github.com/behdad/harfbuzz/pull/592

diff --git a/src/hb-sort-r.hh b/src/hb-sort-r.hh
index 7458b4bb..b4c3c91d 100644
--- a/src/hb-sort-r.hh
+++ b/src/hb-sort-r.hh
@@ -72,35 +72,15 @@ Parameters:
 void hb_sort_r(void *base, size_t nel, size_t width,
                int (*compar)(const void *_a, const void *_b, void *_arg),
                void *arg);
-
 */
 
-#define _SORT_R_INLINE inline
-
-#if (defined __APPLE__ || defined __MACH__ || defined __DARWIN__ || \
-     defined __FreeBSD__ || defined __DragonFly__)
-#  define _SORT_R_BSD
-#elif (defined _GNU_SOURCE || defined __gnu_hurd__ || defined __GNU__ || \
-       defined __linux__ || defined __MINGW32__ || defined __GLIBC__)
-#  define _SORT_R_LINUX
-#elif (defined _WIN32 || defined _WIN64 || defined __WINDOWS__)
-#  define _SORT_R_WINDOWS
-#  undef _SORT_R_INLINE
-#  define _SORT_R_INLINE __inline
-#else
-  /* Using our own recursive quicksort sort_r_simple() */
-#endif
-
-#if (defined NESTED_QSORT && NESTED_QSORT == 0)
-#  undef NESTED_QSORT
-#endif
 
 /* swap a, b iff a>b */
 /* __restrict is same as restrict but better support on old machines */
-static _SORT_R_INLINE int sort_r_cmpswap(char *__restrict a, char *__restrict b, size_t w,
-                                         int (*compar)(const void *_a, const void *_b,
-                                                       void *_arg),
-                                         void *arg)
+static int sort_r_cmpswap(char *__restrict a, char *__restrict b, size_t w,
+			  int (*compar)(const void *_a, const void *_b,
+					void *_arg),
+			  void *arg)
 {
   char tmp, *end = a+w;
   if(compar(a, b, arg) > 0) {
@@ -110,12 +90,11 @@ static _SORT_R_INLINE int sort_r_cmpswap(char *__restrict a, char *__restrict b,
   return 0;
 }
 
-/* Implement recursive quicksort ourselves */
 /* Note: quicksort is not stable, equivalent values may be swapped */
-static _SORT_R_INLINE void sort_r_simple(void *base, size_t nel, size_t w,
-                                         int (*compar)(const void *_a, const void *_b,
-                                                       void *_arg),
-                                         void *arg)
+static inline void sort_r_simple(void *base, size_t nel, size_t w,
+				 int (*compar)(const void *_a, const void *_b,
+					       void *_arg),
+				 void *arg)
 {
   char *b = (char *)base, *end = b + nel*w;
   if(nel < 7) {
@@ -172,109 +151,11 @@ static _SORT_R_INLINE void sort_r_simple(void *base, size_t nel, size_t w,
   }
 }
 
-
-#if defined NESTED_QSORT
-
-  static _SORT_R_INLINE void hb_sort_r(void *base, size_t nel, size_t width,
-                                       int (*compar)(const void *_a, const void *_b,
-                                                     void *aarg),
-                                       void *arg)
-  {
-    int nested_cmp(const void *a, const void *b)
-    {
-      return compar(a, b, arg);
-    }
-
-    qsort(base, nel, width, nested_cmp);
-  }
-
-#else /* !NESTED_QSORT */
-
-  /* Declare structs and functions */
-
-  #if defined _SORT_R_BSD
-
-    /* Ensure qsort_r is defined */
-    extern void qsort_r(void *base, size_t nel, size_t width, void *thunk,
-                        int (*compar)(void *_thunk, const void *_a, const void *_b));
-
-  #endif
-
-  #if defined _SORT_R_BSD || defined _SORT_R_WINDOWS
-
-    /* BSD (qsort_r), Windows (qsort_s) require argument swap */
-
-    struct sort_r_data
-    {
-      void *arg;
-      int (*compar)(const void *_a, const void *_b, void *_arg);
-    };
-
-    static _SORT_R_INLINE int sort_r_arg_swap(void *s, const void *a, const void *b)
-    {
-      struct sort_r_data *ss = (struct sort_r_data*)s;
-      return (ss->compar)(a, b, ss->arg);
-    }
-
-  #endif
-
-  #if defined _SORT_R_LINUX
-
-#if 0 /* BE: To avoid redeclaration warning. */
-    typedef int(* __compar_d_fn_t)(const void *, const void *, void *);
-    extern void qsort_r(void *base, size_t nel, size_t width,
-                        __compar_d_fn_t __compar, void *arg)
-      __attribute__((nonnull (1, 4)));
-#endif
-
-  #endif
-
-  /* implementation */
-
-  static _SORT_R_INLINE void hb_sort_r(void *base, size_t nel, size_t width,
-                                       int (*compar)(const void *_a, const void *_b, void *_arg),
-                                       void *arg)
-  {
-    #if defined _SORT_R_LINUX
-
-      #if defined __GLIBC__ && ((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 8))
-
-        /* no qsort_r in glibc before 2.8, need to use nested qsort */
-        sort_r_simple(base, nel, width, compar, arg);
-
-      #else
-
-        qsort_r(base, nel, width, compar, arg);
-
-      #endif
-
-    #elif defined _SORT_R_BSD
-
-      struct sort_r_data tmp;
-      tmp.arg = arg;
-      tmp.compar = compar;
-      qsort_r(base, nel, width, &tmp, sort_r_arg_swap);
-
-    #elif defined _SORT_R_WINDOWS
-
-      struct sort_r_data tmp;
-      tmp.arg = arg;
-      tmp.compar = compar;
-      qsort_s(base, nel, width, sort_r_arg_swap, &tmp);
-
-    #else
-
-      /* Fall back to our own quicksort implementation */
-      sort_r_simple(base, nel, width, compar, arg);
-
-    #endif
-  }
-
-#endif /* !NESTED_QSORT */
-
-#undef _SORT_R_INLINE
-#undef _SORT_R_WINDOWS
-#undef _SORT_R_LINUX
-#undef _SORT_R_BSD
+static inline void hb_sort_r(void *base, size_t nel, size_t width,
+			     int (*compar)(const void *_a, const void *_b, void *_arg),
+			     void *arg)
+{
+    sort_r_simple(base, nel, width, compar, arg);
+}
 
 #endif /* HB_SORT_R_HH */


More information about the HarfBuzz mailing list