bit-twiddle 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/bit_twiddle/bit_twiddle.c +26 -92
- data/ext/bit_twiddle/extconf.rb +3 -1
- data/ext/bit_twiddle/ruby23/bt_bignum.h +52 -0
- data/lib/bit_twiddle.so +0 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c493212409e8f17cb33cdaa7b6432b0af607380
|
4
|
+
data.tar.gz: bb92c9458d0acc157d2ae8ba8b81b9275b805f96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f038490f6680cf2a0dcce2c495b06750437878e7a076721629c7318da76ebffaecef28006e33ec1b62d76c459e1e45fbf06c4736d1231c9805136e00b56ac23
|
7
|
+
data.tar.gz: f1ce36353a33855ca3b4b424f25e5554d2df3e0550ba6837450b23b4ba0ae8b8197e4dc57cc91975260d7b371f4790b7cfa7ac6922881e1e143102be6c0417dd
|
@@ -1,3 +1,6 @@
|
|
1
|
+
/* Fast C implementation of additional bitwise operations for Ruby
|
2
|
+
* Hand-crafted with ♥ by Alex Dowad, using ONLY the finest 1s and 0s */
|
3
|
+
|
1
4
|
#include <ruby.h>
|
2
5
|
#include "bt_bignum.h"
|
3
6
|
|
@@ -1291,9 +1294,24 @@ bnum_bitreverse64(VALUE bnum)
|
|
1291
1294
|
return modify_lo64_in_bignum(bnum, reverse64(load_64_from_bignum(bnum)));
|
1292
1295
|
}
|
1293
1296
|
|
1297
|
+
/* Document-class: Fixnum
|
1298
|
+
* Ruby's good old Fixnum.
|
1299
|
+
*
|
1300
|
+
* `require "bit-twiddle/core_ext"` before trying to use any of the below methods.
|
1301
|
+
*/
|
1302
|
+
/* Document-class: Bignum
|
1303
|
+
* Ruby's good old Bignum.
|
1304
|
+
*
|
1305
|
+
* `require "bit-twiddle/core_ext"` before trying to use any of the below methods.
|
1306
|
+
*/
|
1307
|
+
/* Document-class: String
|
1308
|
+
* Ruby's good old String.
|
1309
|
+
*
|
1310
|
+
* `require "bit-twiddle/core_ext"` before trying to use any of the below methods.
|
1311
|
+
*/
|
1312
|
+
|
1294
1313
|
/* Add all `bit-twiddle` methods directly to `Fixnum` and `Bignum`. */
|
1295
|
-
static
|
1296
|
-
bt_add_core_extensions(VALUE self)
|
1314
|
+
static void init_core_extensions()
|
1297
1315
|
{
|
1298
1316
|
rb_define_method(rb_cFixnum, "popcount", fnum_popcount, 0);
|
1299
1317
|
rb_define_method(rb_cBignum, "popcount", bnum_popcount, 0);
|
@@ -1364,7 +1382,13 @@ bt_add_core_extensions(VALUE self)
|
|
1364
1382
|
rb_define_method(rb_cBignum, "bitreverse32", bnum_bitreverse32, 0);
|
1365
1383
|
rb_define_method(rb_cFixnum, "bitreverse64", fnum_bitreverse64, 0);
|
1366
1384
|
rb_define_method(rb_cBignum, "bitreverse64", bnum_bitreverse64, 0);
|
1385
|
+
}
|
1367
1386
|
|
1387
|
+
static VALUE
|
1388
|
+
bt_add_core_extensions(VALUE self)
|
1389
|
+
{
|
1390
|
+
/* this is so Yardoc can find method definitions */
|
1391
|
+
init_core_extensions();
|
1368
1392
|
return Qnil;
|
1369
1393
|
}
|
1370
1394
|
|
@@ -1421,21 +1445,6 @@ def_wrapper(bitreverse16);
|
|
1421
1445
|
def_wrapper(bitreverse32);
|
1422
1446
|
def_wrapper(bitreverse64);
|
1423
1447
|
|
1424
|
-
/* Document-class: Fixnum
|
1425
|
-
* Ruby's good old Fixnum.
|
1426
|
-
*
|
1427
|
-
* `require "bit-twiddle/core_ext"` before trying to use any of the below methods.
|
1428
|
-
*/
|
1429
|
-
/* Document-class: Bignum
|
1430
|
-
* Ruby's good old Bignum.
|
1431
|
-
*
|
1432
|
-
* `require "bit-twiddle/core_ext"` before trying to use any of the below methods.
|
1433
|
-
*/
|
1434
|
-
/* Document-class: String
|
1435
|
-
* Ruby's good old String.
|
1436
|
-
*
|
1437
|
-
* `require "bit-twiddle/core_ext"` before trying to use any of the below methods.
|
1438
|
-
*/
|
1439
1448
|
void Init_bit_twiddle(void)
|
1440
1449
|
{
|
1441
1450
|
VALUE rb_mBitTwiddle = rb_define_module("BitTwiddle");
|
@@ -1848,79 +1857,4 @@ void Init_bit_twiddle(void)
|
|
1848
1857
|
* @return [Integer]
|
1849
1858
|
*/
|
1850
1859
|
rb_define_singleton_method(rb_mBitTwiddle, "bitreverse64", bt_bitreverse64, 1);
|
1851
|
-
|
1852
|
-
#if 0
|
1853
|
-
/* The following definitions are executed only on BitTwiddle.add_core_extensions
|
1854
|
-
* This is a hack for Yardoc -- so Yardoc can find them: */
|
1855
|
-
|
1856
|
-
rb_define_method(rb_cFixnum, "popcount", fnum_popcount, 0);
|
1857
|
-
rb_define_method(rb_cBignum, "popcount", bnum_popcount, 0);
|
1858
|
-
rb_define_method(rb_cString, "popcount", str_popcount, 0);
|
1859
|
-
|
1860
|
-
rb_define_method(rb_cFixnum, "lo_bit", fnum_lo_bit, 0);
|
1861
|
-
rb_define_method(rb_cBignum, "lo_bit", bnum_lo_bit, 0);
|
1862
|
-
rb_define_method(rb_cFixnum, "hi_bit", fnum_hi_bit, 0);
|
1863
|
-
rb_define_method(rb_cBignum, "hi_bit", bnum_hi_bit, 0);
|
1864
|
-
|
1865
|
-
rb_define_method(rb_cFixnum, "bswap16", fnum_bswap16, 0);
|
1866
|
-
rb_define_method(rb_cBignum, "bswap16", bnum_bswap16, 0);
|
1867
|
-
rb_define_method(rb_cFixnum, "bswap32", fnum_bswap32, 0);
|
1868
|
-
rb_define_method(rb_cBignum, "bswap32", bnum_bswap32, 0);
|
1869
|
-
rb_define_method(rb_cFixnum, "bswap64", fnum_bswap64, 0);
|
1870
|
-
rb_define_method(rb_cBignum, "bswap64", bnum_bswap64, 0);
|
1871
|
-
|
1872
|
-
rb_define_method(rb_cFixnum, "rrot8", fnum_rrot8, 1);
|
1873
|
-
rb_define_method(rb_cBignum, "rrot8", bnum_rrot8, 1);
|
1874
|
-
rb_define_method(rb_cFixnum, "rrot16", fnum_rrot16, 1);
|
1875
|
-
rb_define_method(rb_cBignum, "rrot16", bnum_rrot16, 1);
|
1876
|
-
rb_define_method(rb_cFixnum, "rrot32", fnum_rrot32, 1);
|
1877
|
-
rb_define_method(rb_cBignum, "rrot32", bnum_rrot32, 1);
|
1878
|
-
rb_define_method(rb_cFixnum, "rrot64", fnum_rrot64, 1);
|
1879
|
-
rb_define_method(rb_cBignum, "rrot64", bnum_rrot64, 1);
|
1880
|
-
|
1881
|
-
rb_define_method(rb_cFixnum, "lrot8", fnum_lrot8, 1);
|
1882
|
-
rb_define_method(rb_cBignum, "lrot8", bnum_lrot8, 1);
|
1883
|
-
rb_define_method(rb_cFixnum, "lrot16", fnum_lrot16, 1);
|
1884
|
-
rb_define_method(rb_cBignum, "lrot16", bnum_lrot16, 1);
|
1885
|
-
rb_define_method(rb_cFixnum, "lrot32", fnum_lrot32, 1);
|
1886
|
-
rb_define_method(rb_cBignum, "lrot32", bnum_lrot32, 1);
|
1887
|
-
rb_define_method(rb_cFixnum, "lrot64", fnum_lrot64, 1);
|
1888
|
-
rb_define_method(rb_cBignum, "lrot64", bnum_lrot64, 1);
|
1889
|
-
|
1890
|
-
rb_define_method(rb_cFixnum, "lshift8", fnum_lshift8, 1);
|
1891
|
-
rb_define_method(rb_cBignum, "lshift8", bnum_lshift8, 1);
|
1892
|
-
rb_define_method(rb_cFixnum, "lshift16", fnum_lshift16, 1);
|
1893
|
-
rb_define_method(rb_cBignum, "lshift16", bnum_lshift16, 1);
|
1894
|
-
rb_define_method(rb_cFixnum, "lshift32", fnum_lshift32, 1);
|
1895
|
-
rb_define_method(rb_cBignum, "lshift32", bnum_lshift32, 1);
|
1896
|
-
rb_define_method(rb_cFixnum, "lshift64", fnum_lshift64, 1);
|
1897
|
-
rb_define_method(rb_cBignum, "lshift64", bnum_lshift64, 1);
|
1898
|
-
|
1899
|
-
rb_define_method(rb_cFixnum, "rshift8", fnum_rshift8, 1);
|
1900
|
-
rb_define_method(rb_cBignum, "rshift8", bnum_rshift8, 1);
|
1901
|
-
rb_define_method(rb_cFixnum, "rshift16", fnum_rshift16, 1);
|
1902
|
-
rb_define_method(rb_cBignum, "rshift16", bnum_rshift16, 1);
|
1903
|
-
rb_define_method(rb_cFixnum, "rshift32", fnum_rshift32, 1);
|
1904
|
-
rb_define_method(rb_cBignum, "rshift32", bnum_rshift32, 1);
|
1905
|
-
rb_define_method(rb_cFixnum, "rshift64", fnum_rshift64, 1);
|
1906
|
-
rb_define_method(rb_cBignum, "rshift64", bnum_rshift64, 1);
|
1907
|
-
|
1908
|
-
rb_define_method(rb_cFixnum, "arith_rshift8", fnum_arith_rshift8, 1);
|
1909
|
-
rb_define_method(rb_cBignum, "arith_rshift8", bnum_arith_rshift8, 1);
|
1910
|
-
rb_define_method(rb_cFixnum, "arith_rshift16", fnum_arith_rshift16, 1);
|
1911
|
-
rb_define_method(rb_cBignum, "arith_rshift16", bnum_arith_rshift16, 1);
|
1912
|
-
rb_define_method(rb_cFixnum, "arith_rshift32", fnum_arith_rshift32, 1);
|
1913
|
-
rb_define_method(rb_cBignum, "arith_rshift32", bnum_arith_rshift32, 1);
|
1914
|
-
rb_define_method(rb_cFixnum, "arith_rshift64", fnum_arith_rshift64, 1);
|
1915
|
-
rb_define_method(rb_cBignum, "arith_rshift64", bnum_arith_rshift64, 1);
|
1916
|
-
|
1917
|
-
rb_define_method(rb_cFixnum, "bitreverse8", fnum_bitreverse8, 0);
|
1918
|
-
rb_define_method(rb_cBignum, "bitreverse8", bnum_bitreverse8, 0);
|
1919
|
-
rb_define_method(rb_cFixnum, "bitreverse16", fnum_bitreverse16, 0);
|
1920
|
-
rb_define_method(rb_cBignum, "bitreverse16", bnum_bitreverse16, 0);
|
1921
|
-
rb_define_method(rb_cFixnum, "bitreverse32", fnum_bitreverse32, 0);
|
1922
|
-
rb_define_method(rb_cBignum, "bitreverse32", bnum_bitreverse32, 0);
|
1923
|
-
rb_define_method(rb_cFixnum, "bitreverse64", fnum_bitreverse64, 0);
|
1924
|
-
rb_define_method(rb_cBignum, "bitreverse64", bnum_bitreverse64, 0);
|
1925
|
-
#endif
|
1926
1860
|
}
|
data/ext/bit_twiddle/extconf.rb
CHANGED
@@ -14,8 +14,10 @@ if RUBY_ENGINE == 'rbx'
|
|
14
14
|
elsif RUBY_VERSION < '2.2.0'
|
15
15
|
check_sizeof 'BDIGIT'
|
16
16
|
$CFLAGS << " -I#{File.join(dir, 'ruby21')} "
|
17
|
-
|
17
|
+
elsif RUBY_VERSION < '2.3.0'
|
18
18
|
$CFLAGS << " -I#{File.join(dir, 'ruby22')} "
|
19
|
+
else
|
20
|
+
$CFLAGS << " -I#{File.join(dir, 'ruby23')} "
|
19
21
|
end
|
20
22
|
|
21
23
|
check_sizeof 'short'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
#if SIZEOF_INT*2 <= SIZEOF_LONG_LONG
|
3
|
+
# define BDIGIT unsigned int
|
4
|
+
# define SIZEOF_BDIGIT SIZEOF_INT
|
5
|
+
#elif SIZEOF_INT*2 <= SIZEOF_LONG
|
6
|
+
# define BDIGIT unsigned int
|
7
|
+
# define SIZEOF_BDIGIT SIZEOF_INT
|
8
|
+
#elif SIZEOF_SHORT*2 <= SIZEOF_LONG
|
9
|
+
# define BDIGIT unsigned short
|
10
|
+
# define SIZEOF_BDIGIT SIZEOF_SHORT
|
11
|
+
#else
|
12
|
+
# define BDIGIT unsigned short
|
13
|
+
# define SIZEOF_BDIGIT (SIZEOF_LONG/2)
|
14
|
+
# define SIZEOF_ACTUAL_BDIGIT SIZEOF_LONG
|
15
|
+
#endif
|
16
|
+
#ifndef SIZEOF_ACTUAL_BDIGIT
|
17
|
+
# define SIZEOF_ACTUAL_BDIGIT SIZEOF_BDIGIT
|
18
|
+
#endif
|
19
|
+
|
20
|
+
#define BIGNUM_EMBED_LEN_NUMBITS 3
|
21
|
+
#if (SIZEOF_VALUE*3/SIZEOF_ACTUAL_BDIGIT) < (1 << BIGNUM_EMBED_LEN_NUMBITS)-1
|
22
|
+
# define BIGNUM_EMBED_LEN_MAX (SIZEOF_VALUE*3/SIZEOF_ACTUAL_BDIGIT)
|
23
|
+
#else
|
24
|
+
# define BIGNUM_EMBED_LEN_MAX ((1 << BIGNUM_EMBED_LEN_NUMBITS)-1)
|
25
|
+
#endif
|
26
|
+
|
27
|
+
struct RBignum {
|
28
|
+
struct RBasic basic;
|
29
|
+
union {
|
30
|
+
struct {
|
31
|
+
size_t len;
|
32
|
+
BDIGIT *digits;
|
33
|
+
} heap;
|
34
|
+
BDIGIT ary[BIGNUM_EMBED_LEN_MAX];
|
35
|
+
} as;
|
36
|
+
};
|
37
|
+
|
38
|
+
#define BIGNUM_EMBED_FLAG FL_USER2
|
39
|
+
#define BIGNUM_EMBED_LEN_MASK (FL_USER5|FL_USER4|FL_USER3)
|
40
|
+
#define BIGNUM_EMBED_LEN_SHIFT (FL_USHIFT+BIGNUM_EMBED_LEN_NUMBITS)
|
41
|
+
#define RBIGNUM_LEN(b) \
|
42
|
+
((RBASIC(b)->flags & BIGNUM_EMBED_FLAG) ? \
|
43
|
+
(long)((RBASIC(b)->flags >> BIGNUM_EMBED_LEN_SHIFT) & \
|
44
|
+
(BIGNUM_EMBED_LEN_MASK >> BIGNUM_EMBED_LEN_SHIFT)) : \
|
45
|
+
RBIGNUM(b)->as.heap.len)
|
46
|
+
/* LSB:BIGNUM_DIGITS(b)[0], MSB:BIGNUM_DIGITS(b)[BIGNUM_LEN(b)-1] */
|
47
|
+
#define RBIGNUM_DIGITS(b) \
|
48
|
+
((RBASIC(b)->flags & BIGNUM_EMBED_FLAG) ? \
|
49
|
+
RBIGNUM(b)->as.ary : \
|
50
|
+
RBIGNUM(b)->as.heap.digits)
|
51
|
+
|
52
|
+
#define RBIGNUM(obj) (R_CAST(RBignum)(obj))
|
data/lib/bit_twiddle.so
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bit-twiddle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Dowad
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -94,6 +94,7 @@ files:
|
|
94
94
|
- ext/bit_twiddle/extconf.rb
|
95
95
|
- ext/bit_twiddle/ruby21/bt_bignum.h
|
96
96
|
- ext/bit_twiddle/ruby22/bt_bignum.h
|
97
|
+
- ext/bit_twiddle/ruby23/bt_bignum.h
|
97
98
|
- lib/bit-twiddle.rb
|
98
99
|
- lib/bit-twiddle/core_ext.rb
|
99
100
|
- lib/bit_twiddle.so
|
@@ -117,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
118
|
version: '0'
|
118
119
|
requirements: []
|
119
120
|
rubyforge_project:
|
120
|
-
rubygems_version: 2.
|
121
|
+
rubygems_version: 2.5.0
|
121
122
|
signing_key:
|
122
123
|
specification_version: 4
|
123
124
|
summary: Fast bitwise operations for Ruby
|