/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

// Generic unstable sorting routines.

#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SORT_H_
#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SORT_H_

#include "webrtc/common_types.h"
#include "webrtc/typedefs.h"

namespace webrtc {

enum Type {
  TYPE_Word8,
  TYPE_UWord8,
  TYPE_Word16,
  TYPE_UWord16,
  TYPE_Word32,
  TYPE_UWord32,
  TYPE_Word64,
  TYPE_UWord64,
  TYPE_Float32,
  TYPE_Float64
};

// Sorts intrinsic data types.
//
// data            [in/out] A pointer to an array of intrinsic type.
//                 Upon return it will be sorted in ascending order.
// num_of_elements The number of elements in the array.
// data_type       Enum corresponding to the type of the array.
//
// returns 0 on success, -1 on failure.
WebRtc_Word32 Sort(void* data, WebRtc_UWord32 num_of_elements, Type data_type);

// Sorts arbitrary data types. This requires an array of intrinsically typed
// key values which will be used to sort the data array. There must be a
// one-to-one correspondence between data elements and key elements, with
// corresponding elements sharing the same position in their respective
// arrays.
//
// data            [in/out] A pointer to an array of arbitrary type.
//                 Upon return it will be sorted in ascending order.
// key             [in] A pointer to an array of keys used to sort the
//                 data array.
// num_of_elements The number of elements in the arrays.
// size_of_element The size, in bytes, of the data array.
// key_type        Enum corresponding to the type of the key array.
//
// returns 0 on success, -1 on failure.
//
WebRtc_Word32 KeySort(void* data, void* key, WebRtc_UWord32 num_of_elements,
                      WebRtc_UWord32 size_of_element, Type key_type);

}  // namespace webrtc

#endif  // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SORT_H_
