dynamicArray

general purpose dynamic array for one element type
git clone https://noulin.net/git/dynamicArray.git
Log | Files | Refs | README | LICENSE

libdarray.c (910B)


      1 
      2 #include "libdarray.h"
      3 
      4 bool dArrayIsValidIndex(intmax_t index) {
      5     if (index >= ((intmax_t)1)<<dArrayAddrSpace) {
      6         return false;
      7     }
      8     return true;
      9 }
     10 
     11 dArrayIxt dArrayIndex(intmax_t index) {
     12     dArrayIxt r;
     13     if (index >= ((intmax_t)1)<<dArrayAddrSpace) {
     14         r.error = true;
     15         return r;
     16     }
     17     r.error = false;
     18 
     19     intmax_t bufx = index >> dArrayBaseBits;
     20     if (!bufx) {
     21         r.ix     = 0;
     22         r.offset = index;
     23     }
     24     else {
     25         //int pos = 0;
     26         /* for (int i = (bufx >> 1); i != 0; pos++) { */
     27         /*     i >>= 1; */
     28         /* } */
     29         /* find position of MSB */
     30 #if __LP64__
     31         asm ("bsrq %1, %0" : "=r" (r.ix) : "r" (bufx));
     32 #else
     33         asm ("bsrl %1, %0" : "=r" (r.ix) : "r" (bufx));
     34 #endif
     35         intmax_t mask = ~(0xFFFFFFFFFFFFFFFF << (dArrayBaseBits+r.ix));
     36         r.ix++;
     37         r.offset = index & mask;
     38     }
     39     return r;
     40 }