bitint 0.5.2 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 66e650638e0715aa47439d6fc808da63ab437cf8861b2d309c5205a44427ab24
4
- data.tar.gz: 72dccf88fd548cfea40033fc32f1ff67d0408dff5c51fb67b61e64f663486921
3
+ metadata.gz: 75e3bf4db6ee1c4cfc212b8bff049cb1445aadd046a118ea3dab258265b8e8af
4
+ data.tar.gz: 3207dadb95f0dae0a7084dc73daf741b45400a96bd92736f16c73515ca5023ba
5
5
  SHA512:
6
- metadata.gz: e0896c0813dd92ada9c2fda9c9a7cd72f03db1c7bce0f8729289b12ab564edc25d8369ae6a48109b35b6a23134612aa516b543e36c6abf99decbe1dcbf09ce24
7
- data.tar.gz: 14489ac974de4591940baefc17516bffbf2bcf96ffb4f7c037aa73e836ba60f65f0edcbfb284f61548a5c021ca5917043b831292bfd48c942fa7d7617aa7f4ad
6
+ metadata.gz: fd10fb7e841befab6ebfacf89c7e339be37511b37489896896e1063c332cdb4b42171a067e461a759249887020d7ede860fa4a1d155d3aa7b2fb6ec5ee3736bb
7
+ data.tar.gz: f82d4513e9f79185152a37f8b15bf01fd5a55e27826a957f70404f30794af48be83b63f7159d343b493bf1c5714798d7e6f8d484cfb1dda23b2d79445dbdf6fa
data/README.md CHANGED
@@ -21,7 +21,7 @@ Or install it yourself as:
21
21
  ## Usage
22
22
 
23
23
  ```ruby
24
- num = BitInt::U8.new(0xfe)
24
+ num = BitInt::U8.new(0xFE)
25
25
  num += 2
26
26
  puts num #=> 1
27
27
  ```
data/lib/bitint/bitint.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class BitInt < Numeric
3
+ class BitInt
4
4
  # Indicates that +BitInt::new+ was called with an integer that was too large.
5
5
  class OverflowError < RuntimeError
6
6
  attr_reader :integer, :range
@@ -214,22 +214,34 @@ class BitInt < Numeric
214
214
  # :section:
215
215
 
216
216
  # Returns whether +self+ is a positive integer. Zero is not positive.
217
- def positive? = @int.positive?
217
+ def positive?
218
+ @int.positive?
219
+ end
218
220
 
219
221
  # Return whether +self+ is a negative integer. Zero is not negative.
220
- def negative? = @int.negative?
222
+ def negative?
223
+ @int.negative?
224
+ end
221
225
 
222
226
  # Returns whether +self+ is zero.
223
- def zero? = @int.zero?
227
+ def zero?
228
+ @int.zero?
229
+ end
224
230
 
225
231
  # Returns a falsey value if zero, otherwise returns +self+.
226
- def nonzero? = @int.nonzero? && self
232
+ def nonzero?
233
+ @int.nonzero? && self
234
+ end
227
235
 
228
236
  # Checks to see if +self+ is even.
229
- def even? = @int.even?
237
+ def even?
238
+ @int.even?
239
+ end
230
240
 
231
241
  # Checks to see if +self+ is odd.
232
- def odd? = @int.odd?
242
+ def odd?
243
+ @int.odd?
244
+ end
233
245
 
234
246
  ##################################
235
247
  # :section: Bit-level operations #
@@ -268,34 +280,39 @@ class BitInt < Numeric
268
280
 
269
281
  def size = (self.class::BITS / 8.0).ceil
270
282
 
