/*
 * svn_sorts.h :  all sorts of sorts.
 *
 * ====================================================================
 * Copyright (c) 2000-2002 CollabNet.  All rights reserved.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution.  The terms
 * are also available at http://subversion.tigris.org/license-1.html.
 * If newer versions of this license are posted there, you may use a
 * newer version instead, at your option.
 *
 * This software consists of voluntary contributions made by many
 * individuals.  For exact contribution history, see the revision
 * history and logs, available at http://subversion.tigris.org/.
 * ====================================================================
 */




#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#ifndef SVN_SORTS_H
#define SVN_SORTS_H

#include <apr_pools.h>
#include <apr_tables.h>         /* for apr_array_header_t */
#include <apr_hash.h>
#include <apr_file_io.h>




/* This structure is used to hold a key/value from a hash table */
typedef struct {
  const void *key;      /* pointer to the key */
  apr_ssize_t klen;     /* size of the key */

  void *value;          /* pointer to the value */
} svn_item_t;


/* Compare two svn_stringbuf_t's, returning an integer greater than,
 * equal to, or less than 0, according as A is greater than, equal to,
 * or less than B.
 *
 * You can use this to do an in-place sort of an apr_array_header_t
 * HDR of svn_stringbuf_t's like so:
 * 
 *   qsort (HDR->elts, HDR->nelts, HDR->elt_size,
 *          svn_path_compare_strings_as_paths);
 */
int svn_sort_compare_strings_as_paths (const void *a, const void *b);


/* Compare two svn_item_t's, returning an integer greater than,
 * equal to, or less than 0, according as A is greater than, equal to,
 * or less than B.
 * 
 * This is useful for converting a hash into a sorted
 * apr_array_header_t.  For example, to convert hash HSH to a sorted
 * array, do this:
 * 
 *   apr_array_header_t *HDR;
 *   HDR = apr_hash_sorted_keys (HSH, svn_sort_compare_items_as_paths, pool);
 */
int svn_sort_compare_items_as_paths (const svn_item_t *a, const svn_item_t *b);


/* Compare two svn_revnum_t's, returning an integer greater than, equal
 * to, or less than 0, according as B is greater than, equal to, or less
 * than A. Note that this sorts newest revsion to oldest (IOW, descending
 * order).
 *
 * This is useful for converting an array of revisions into a sorted
 * apr_array_header_t. You are responsible for detecting, preventing or
 * removing duplicates.
 */
int svn_sort_compare_revisions (const void *a, const void *b);


#ifndef apr_hash_sorted_keys
/* Sort HT according to its keys, return an apr_array_header_t
   containing svn_item_t structures holding those keys and values
   (i.e. for each svn_item_t ITEM in the returned array, ITEM->key
   and is the ITEM->size are the hash key, and ITEM->data points to
   the hash value).

   Storage is shared with the original hash, not copied.

   COMPARISON_FUNC should take two svn_item_t's and return an integer
   greater than, equal to, or less than 0, according as the first item
   is greater than, equal to, or less than the second.

   NOTE:
   This function and the svn_item_t should go over to APR. Got a Round Tuit?
*/
apr_array_header_t *
apr_hash_sorted_keys (apr_hash_t *ht,
                      int (*comparison_func) (const svn_item_t *,
                                              const svn_item_t *),
                      apr_pool_t *pool);
#endif /* apr_hash_sorted_keys */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* SVN_SORTS_H */

/* ----------------------------------------------------------------
 * local variables:
 * eval: (load-file "../../tools/dev/svn-dev.el")
 * end:
 */
