You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.0 KiB

// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
**********************************************************************
* Copyright (C) 2002-2003, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
#include "layout/LETypes.h"
#include "LXUtilities.h"
U_NAMESPACE_BEGIN
//
// Finds the high bit by binary searching
// through the bits in n.
//
le_int8 LXUtilities::highBit(le_int32 value)
{
if (value <= 0) {
return -32;
}
le_int8 bit = 0;
if (value >= 1 << 16) {
value >>= 16;
bit += 16;
}
if (value >= 1 << 8) {
value >>= 8;
bit += 8;
}
if (value >= 1 << 4) {
value >>= 4;
bit += 4;
}
if (value >= 1 << 2) {
value >>= 2;
bit += 2;
}
if (value >= 1 << 1) {
value >>= 1;
bit += 1;
}
return bit;
}
le_int32 LXUtilities::search(le_int32 value, const le_int32 array[], le_int32 count)
{
le_int32 power = 1 << highBit(count);
le_int32 extra = count - power;
le_int32 probe = power;
le_int32 index = 0;
if (value >= array[extra]) {
index = extra;
}
while (probe > (1 << 0)) {
probe >>= 1;
if (value >= array[index + probe]) {
index += probe;
}
}
return index;
}
void LXUtilities::reverse(le_int32 array[], le_int32 length)
{
le_int32 front, back;
for (front = 0, back = length - 1; front < back; front += 1, back -= 1) {
le_int32 swap = array[front];
array[front] = array[back];
array[back] = swap;
}
}
void LXUtilities::reverse(float array[], le_int32 length)
{
le_int32 front, back;
for (front = 0, back = length - 1; front < back; front += 1, back -= 1) {
float swap = array[front];
array[front] = array[back];
array[back] = swap;
}
}
U_NAMESPACE_END