Home | History | Annotate | Download | only in shadows
      1 package org.robolectric.shadows;
      2 
      3 /**
      4  * Transliteration of native BitSet64.
      5  *
      6  * <p>Unlike the native code stores value inline as opposed to a manipulating data via series of
      7  * static methods passed values by reference.
      8  *
      9  * @see system/core/libutils/include/utils/BitSet.h
     10  */
     11 public class NativeBitSet64 {
     12 
     13   private long value;
     14 
     15   NativeBitSet64(long value) {
     16     this.value = value;
     17   }
     18 
     19   NativeBitSet64(NativeBitSet64 other) {
     20     this.value = other.value;
     21   }
     22 
     23   NativeBitSet64() {
     24     this(0);
     25   }
     26 
     27   /** Gets the value associated with a particular bit index. */
     28   static long valueForBit(int n) {
     29     return 0x8000000000000000L >>> n;
     30   }
     31 
     32   /** Clears the bit set. */
     33   void clear() {
     34     value = 0;
     35   }
     36 
     37   /** Returns the number of marked bits in the set. */
     38   int count() {
     39     int count = 0;
     40     for (int n = 0; n < 64; n++) {
     41       if (hasBit(n)) {
     42         count++;
     43       }
     44     }
     45     return count;
     46   }
     47 
     48   /** Returns true if the bit set does not contain any marked bits. */
     49   boolean isEmpty() {
     50     return value == 0;
     51   }
     52 
     53   /** Returns true if the specified bit is marked. */
     54   boolean hasBit(int n) {
     55     return (value & valueForBit(n)) != 0;
     56   }
     57 
     58   /** Marks the specified bit. */
     59   void markBit(int n) {
     60     value |= valueForBit(n);
     61   }
     62 
     63   /** Clears the specified bit. */
     64   void clearBit(int n) {
     65     value &= ~valueForBit(n);
     66   }
     67 
     68   /** Finds the first marked bit in the set. Result is undefined if all bits are unmarked. */
     69   int firstMarkedBit() {
     70     for (int n = 0; n < 64; n++) {
     71       if (hasBit(n)) {
     72         return n;
     73       }
     74     }
     75     return 0;
     76   }
     77 
     78   /**
     79    * Finds the first marked bit in the set and clears it. Returns the bit index. Result is undefined
     80    * if all bits are unmarked.
     81    */
     82   int clearFirstMarkedBit() {
     83     int n = firstMarkedBit();
     84     clearBit(n);
     85     return n;
     86   }
     87 
     88   /**
     89    * Gets the index of the specified bit in the set, which is the number of marked bits that appear
     90    * before the specified bit.
     91    */
     92   int getIndexOfBit(int n) {
     93     // return __builtin_popcountll(value & ~(0xffffffffffffffffULL >> n));
     94     int numMarkedBits = 0;
     95     for (int i = 0; i < n; i++) {
     96       if (hasBit(i)) {
     97         numMarkedBits++;
     98       }
     99     }
    100     return numMarkedBits;
    101   }
    102 
    103   public void setValue(long l) {
    104     value = l;
    105   }
    106 
    107   public long getValue() {
    108     return value;
    109   }
    110 }
    111