bitint 0.5.2 → 0.6.0

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: 06dcd0b83a6c91e37dac7943bec5cbaaa91b901a6f8c4b19e6c45b4dba24269a
4
+ data.tar.gz: b6299c4988582178484aee179e2a4aa2e8961f5aa87679378043fc1848aeea39
5
5
  SHA512:
6
- metadata.gz: e0896c0813dd92ada9c2fda9c9a7cd72f03db1c7bce0f8729289b12ab564edc25d8369ae6a48109b35b6a23134612aa516b543e36c6abf99decbe1dcbf09ce24
7
- data.tar.gz: 14489ac974de4591940baefc17516bffbf2bcf96ffb4f7c037aa73e836ba60f65f0edcbfb284f61548a5c021ca5917043b831292bfd48c942fa7d7617aa7f4ad
6
+ metadata.gz: d536a9f415638dae60580af85aae14ae37f9ec1a03f8a25e988e66ebbe6b4c3055bd028f9b570fba1636adf4c0531218a68a672e8e113e0bd725e4f4bcea6d79
7
+ data.tar.gz: 5438d936adca571ed12812580c69726e155aa786dccb349b908d1cc38a0f5f91b8703b0ec081ea52c10abd1c7fd7d279c4cae27b75f3fa27a6db62b39bdcb899
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,37 @@ 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
+ template = '_CS_L___Q'[self.class::BYTES]
297
+ if template.nil? || template == '_'
298
+ raise ArgumentError, 'bytes only works for sizes of 8, 16, 32, or 64.'
299
+ end
271
300
 
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
301
+ template.downcase! if self.class.signed?
302
+
303
+ case endian
304
+ when :native
305
+ when :little then template.concat '<'
306
+ when :big then template.concat '>'
307
+ else raise raise ArgumentError, 'endian must be :big, :little, or :native'
308
+ end
309
+
310
+ [to_i].pack(template).unpack('C*').map(&U8.method(:new))
311
+ end
312
+
313
+ def bytes_hex(...)
314
+ bytes(...).map(&:hex)
315
+ end
301
316
  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,8 +20,8 @@ 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, ...)
24
+ bits_not_given and return super
25
25
 
26
26
  BitInt::i(bits, ...).new(self)
27
27
  end
@@ -29,72 +29,52 @@ class BitInt
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.0'
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.0
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-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: