ffi-bitfield 0.0.2 → 0.0.3
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 +0 -8
- data/lib/ffi/bit_field.rb +0 -1
- data/lib/ffi/bit_field/layout.rb +29 -0
- data/lib/ffi/bit_field/property.rb +18 -0
- data/lib/ffi/bit_field/version.rb +4 -2
- data/lib/ffi/bit_struct.rb +12 -2
- data/lib/ffi/managed_bit_struct.rb +13 -3
- metadata +3 -2
- data/lib/ffi/bit_field/bit_field_supporter.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d75494c09a1b688169fd2630a7ea299a5c58ad312f9ae369a4c0c11165c46e6
|
4
|
+
data.tar.gz: 60840b874151b38faa6ef56cf6f7f6f179cf2415053edce96f08f32e82874ceb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d1d86bda1e5c71a59bc801eb35ee64522bc5d6bd49452afd01583240d4358d370fadc5b3bfa6c619ebb3b65c3cc116d14e149cce2c8977f923365708a8d20bb
|
7
|
+
data.tar.gz: 6c7642a18712a0959273d6a46a5c46b3f6c2bd1b0861cace828f9d6fb717aa76ab3643dc9af509c5478e80e05371609a9a5f871132016f9767b50cb77985c794
|
data/README.md
CHANGED
@@ -61,15 +61,7 @@ require 'ffi/managed_bit_struct'
|
|
61
61
|
```md
|
62
62
|
* module FFI
|
63
63
|
* class BitStruct < FFI::Struct
|
64
|
-
* include BitFieldSupporter
|
65
|
-
|
66
64
|
* class ManagedBitStruct < FFI::ManagedStruct
|
67
|
-
* include BitFieldSupporter
|
68
|
-
|
69
|
-
* module BitField
|
70
|
-
* module BitFieldSupporter
|
71
|
-
* bit_fields
|
72
|
-
* bit_field <- alias of bit_fields
|
73
65
|
```
|
74
66
|
|
75
67
|
## Development
|
data/lib/ffi/bit_field.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FFI
|
4
|
+
module BitField
|
5
|
+
module Layout
|
6
|
+
def bit_fields(*args)
|
7
|
+
# The reason for using class instance variable here instead of
|
8
|
+
# class variable is that sub-class of FFI::Struct cannot be inherited again,
|
9
|
+
# not because class instance variables are clean.
|
10
|
+
@bit_field_hash_table = {} unless instance_variable_defined?(:@bit_field_hash_table)
|
11
|
+
|
12
|
+
parent_name = args.shift
|
13
|
+
member_names = []
|
14
|
+
widths = []
|
15
|
+
args.each_slice(2) do |name, width|
|
16
|
+
member_names << name
|
17
|
+
widths << width
|
18
|
+
end
|
19
|
+
starts = widths.inject([0]) do |result, width|
|
20
|
+
result << (result.last + width)
|
21
|
+
end
|
22
|
+
member_names.zip(starts, widths).each do |name, start, width|
|
23
|
+
@bit_field_hash_table[name] = [parent_name, start, width]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
alias bit_field bit_fields
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FFI
|
4
|
+
module BitField
|
5
|
+
module Property
|
6
|
+
def [](member_name)
|
7
|
+
bit_fields = self.class.instance_variable_get(:@bit_field_hash_table)
|
8
|
+
parent_name, start, width = bit_fields[member_name]
|
9
|
+
if parent_name
|
10
|
+
value = get_member_value(parent_name)
|
11
|
+
(value >> start) & ((1 << width) - 1)
|
12
|
+
else
|
13
|
+
get_member_value(member_name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/ffi/bit_struct.rb
CHANGED
@@ -2,10 +2,20 @@
|
|
2
2
|
|
3
3
|
require 'ffi'
|
4
4
|
require_relative 'bit_field/version'
|
5
|
-
require_relative 'bit_field/
|
5
|
+
require_relative 'bit_field/layout'
|
6
|
+
require_relative 'bit_field/property'
|
6
7
|
|
7
8
|
module FFI
|
8
9
|
class BitStruct < Struct
|
9
|
-
|
10
|
+
# [] is defined in FFI::Struct
|
11
|
+
alias get_member_value []
|
12
|
+
extend BitField::Layout
|
13
|
+
# The Property module included in the FFI::ManagedBitStruct class is
|
14
|
+
# * behind the FFI::ManagedBitStruct class, but is
|
15
|
+
# * in FRONT of the FFI::Struct class.
|
16
|
+
# `MStruct.ancestors`
|
17
|
+
# # => [MStruct, FFI::ManagedBitStruct, FFI::BitField::Property, FFI::ManagedStruct, FFI::Struct...]
|
18
|
+
# So you do not need to use `prepend` instead of `include`.
|
19
|
+
include BitField::Property
|
10
20
|
end
|
11
21
|
end
|
@@ -1,11 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'ffi'
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
4
|
+
require_relative 'bit_field/version'
|
5
|
+
require_relative 'bit_field/layout'
|
6
|
+
require_relative 'bit_field/property'
|
6
7
|
|
7
8
|
module FFI
|
8
9
|
class ManagedBitStruct < ManagedStruct
|
9
|
-
|
10
|
+
# [] is defined in FFI::Struct
|
11
|
+
alias get_member_value []
|
12
|
+
extend BitField::Layout
|
13
|
+
# The Property module included in the FFI::BitStruct class is
|
14
|
+
# * behind the FFI::BitStruct class, but is
|
15
|
+
# * in FRONT of the FFI::Struct class.
|
16
|
+
# `YourStruct.ancestors`
|
17
|
+
# # => [YourStruct, FFI::BitStruct, FFI::BitField::Property, FFI::Struct...]
|
18
|
+
# So you do not need to use `prepend` instead of `include`.
|
19
|
+
include BitField::Property
|
10
20
|
end
|
11
21
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-bitfield
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kojix2
|
@@ -104,7 +104,8 @@ files:
|
|
104
104
|
- LICENSE.txt
|
105
105
|
- README.md
|
106
106
|
- lib/ffi/bit_field.rb
|
107
|
-
- lib/ffi/bit_field/
|
107
|
+
- lib/ffi/bit_field/layout.rb
|
108
|
+
- lib/ffi/bit_field/property.rb
|
108
109
|
- lib/ffi/bit_field/version.rb
|
109
110
|
- lib/ffi/bit_struct.rb
|
110
111
|
- lib/ffi/managed_bit_struct.rb
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module FFI
|
4
|
-
module BitField
|
5
|
-
module BitFiledSupporter
|
6
|
-
module BitFieldModule
|
7
|
-
def [](name)
|
8
|
-
bit_fields = self.class.bit_fields_hash_table
|
9
|
-
parent, start, width = bit_fields[name]
|
10
|
-
if parent
|
11
|
-
(super(parent) >> start) & ((1 << width) - 1)
|
12
|
-
else
|
13
|
-
super(name)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
private_constant :BitFieldModule
|
18
|
-
|
19
|
-
attr_reader :bit_fields_hash_table
|
20
|
-
|
21
|
-
def bit_fields(*args)
|
22
|
-
unless instance_variable_defined?(:@bit_fields_hash_table)
|
23
|
-
@bit_fields_hash_table = {}
|
24
|
-
prepend BitFieldModule
|
25
|
-
end
|
26
|
-
|
27
|
-
parent = args.shift
|
28
|
-
labels = []
|
29
|
-
widths = []
|
30
|
-
args.each_slice(2) do |l, w|
|
31
|
-
labels << l
|
32
|
-
widths << w
|
33
|
-
end
|
34
|
-
starts = widths.inject([0]) do |result, w|
|
35
|
-
result << (result.last + w)
|
36
|
-
end
|
37
|
-
labels.zip(starts, widths).each do |l, s, w|
|
38
|
-
@bit_fields_hash_table[l] = [parent, s, w]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
alias bit_field bit_fields
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|