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