Comparing version 0.4.2 to 0.5.0
@@ -16,33 +16,23 @@ /* | ||
exports.Toni = ( function () { | ||
var Bolgia = require( 'bolgia' ) | ||
, abs = Math.abs | ||
var abs = Math.abs | ||
, ceil = Math.ceil | ||
, max = Math.max | ||
, floor = Math.floor | ||
, clone = Bolgia.clone | ||
, improve = Bolgia.improve | ||
// toni default opt | ||
, toni_opt = { | ||
range : 8 | ||
} | ||
// table of powers | ||
, bpower = [ 128, 64, 32, 16, 8, 4, 2, 1 ] | ||
, Toni = function ( opt ) { | ||
, Toni = function ( range ) { | ||
var me = this | ||
, is = me instanceof Toni | ||
; | ||
if ( ! is ) return new Toni( opt ); | ||
var cfg = improve( clone( opt ), toni_opt ) | ||
// limit range to 4 bytes, (32 bits numbers) using >>> 0 | ||
, range = cfg.range = max( abs( + cfg.range ) >>> 0, 8 ) | ||
, bytes = ceil( range / 8 ) | ||
, btable = new Buffer( bytes ) | ||
if ( ! is ) return new Toni( range ); | ||
// limit range to 4 bytes, (32 bits numbers) using >>> 0 | ||
var r = ( abs( + range ) >>> 0 ) || 1 | ||
, bytes = max( ceil( r / 8 ), 1 ) | ||
, bitmap = new Buffer( bytes ) | ||
; | ||
btable.fill( 0x00 ); | ||
me.options = cfg; | ||
me.btable = btable; | ||
me.btlen = bytes << 3 >>> 0; | ||
bitmap.fill( 0x00 ); | ||
me.bitmap = bitmap; | ||
me.bmlen = bytes << 3 >>> 0; | ||
me.items = 0; | ||
me.range = r; | ||
} | ||
@@ -55,3 +45,3 @@ , tproto = Toni.prototype | ||
; | ||
me.btable.fill( 0x00 ); | ||
me.bitmap.fill( 0x00 ); | ||
me.items = 0; | ||
@@ -64,6 +54,7 @@ return me; | ||
, v = abs( value ) | ||
, btable = me.btable | ||
, bitmap = me.bitmap | ||
, range = me.range | ||
; | ||
// check value range | ||
if ( me.btlen <= v ) return -1; | ||
if ( ( me.bmlen <= v ) || ( v >= range ) ) return -1; | ||
/* | ||
@@ -76,5 +67,5 @@ * generally, bucket and mask could be calculated respectively as floor( v / 8 ) | ||
, mask = bpower[ v & 7 ] | ||
, up = mask & btable[ buck ] | ||
, up = mask & bitmap[ buck ] | ||
; | ||
return up ? -1 : ++me.items | ( btable[ buck ] |= mask ); | ||
return up ? -1 : ++me.items | ( bitmap[ buck ] |= mask ); | ||
}; | ||
@@ -85,12 +76,13 @@ | ||
, v = value | ||
, btable = me.btable | ||
, range = me.range | ||
, bitmap = me.bitmap | ||
; | ||
// check value range | ||
if ( me.btlen <= v ) return -1; | ||
if ( ( me.bmlen <= v ) || ( v >= range ) ) return -1; | ||
var buck = v >>> 3 | ||
, mask = bpower[ v & 7 ] | ||
, up = mask & btable[ buck ] | ||
, up = mask & bitmap[ buck ] | ||
; | ||
return up ? --me.items | ( btable[ buck ] ^= mask ) : -1; | ||
return up ? --me.items | ( bitmap[ buck ] ^= mask ) : -1; | ||
}; | ||
@@ -97,0 +89,0 @@ |
{ | ||
"name": "toni" | ||
, "version": "0.4.2" | ||
, "version": "0.5.0" | ||
, "description": "Toni, a simple and efficient bitmap implementation for positive integer sets (max 32 bits), with no element repetition, using bitwise operations and a Buffer. Modifying a single bit instead of an entire byte, obviously saves 87.5% of Buffer space, but it also implies a gain greater than 200% in performances, for accessing values, when it was used with big integer ranges." | ||
@@ -5,0 +5,0 @@ , "homepage": "https://github.com/rootslab/toni" |
@@ -66,19 +66,10 @@ ### Toni | ||
> minimun range is 1 item/bit, max is 2^32 (from 1 to 4 bytes). | ||
```javascript | ||
Toni( [ Object opt ] ) | ||
Toni( Number range ) | ||
// or | ||
new Toni( [ Object opt ] ) | ||
new Toni( Number range ) | ||
``` | ||
####Options | ||
> Default options are listed. | ||
```javascript | ||
opt = { | ||
// minimun range is 8 items/bits (1 byte), max is 2^32 (4 bytes) | ||
range : 8 | ||
} | ||
``` | ||
###Properties | ||
@@ -88,10 +79,10 @@ | ||
/* | ||
* Instance configuration object. | ||
* the bitmap buffer. | ||
*/ | ||
Toni.options : Object | ||
Toni.bitmap : Buffer | ||
/* | ||
* the bitmap buffer. | ||
* max range for values (from 0 to range - 1). | ||
*/ | ||
Toni.btable : Buffer | ||
Toni.range : Number | ||
@@ -106,3 +97,4 @@ /* | ||
*/ | ||
Toni.btlen : Number | ||
Toni.bmlen : Number | ||
``` | ||
@@ -109,0 +101,0 @@ |
@@ -11,5 +11,3 @@ /* | ||
, n = 1024 | ||
, toni = Toni( { | ||
range : n | ||
} ) | ||
, toni = Toni( n ) | ||
, i = 0 | ||
@@ -22,6 +20,6 @@ ; | ||
log( '- fill the entire buffer bitmap, adding %d elements', n ); | ||
for ( ; i < toni.options.range; toni.add( i++ ) ); | ||
for ( ; i < toni.range; toni.add( i++ ) ); | ||
log( '- check if all bytes are equal to %d', 0xff ); | ||
for ( i = 0; i < toni.btable.length; i++ ) assert.equal( toni.btable[ i ], 0xff, 'Something goes wrong with add function!' ); | ||
for ( i = 0; i < toni.bitmap.length; i++ ) assert.equal( toni.bitmap[ i ], 0xff, 'Something goes wrong with add function!' ); | ||
@@ -32,6 +30,6 @@ log( '- check item counter, should be %d', n ); | ||
log( '- try to re-add all elements, it should always return %d', -1 ); | ||
for ( i = 0; i < toni.options.range; ) assert.equal( toni.add( i++ ), -1, 'Something goes wrong with add function' ); | ||
for ( i = 0; i < toni.range; ) assert.equal( toni.add( i++ ), -1, 'Something goes wrong with add function' ); | ||
log( '- check if all bytes are equal to %d', 0xff ); | ||
for ( i = 0; i < toni.btable.length; i++ ) assert.equal( toni.btable[ i ], 0xff, 'Something goes wrong with add function!' ); | ||
for ( i = 0; i < toni.bitmap.length; i++ ) assert.equal( toni.bitmap[ i ], 0xff, 'Something goes wrong with add function!' ); | ||
@@ -42,3 +40,3 @@ log( '- check item counter, should be %d', n ); | ||
log( '- try to add %d elements, out of range (>=%d), it should always return %d', n * 2, n, -1 ); | ||
for ( i = n; i < toni.options.range + n + n; ) assert.equal( toni.add( i++ ), -1, 'Something goes wrong with add function' ); | ||
for ( i = n; i < toni.range + n + n; ) assert.equal( toni.add( i++ ), -1, 'Something goes wrong with add function' ); | ||
@@ -53,3 +51,3 @@ log( '- check item counter, should be %d', n ); | ||
log( '- try to del %d elements, out of range (>=%d), it should always return %d', n * 2, n, -1 ); | ||
for ( i = n; i < toni.options.range + n + n; ) assert.equal( toni.del( i++ ), -1, 'Something goes wrong with del function' ); | ||
for ( i = n; i < toni.range + n + n; ) assert.equal( toni.del( i++ ), -1, 'Something goes wrong with del function' ); | ||
@@ -60,6 +58,6 @@ log( '- check item counter, should be %d', n ); | ||
log( '- empty buffer bitmap, removing %d elements', n ); | ||
for ( i = 0; i < toni.options.range; toni.del( i++ ) ); | ||
for ( i = 0; i < toni.range; toni.del( i++ ) ); | ||
log( '- check if all bytes are equal to %d', 0x00 ); | ||
for ( i = 0; i < toni.btable.length; i++ ) assert.equal( toni.btable[ i ], 0x00, 'Something goes wrong with del function!' ); | ||
for ( i = 0; i < toni.bitmap.length; i++ ) assert.equal( toni.bitmap[ i ], 0x00, 'Something goes wrong with del function!' ); | ||
@@ -70,6 +68,6 @@ log( '- check item counter, should be %d', 0 ); | ||
log( '- try to re-delete all elements, it should always return %d', -1 ); | ||
for ( i = 0; i < toni.options.range; ) assert.equal( toni.del( i++ ), -1, 'Something goes wrong with del function' ); | ||
for ( i = 0; i < toni.range; ) assert.equal( toni.del( i++ ), -1, 'Something goes wrong with del function' ); | ||
log( '- check if all bytes are equal to %d', 0x00 ); | ||
for ( i = 0; i < toni.btable.length; i++ ) assert.equal( toni.btable[ i ], 0x00, 'Something goes wrong with del function!' ); | ||
for ( i = 0; i < toni.bitmap.length; i++ ) assert.equal( toni.bitmap[ i ], 0x00, 'Something goes wrong with del function!' ); | ||
@@ -80,3 +78,3 @@ log( '- check item counter, should be %d', 0 ); | ||
log( '- try to del %d elements, out of range (>=%d), it should always return %d', n * 2, n, -1 ); | ||
for ( i = n; i < toni.options.range + n + n; ) assert.equal( toni.del( i++ ), -1, 'Something goes wrong with del function' ); | ||
for ( i = n; i < toni.range + n + n; ) assert.equal( toni.del( i++ ), -1, 'Something goes wrong with del function' ); | ||
@@ -90,3 +88,3 @@ log( '- check item counter, should be %d', 0 ); | ||
log( '- manually fill entire Buffer with %d\'s', 0x01 ); | ||
toni.btable.fill( 0x01 ); | ||
toni.bitmap.fill( 0x01 ); | ||
@@ -100,3 +98,3 @@ log( '- manually set items to %d', n ); | ||
log( '- bitmap should be empty' ); | ||
for ( i = 0; i < toni.btable.length; i++ ) assert.equal( toni.btable[ i ], 0x00, 'Something goes wrong with clear function!' ); | ||
for ( i = 0; i < toni.bitmap.length; i++ ) assert.equal( toni.bitmap[ i ], 0x00, 'Something goes wrong with clear function!' ); | ||
@@ -103,0 +101,0 @@ log( '- check item property, should be %d', 0 ); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
23295
15
273
148