Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 
     19 #ifndef BOOL_ARRAY_H
     20 #define BOOL_ARRAY_H
     21 
     22 #include "oscl_base.h"
     23 
     24 template <uint32 max_array_size> class BoolArray
     25 {
     26 
     27     private:
     28 
     29         static uint32 mask_array[33];
     30 
     31 
     32 
     33     public:
     34 
     35         BoolArray()
     36         {
     37             size = max_array_size;
     38             elements = (max_array_size + 31) / 32;
     39         };
     40 
     41         ~BoolArray() {};
     42 
     43 
     44         bool set_size(int in_size)
     45         {
     46             if (size <= 0 || size > (int) max_array_size)
     47             {
     48                 return false;
     49             }
     50             size = in_size;
     51             return true;
     52         };
     53 
     54 
     55         bool set_range(bool value, int first_index = 0, int last_index = -1)
     56         {
     57             if (last_index < 0)
     58             {
     59                 last_index = size - 1;
     60             };
     61             if (first_index < 0 || first_index > last_index || last_index >= size)
     62             {
     63                 return false;
     64             }
     65 
     66 
     67             static const uint32 mask_array[33] =
     68             {
     69                 0, 0x1, 0x3, 0x7,
     70                 0xF, 0x1F, 0x3F, 0x7F,
     71                 0xFF, 0x1FF, 0x3FF, 0x7FF,
     72                 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF,
     73                 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF,
     74                 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF,
     75                 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF,
     76                 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF,
     77                 0xFFFFFFFF
     78             };
     79 
     80 
     81             int starting_word = first_index / 32;
     82             int ending_word = (last_index) / 32;
     83 
     84             for (int ii = starting_word; ii <= ending_word; ++ii)
     85             {
     86 
     87                 if (ii == ending_word)
     88                 {
     89                     // compute the word offset
     90                     int word_index = (last_index % 32) + 1;
     91                     uint32 mask = mask_array[word_index];
     92                     if (value)
     93                     {
     94                         array[ii] |= (mask);
     95                     }
     96                     else
     97                     {
     98                         array[ii] &= (~mask);
     99                     }
    100                 }
    101                 else if (ii == starting_word)
    102                 {
    103                     // compute the word offset
    104                     int word_index = first_index % 32;
    105                     uint32 mask = mask_array[word_index];
    106                     if (value)
    107                     {
    108                         array[ii] |= (~mask);
    109                     }
    110                     else
    111                     {
    112                         array[ii] &= (mask);
    113                     }
    114 
    115                 }
    116                 else
    117                 {
    118                     uint32 mask = mask_array[32];
    119                     if (value)
    120                     {
    121                         array[ii] |= (mask);
    122                     }
    123                     else
    124                     {
    125                         array[ii] &= (~mask);
    126                     }
    127 
    128                 }
    129 
    130             }
    131             return true;
    132         }
    133 
    134         bool set_value(int index, bool value)
    135         {
    136 
    137             if (index < 0 || index >= size)
    138             {
    139                 return false;
    140             }
    141 
    142             int array_index = (index) / 32;
    143             int word_index = index % 32;
    144             uint32 mask = 1 << word_index;
    145 
    146             if (value)
    147             {
    148                 array[array_index] |= mask;
    149             }
    150             else
    151             {
    152                 array[array_index] &= (~mask);
    153             }
    154 
    155             return true;
    156         }
    157 
    158 
    159         bool get_value(int index) const
    160         {
    161             if (index < 0 || index >= size)
    162             {
    163                 return false;
    164             }
    165 
    166             int array_index = (index) / 32;
    167             int word_index = index % 32;
    168             uint32 mask = 1 << word_index;
    169 
    170             return ((array[array_index] & mask) != 0);
    171         }
    172 
    173 
    174 
    175 
    176 
    177         bool operator[](int index) const
    178         {
    179             return get_value(index);
    180         };
    181 
    182     private:
    183         int size;
    184         int elements;
    185         uint32 array[(max_array_size+31)/32];
    186 
    187 };
    188 
    189 
    190 
    191 
    192 
    193 
    194 #endif
    195