283
+ PACK_FMT = {
284
+ [:native, 8, false].freeze => 'C',
285
+ [:native, 16, false].freeze => 'S',
286
+ [:native, 32, false].freeze => 'L',
287
+ [:native, 64, false].freeze => 'Q',
288
+ [:native, 8, true].freeze => 'c',
289
+ [:native, 16, true].freeze => 's',
290
+ [:native, 32, true].freeze => 'l',
291
+ [:native, 64, true].freeze => 'q',
292
+ }.freeze
293
+ private_constant :PACK_FMT
294
+
295
+ def bytes(endian = :native)
296
+ return to_enum(__method__, endian) unless block_given?
297
+
298
+ template = '_CS_L___Q'[self.class::BYTES]
299
+ if template.nil? || template == '_'
300
+ raise ArgumentError, 'bytes only works for sizes of 8, 16, 32, or 64.'
301
+ end
271
302
 
272
- # PACK_FMT = {
273
- # [:native, 8, false].freeze => 'C',
274
- # [:native, 16, false].freeze => 'S',
275
- # [:native, 32, false].freeze => 'L',
276
- # [:native, 64, false].freeze => 'Q',
277
- # [:native, 8, true].freeze => 'c',
278
- # [:native, 16, true].freeze => 's',
279
- # [:native, 32, true].freeze => 'l',
280
- # [:native, 64, true].freeze => 'q',
281
- # }.freeze
282
- # private_constant :PACK_FMT
283
-
284
- # def bytes(endian = :native)
285
- # size = {
286
- # 8 => 'C',
287
- # 16 => 'S',
288
- # 32 => 'L',
289
- # 64 => 'Q'
290
- # }[self.class::BITS] or raise ArgumentError, "bytes only works for 8, 16, 32, or 64 rn." or raise ArgumentError, "endian must be :big, :little, or :native"
291
- # size = {8=>'C', 16=>}
292
- # size = case self.class::BITS
293
- # when 8 then 'C'
294
- # when 8 then 'C'
295
- # # sprintf "%0#{self.class::BYTES * 2}x",
296
- # # mask = self.class::MASK_CHAR or raise ArgumentError, "bytes only works (rn) on "
297
- # # pack_char = self.class.pack_Char
298
- # # case endian
299
- # # when :native then
300
- # end
303
+ template.downcase! if self.class.signed?
304
+
305
+ case endian
306
+ when :native
307
+ when :little then template.concat '<'
308
+ when :big then template.concat '>'
309
+ else raise raise ArgumentError, 'endian must be :big, :little, or :native'
310
+ end
311
+
312
+ [to_i].pack(template).unpack('C*').map(&U8.method(:new))
313
+ end
314
+
315
+ def bytes_hex(...)
316
+ bytes(...).map(&:hex)
317
+ end
301
318
  end
data/lib/bitint/native.rb CHANGED
@@ -6,14 +6,16 @@ class BitInt
6
6
  # `BitInt`s that correspond to underlying C integer sizes.
7
7
  module Native
8
8
  # On big-endian systems, the unpack will equal `0x00AA`.
9
- @little_endian = [0xAA00].pack('S').unpack('S<') == [0xAA00]
9
+ IS_LITTLE_ENDIAN = [0xAA00].pack('S').unpack('S<') == [0xAA00]
10
+ private_constant :IS_LITTLE_ENDIAN
10
11
 
11
12
  module_function
12
13
 
13
14
  # Returns either `:little` or `:big` depending on the underlying system's endianness.
14
15
  def endianness
15
- @little_endian ? :little : :big
16
+ @IS_LITTLE_ENDIAN ? :little : :big
16
17
  end
18
+
17
19
  class << self
18
20
  alias endian endianness
19
21
  end
@@ -20,81 +20,61 @@ class BitInt
20
20
  # If no arguments are given, this instead forwards to Numeric#i.
21
21
  #
22
22
  # Any additional arguments are forwarded to +BitInt#new+
23
- def i(bits = nil, ...)
24
- return super if bits.nil?
23
+ def i(bits = bits_not_given=true, *a, **k, &b) # Support ruby-3.0
24
+ bits_not_given and return super
25
25
 
26
- BitInt::i(bits, ...).new(self)
26
+ BitInt::i(bits, *a, **k, &b).new(self)
27
27
  end
