X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=XS.xs;h=bc8d89005e655c4a2187b2aaa8a0b95d8c2437b3;hb=02b65a500f8dd89caf2b13ae066dbb4b7e1b5e3c;hp=3e6c839e892099d38902dbf91c1c70fe5c8c522c;hpb=2b47d13cc3268a21ebe79ead99ad55dd902d6003;p=algorithm-bit-xs.git diff --git a/XS.xs b/XS.xs index 3e6c839..bc8d890 100644 --- a/XS.xs +++ b/XS.xs @@ -5,6 +5,11 @@ #include "ppport.h" +#define CHECK_INDEX(idx, min, max, ret) if(idx < min || idx > max) { \ + croak("Index not in range [" IVdf "," IVdf "]", (IV)(min), (IV)(max)); \ + return ret; \ + } + typedef struct { IV n; IV* t; @@ -29,10 +34,7 @@ void bit_free(bit *b) { } IV bit_query(bit *b, IV idx) { - if(idx > b->n || idx < 1){ - croak("Index not in range [1," IVdf "]", b->n); - return 0; - } + CHECK_INDEX(idx, 0, b->n - 1, 0); IV ret = 0; while(idx) ret += b->t[idx], idx -= idx & -idx; @@ -40,10 +42,7 @@ IV bit_query(bit *b, IV idx) { } void bit_update(bit *b, IV idx, IV value) { - if(idx > b->n || idx < 1){ - croak("Index not in range [1," IVdf "]", b->n); - return; - } + CHECK_INDEX(idx, 0, b->n - 1, ); while(idx < b->n) b->t[idx] += value, idx += idx & -idx; } @@ -77,6 +76,8 @@ void bit2d_free(bit2d *b) { } IV bit2d_query(bit2d *b, IV i1, IV i2) { + CHECK_INDEX(i1, 1, b->n - 1, 0); + CHECK_INDEX(i2, 1, b->m - 1, 0); if(i1 > b->n || i1 < 1) { croak("Index 1 not in range [1," IVdf "]", b->n); return 0; @@ -96,14 +97,8 @@ IV bit2d_query(bit2d *b, IV i1, IV i2) { } void bit2d_update(bit2d *b, IV i1, IV i2, IV value) { - if(i1 > b->n || i1 < 1) { - croak("Index 1 not in range [1," IVdf "]", b->n); - return; - } - if(i2 > b->m || i2 < 1) { - croak("Index 2 not in range [1," IVdf "]", b->m); - return; - } + CHECK_INDEX(i1, 1, b->n - 1, ); + CHECK_INDEX(i2, 1, b->m - 1, ); IV i2c = i2; while(i1 < b->n) { i2 = i2c;