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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a8718e2b995e05ebbbfc068b45acef79a24b371905ec0afc4fe828d608f56a32
4
- data.tar.gz: e303e6e22a0927d312934fd9085f6b4e7a19ee10361fafe90c465462d8b1de9d
3
+ metadata.gz: 6d75494c09a1b688169fd2630a7ea299a5c58ad312f9ae369a4c0c11165c46e6
4
+ data.tar.gz: 60840b874151b38faa6ef56cf6f7f6f179cf2415053edce96f08f32e82874ceb
5
5
  SHA512:
6
- metadata.gz: 54b27c548d1f4d1ec0373f7f0d60a6079b9b3c471be0e773aabe8d5c8dfabee6cdaaa6a2a8982fdec4b3d34cc301817b329e32d734187c1b8bb8dfa44cd427cd
7
- data.tar.gz: 163eb57089a2b6f88ada99a2ff9909a7c7bf34dc1bf56afa1665441de7232117df779107250ea66086024689a32c5fabb8e611c8d53af53552208f6cac9818bb
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
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'bit_field/version'
4
- require_relative 'bit_field/bit_field_supporter'
5
4
  require_relative 'bit_struct'
6
5
  require_relative 'managed_bit_struct'
7
6
 
@@ -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
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module FFI
2
4
  module BitField
3
- VERSION="0.0.2"
5
+ VERSION = '0.0.3'
4
6
  end
5
- end
7
+ end
@@ -2,10 +2,20 @@
2
2
 
3
3
  require 'ffi'
4
4
  require_relative 'bit_field/version'
5
- require_relative 'bit_field/bit_field_supporter'
5
+ require_relative 'bit_field/layout'
6
+ require_relative 'bit_field/property'
6
7
 
7
8
  module FFI
8
9
  class BitStruct < Struct
9
- extend BitField::BitFiledSupporter
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 'bit_struct/version'
5
- require_relative 'bit_field_supporter'
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
- extend BitFiledSupporter
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.2
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/bit_field_supporter.rb
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