28
28
 
29
29
  # Converts +self+ into an unsigned 8-bit integer.
30
30
  #
31
31
  # Any additional arguments are forwarded to +BitInt#new+
32
- def u8(...)
33
- u(8, ...)
34
- end
32
+ def u8(...) = u(8, ...)
35
33
 
36
34
  # Converts +self+ into an unsigned 16-bit integer.
37
35
  #
38
36
  # Any additional arguments are forwarded to +BitInt#new+
39
- def u16(...)
40
- u(16, ...)
41
- end
37
+ def u16(...) = u(16, ...)
42
38
 
43
39
  # Converts +self+ into an unsigned 32-bit integer.
44
40
  #
45
41
  # Any additional arguments are forwarded to +BitInt#new+
46
- def u32(...)
47
- u(32, ...)
48
- end
42
+ def u32(...) = u(32, ...)
49
43
 
50
44
  # Converts +self+ into an unsigned 64-bit integer.
51
45
  #
52
46
  # Any additional arguments are forwarded to +BitInt#new+
53
- def u64(...)
54
- u(64, ...)
55
- end
47
+ def u64(...) = u(64, ...)
56
48
 
57
49
  # Converts +self+ into an unsigned 128-bit integer.
58
50
  #
59
51
  # Any additional arguments are forwarded to +BitInt#new+
60
- def u128(...)
61
- u(128, ...)
62
- end
52
+ def u128(...) = u(128, ...)
63
53
 
64
54
  # Converts +self+ into a signed 8-bit integer.
65
55
  #
66
56
  # Any additional arguments are forwarded to +BitInt#new+
67
- def i8(...)
68
- i(8, ...)
69
- end
57
+ def i8(...) = i(8, ...)
70
58
 
71
59
  # Converts +self+ into a signed 16-bit integer.
72
60
  #
73
61
  # Any additional arguments are forwarded to +BitInt#new+
74
- def i16(...)
75
- i(16, ...)
76
- end
62
+ def i16(...) = i(16, ...)
77
63
 
78
64
  # Converts +self+ into a signed 32-bit integer.
79
65
  #
80
66
  # Any additional arguments are forwarded to +BitInt#new+
81
- def i32(...)
82
- i(32, ...)
83
- end
67
+ def i32(...) = i(32, ...)
84
68
 
85
69
  # Converts +self+ into a signed 64-bit integer.
86
70
  #
87
71
  # Any additional arguments are forwarded to +BitInt#new+
88
- def i64(...)
89
- i(64, ...)
90
- end
72
+ def i64(...) = i(64, ...)
91
73
 
92
74
  # Converts +self+ into a signed 128-bit integer.
93
75
  #
94
76
  # Any additional arguments are forwarded to +BitInt#new+
95
- def i128(...)
96
- i(128, ...)
97
- end
77
+ def i128(...) = i(128, ...)
98
78
  end
99
79
  end
100
80
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class BitInt
3
+ class BitInt < Numeric
4
4
  # The current version of BitInt.
5
- VERSION = '0.5.2'
5
+ VERSION = '0.6.1'
6
6
  end
data/lib/bitint.rb CHANGED
@@ -6,5 +6,5 @@ end
6
6
  require_relative 'bitint/version'
7
7
  require_relative 'bitint/bitint'
8
8
  require_relative 'bitint/refinements'
9
- require_relative 'bitint/native'
10
9
  require_relative 'bitint/constants'
10
+ require_relative 'bitint/native'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Westerman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-01 00:00:00.000000000 Z
11
+ date: 2024-12-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -55,7 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
55
  - !ruby/object:Gem::Version
56
56
  version: '0'
57
57
  requirements: []
58
- rubygems_version: 3.3.3
58
+ rubygems_version: 3.2.3
59
59
  signing_key:
60
60
  specification_version: 4
61
61
  summary: A 2's-complement integer of arbitrary length