Home | History | Annotate | Download | only in layoutex
      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
    100