You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2013/02/13 23:54:37 UTC

svn commit: r1445967 - in /subversion/trunk/subversion: include/svn_sorts.h libsvn_subr/mergeinfo.c libsvn_subr/sorts.c

Author: julianfoad
Date: Wed Feb 13 22:54:37 2013
New Revision: 1445967

URL: http://svn.apache.org/r1445967
Log:
Introduce svn_sort__array_reverse(), and use it in svn_rangelist_reverse()
which should now be more efficient because it was previously swapping the
pointed-to structures rather than just the pointers.

* subversion/include/svn_sorts.h,
  subversion/libsvn_subr/sorts.c
  (svn_sort__array_reverse): New function.

* subversion/libsvn_subr/mergeinfo.c
  (svn_rangelist_reverse): Use it.

Modified:
    subversion/trunk/subversion/include/svn_sorts.h
    subversion/trunk/subversion/libsvn_subr/mergeinfo.c
    subversion/trunk/subversion/libsvn_subr/sorts.c

Modified: subversion/trunk/subversion/include/svn_sorts.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_sorts.h?rev=1445967&r1=1445966&r2=1445967&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_sorts.h (original)
+++ subversion/trunk/subversion/include/svn_sorts.h Wed Feb 13 22:54:37 2013
@@ -208,6 +208,16 @@ svn_sort__array_delete(apr_array_header_
                        int delete_index,
                        int elements_to_delete);
 
+/* Reverse the order of elements in @a array, in place.  The elements of
+ * @a array shall be pointers.
+ *
+ * Non-pointer elements could be supported in future.  The @a scratch_pool
+ * is currently unused but could be used in future.
+ */
+void
+svn_sort__array_reverse(apr_array_header_t *array,
+                        apr_pool_t *scratch_pool);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/trunk/subversion/libsvn_subr/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/mergeinfo.c?rev=1445967&r1=1445966&r2=1445967&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/mergeinfo.c (original)
+++ subversion/trunk/subversion/libsvn_subr/mergeinfo.c Wed Feb 13 22:54:37 2013
@@ -1201,26 +1201,15 @@ range_swap_endpoints(svn_merge_range_t *
 svn_error_t *
 svn_rangelist_reverse(svn_rangelist_t *rangelist, apr_pool_t *pool)
 {
-  int i, swap_index;
-  svn_merge_range_t range;
-  for (i = 0; i < rangelist->nelts / 2; i++)
-    {
-      swap_index = rangelist->nelts - i - 1;
-      range = *APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *);
-      *APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *) =
-        *APR_ARRAY_IDX(rangelist, swap_index, svn_merge_range_t *);
-      *APR_ARRAY_IDX(rangelist, swap_index, svn_merge_range_t *) = range;
-      range_swap_endpoints(APR_ARRAY_IDX(rangelist, swap_index,
-                                         svn_merge_range_t *));
+  int i;
+
+  svn_sort__array_reverse(rangelist, pool);
+
+  for (i = 0; i < rangelist->nelts; i++)
+    {
       range_swap_endpoints(APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *));
     }
 
-  /* If there's an odd number of elements, we still need to swap the
-     end points of the remaining range. */
-  if (rangelist->nelts % 2 == 1)
-    range_swap_endpoints(APR_ARRAY_IDX(rangelist, rangelist->nelts / 2,
-                                       svn_merge_range_t *));
-
   return SVN_NO_ERROR;
 }
 

Modified: subversion/trunk/subversion/libsvn_subr/sorts.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sorts.c?rev=1445967&r1=1445966&r2=1445967&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sorts.c (original)
+++ subversion/trunk/subversion/libsvn_subr/sorts.c Wed Feb 13 22:54:37 2013
@@ -270,3 +270,22 @@ svn_sort__array_delete(apr_array_header_
       arr->nelts -= elements_to_delete;
     }
 }
+
+void
+svn_sort__array_reverse(apr_array_header_t *array,
+                        apr_pool_t *scratch_pool)
+{
+  int i;
+
+  assert(array->elt_size == sizeof(void *));
+
+  for (i = 0; i < array->nelts / 2; i++)
+    {
+      int swap_index = array->nelts - i - 1;
+      void *tmp = APR_ARRAY_IDX(array, i, void *);
+
+      APR_ARRAY_IDX(array, i, void *) =
+        APR_ARRAY_IDX(array, swap_index, void *);
+      APR_ARRAY_IDX(array, swap_index, void *) = tmp;
+    }
+}