1// Copyright (C) 2016 and later: Unicode, Inc. and others. 2// License & terms of use: http://www.unicode.org/copyright.html 3/* 4 ********************************************************************** 5 * Copyright (C) 2002-2003, International Business Machines 6 * Corporation and others. All Rights Reserved. 7 ********************************************************************** 8 */ 9 10#include "layout/LETypes.h" 11#include "LXUtilities.h" 12 13U_NAMESPACE_BEGIN 14 15// 16// Finds the high bit by binary searching 17// through the bits in n. 18// 19le_int8 LXUtilities::highBit(le_int32 value) 20{ 21 if (value <= 0) { 22 return -32; 23 } 24 25 le_int8 bit = 0; 26 27 if (value >= 1 << 16) { 28 value >>= 16; 29 bit += 16; 30 } 31 32 if (value >= 1 << 8) { 33 value >>= 8; 34 bit += 8; 35 } 36 37 if (value >= 1 << 4) { 38 value >>= 4; 39 bit += 4; 40 } 41 42 if (value >= 1 << 2) { 43 value >>= 2; 44 bit += 2; 45 } 46 47 if (value >= 1 << 1) { 48 value >>= 1; 49 bit += 1; 50 } 51 52 return bit; 53} 54 55le_int32 LXUtilities::search(le_int32 value, const le_int32 array[], le_int32 count) 56{ 57 le_int32 power = 1 << highBit(count); 58 le_int32 extra = count - power; 59 le_int32 probe = power; 60 le_int32 index = 0; 61 62 if (value >= array[extra]) { 63 index = extra; 64 } 65 66 while (probe > (1 << 0)) { 67 probe >>= 1; 68 69 if (value >= array[index + probe]) { 70 index += probe; 71 } 72 } 73 74 return index; 75} 76 77void LXUtilities::reverse(le_int32 array[], le_int32 length) 78{ 79 le_int32 front, back; 80 81 for (front = 0, back = length - 1; front < back; front += 1, back -= 1) { 82 le_int32 swap = array[front]; 83 84 array[front] = array[back]; 85 array[back] = swap; 86 } 87} 88 89void LXUtilities::reverse(float array[], le_int32 length) 90{ 91 le_int32 front, back; 92 93 for (front = 0, back = length - 1; front < back; front += 1, back -= 1) { 94 float swap = array[front]; 95 96 array[front] = array[back]; 97 array[back] = swap; 98 } 99} 100 101U_NAMESPACE_END 102