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 +4 -4
- data/README.md +1 -1
- data/lib/bitint/bitint.rb +51 -36
- data/lib/bitint/native.rb +4 -2
- data/lib/bitint/refinements.rb +12 -32
- data/lib/bitint/version.rb +2 -2
- data/lib/bitint.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06dcd0b83a6c91e37dac7943bec5cbaaa91b901a6f8c4b19e6c45b4dba24269a
|
4
|
+
data.tar.gz: b6299c4988582178484aee179e2a4aa2e8961f5aa87679378043fc1848aeea39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d536a9f415638dae60580af85aae14ae37f9ec1a03f8a25e988e66ebbe6b4c3055bd028f9b570fba1636adf4c0531218a68a672e8e113e0bd725e4f4bcea6d79
|
7
|
+
data.tar.gz: 5438d936adca571ed12812580c69726e155aa786dccb349b908d1cc38a0f5f91b8703b0ec081ea52c10abd1c7fd7d279c4cae27b75f3fa27a6db62b39bdcb899
|
data/README.md
CHANGED
data/lib/bitint/bitint.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
class BitInt
|
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?
|
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?
|
222
|
+
def negative?
|
223
|
+
@int.negative?
|
224
|
+
end
|
221
225
|
|
222
226
|
# Returns whether +self+ is zero.
|
223
|
-
def 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?
|
232
|
+
def nonzero?
|
233
|
+
@int.nonzero? && self
|
234
|
+
end
|
227
235
|
|
228
236
|
# Checks to see if +self+ is even.
|
229
|
-
def even?
|
237
|
+
def even?
|
238
|
+
@int.even?
|
239
|
+
end
|
230
240
|
|
231
241
|
# Checks to see if +self+ is odd.
|
232
|
-
def 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
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
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
|
-
|
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
|
-
@
|
16
|
+
@IS_LITTLE_ENDIAN ? :little : :big
|
16
17
|
end
|
18
|
+
|
17
19
|
class << self
|
18
20
|
alias endian endianness
|
19
21
|
end
|
data/lib/bitint/refinements.rb
CHANGED
@@ -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 =
|
24
|
-
return super
|
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
|
data/lib/bitint/version.rb
CHANGED
data/lib/bitint.rb
CHANGED
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.
|
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:
|
11
|
+
date: 2024-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|