Imported Upstream version 58.2
[platform/upstream/icu.git] / source / layoutex / LXUtilities.cpp
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
13 U_NAMESPACE_BEGIN
14
15 //
16 // Finds the high bit by binary searching
17 // through the bits in n.
18 //
19 le_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
55 le_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
77 void 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
89 void 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
101 U_NAMESPACE_END