bit-twiddle 0.0.4 → 0.1.1

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.
@@ -7,15 +7,23 @@ if ENV['CC']
7
7
  RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC']
8
8
  end
9
9
 
10
- $CFLAGS << ' -Wall -Werror -O3 -march=native -mtune=native -std=c99 '
10
+ $CFLAGS << ' -Wall ' # turn on all warnings for more thorough code checking
11
+ # for clang; generated Makefile contains GCC-specific -W options which clang doesn't understand
12
+ $CFLAGS << ' -Wno-unknown-warning-option '
13
+ # for clang; ruby.h contains __error__ and __deprecated__, which clang chokes on
14
+ $CFLAGS << ' -Wno-unknown-attributes -Wno-ignored-attributes '
15
+ $CFLAGS << ' -Werror ' # convert all warnings to errors so we can't ignore them
16
+ $CFLAGS << ' -O3 -march=native -mtune=native ' # full optimization
17
+ $CFLAGS << ' -std=c99 ' # use a modern version of the C standard
11
18
 
12
19
  if RUBY_ENGINE == 'rbx'
13
20
  raise "bit-twiddle does not support Rubinius. Sorry!"
14
- elsif RUBY_VERSION < '2.2.0'
15
- check_sizeof 'BDIGIT'
16
- $CFLAGS << " -I#{File.join(dir, 'ruby21')} "
17
- else
21
+ elsif RUBY_VERSION < '2.3.0'
18
22
  $CFLAGS << " -I#{File.join(dir, 'ruby22')} "
23
+ elsif RUBY_VERSION < '3.0.0'
24
+ $CFLAGS << " -I#{File.join(dir, 'ruby23')} "
25
+ else
26
+ $CFLAGS << " -I#{File.join(dir, 'ruby30')} "
19
27
  end
20
28
 
21
29
  check_sizeof 'short'
@@ -23,6 +31,11 @@ check_sizeof 'int'
23
31
  check_sizeof 'long'
24
32
  check_sizeof 'long long'
25
33
 
34
+ # if we already have ulong, HAVE_TYPE_ULONG will be defined as a macro
35
+ have_type 'ulong'
36
+ # likewise for uchar
37
+ have_type 'uchar'
38
+
26
39
  checking_for("whether >> on a signed long is arithmetic shift or logical shift", "%s") do
27
40
  is_arith = try_static_assert("(-1L >> (sizeof(long)/8)) == -1L")
28
41
  $defs.push("-DRSHIFT_IS_ARITH=#{is_arith ? '1' : '0'}")
@@ -35,4 +48,4 @@ checking_for("presence of __builtin_bswap16", "%s") do
35
48
  have_bswap16 ? "oh yeah" : "nope...but we can sure fix that"
36
49
  end
37
50
 
38
- create_makefile 'bit_twiddle'
51
+ create_makefile 'bit_twiddle'
@@ -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))
@@ -0,0 +1,83 @@
1
+ #if SIZEOF_INT*2 <= SIZEOF_LONG_LONG
2
+ # define BDIGIT unsigned int
3
+ # define SIZEOF_BDIGIT SIZEOF_INT
4
+ #elif SIZEOF_INT*2 <= SIZEOF_LONG
5
+ # define BDIGIT unsigned int
6
+ # define SIZEOF_BDIGIT SIZEOF_INT
7
+ #elif SIZEOF_SHORT*2 <= SIZEOF_LONG
8
+ # define BDIGIT unsigned short
9
+ # define SIZEOF_BDIGIT SIZEOF_SHORT
10
+ #else
11
+ # define BDIGIT unsigned short
12
+ # define SIZEOF_BDIGIT (SIZEOF_LONG/2)
13
+ # define SIZEOF_ACTUAL_BDIGIT SIZEOF_LONG
14
+ #endif
15
+ #ifndef SIZEOF_ACTUAL_BDIGIT
16
+ # define SIZEOF_ACTUAL_BDIGIT SIZEOF_BDIGIT
17
+ #endif
18
+
19
+ #define RBIGNUM(obj) ((struct RBignum *)(obj))
20
+ #define BIGNUM_SIGN_BIT FL_USER1
21
+ #define BIGNUM_EMBED_FLAG ((VALUE)FL_USER2)
22
+ #define BIGNUM_EMBED_LEN_NUMBITS 3
23
+ #define BIGNUM_EMBED_LEN_MASK \
24
+ (~(~(VALUE)0U << BIGNUM_EMBED_LEN_NUMBITS) << BIGNUM_EMBED_LEN_SHIFT)
25
+ #define BIGNUM_EMBED_LEN_SHIFT \
26
+ (FL_USHIFT+3) /* bit offset of BIGNUM_EMBED_LEN_MASK */
27
+ #ifndef BIGNUM_EMBED_LEN_MAX
28
+ # if (SIZEOF_VALUE*RVALUE_EMBED_LEN_MAX/SIZEOF_ACTUAL_BDIGIT) < (1 << BIGNUM_EMBED_LEN_NUMBITS)-1
29
+ # define BIGNUM_EMBED_LEN_MAX (SIZEOF_VALUE*RVALUE_EMBED_LEN_MAX/SIZEOF_ACTUAL_BDIGIT)
30
+ # else
31
+ # define BIGNUM_EMBED_LEN_MAX ((1 << BIGNUM_EMBED_LEN_NUMBITS)-1)
32
+ # endif
33
+ #endif
34
+
35
+ struct RBignum {
36
+ struct RBasic basic;
37
+ union {
38
+ struct {
39
+ size_t len;
40
+ BDIGIT *digits;
41
+ } heap;
42
+ BDIGIT ary[BIGNUM_EMBED_LEN_MAX];
43
+ } as;
44
+ };
45
+
46
+ static inline size_t BIGNUM_LEN(VALUE b);
47
+ static inline BDIGIT *BIGNUM_DIGITS(VALUE b);
48
+ static inline bool BIGNUM_EMBED_P(VALUE b);
49
+
50
+ static inline size_t
51
+ BIGNUM_LEN(VALUE b)
52
+ {
53
+ if (! BIGNUM_EMBED_P(b)) {
54
+ return RBIGNUM(b)->as.heap.len;
55
+ }
56
+ else {
57
+ size_t ret = RBASIC(b)->flags;
58
+ ret &= BIGNUM_EMBED_LEN_MASK;
59
+ ret >>= BIGNUM_EMBED_LEN_SHIFT;
60
+ return ret;
61
+ }
62
+ }
63
+
64
+ /* LSB:BIGNUM_DIGITS(b)[0], MSB:BIGNUM_DIGITS(b)[BIGNUM_LEN(b)-1] */
65
+ static inline BDIGIT *
66
+ BIGNUM_DIGITS(VALUE b)
67
+ {
68
+ if (BIGNUM_EMBED_P(b)) {
69
+ return RBIGNUM(b)->as.ary;
70
+ }
71
+ else {
72
+ return RBIGNUM(b)->as.heap.digits;
73
+ }
74
+ }
75
+
76
+ static inline bool
77
+ BIGNUM_EMBED_P(VALUE b)
78
+ {
79
+ return FL_TEST_RAW(b, BIGNUM_EMBED_FLAG);
80
+ }
81
+
82
+ #define RBIGNUM_DIGITS BIGNUM_DIGITS
83
+ #define RBIGNUM_LEN BIGNUM_LEN
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
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Dowad
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-25 00:00:00.000000000 Z
11
+ date: 2021-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.3'
19
+ version: '3.7'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.3'
26
+ version: '3.7'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.4'
33
+ version: '12.2'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.4'
40
+ version: '12.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake-compiler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,28 +58,28 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '2.3'
61
+ version: '2.7'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '2.3'
68
+ version: '2.7'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: yard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.8'
75
+ version: '0.9'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.8'
82
+ version: '0.9'
83
83
  description: Fast (native) bitwise operations for Ruby, in addition to the ones provided
84
84
  by the standard library
85
85
  email: alexinbeijing@gmail.com
@@ -92,16 +92,16 @@ files:
92
92
  - README.md
93
93
  - ext/bit_twiddle/bit_twiddle.c
94
94
  - ext/bit_twiddle/extconf.rb
95
- - ext/bit_twiddle/ruby21/bt_bignum.h
96
95
  - ext/bit_twiddle/ruby22/bt_bignum.h
96
+ - ext/bit_twiddle/ruby23/bt_bignum.h
97
+ - ext/bit_twiddle/ruby30/bt_bignum.h
97
98
  - lib/bit-twiddle.rb
98
99
  - lib/bit-twiddle/core_ext.rb
99
- - lib/bit_twiddle.so
100
100
  homepage: http://github.com/alexdowad/bit-twiddle
101
101
  licenses:
102
102
  - None (Public Domain)
103
103
  metadata: {}
104
- post_install_message:
104
+ post_install_message:
105
105
  rdoc_options: []
106
106
  require_paths:
107
107
  - lib
@@ -109,17 +109,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - ">="
111
111
  - !ruby/object:Gem::Version
112
- version: '0'
112
+ version: 2.2.8
113
113
  required_rubygems_version: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  requirements: []
119
- rubyforge_project:
120
- rubygems_version: 2.2.2
121
- signing_key:
119
+ rubygems_version: 3.2.15
120
+ signing_key:
122
121
  specification_version: 4
123
122
  summary: Fast bitwise operations for Ruby
124
123
  test_files: []
125
- has_rdoc:
@@ -1 +0,0 @@
1
- /* nothing special needed for MRI Ruby 1.9.3 - 2.1 */
data/lib/bit_twiddle.so DELETED
Binary file