ruby-gr 0.0.15 → 0.0.16

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: 1d9ef46d38e4a4cb1d52b933af0b1d3a44de17e780bbb0dc404ac62a40026827
4
- data.tar.gz: 9084d96ecd560a87d7540d736e87312cc3351f85bcdc4a2ed1a4eb5b590b3ed0
3
+ metadata.gz: d1884c5391124334045320390f35efd167865a6f1f063e6b763228c707cad400
4
+ data.tar.gz: '07929d47c8a49344fb625526b34f170b1fd0da2cfbddf538bef39f29ef122ec8'
5
5
  SHA512:
6
- metadata.gz: 5b4acddc1c8237754644b1e75b9b11d87364e0ef2d5fac59e9ce5685464dcab180817e130a0b244cf27ac3716d0c9e1e6f78192b031a229b42cc1157117aea70
7
- data.tar.gz: cf0daf98117cf7408bb1b8f3e33006043a0cd3c7f17da6f0521d98b2ebf5788be88defc0e6909ed00101a1f3a9023dbfb3cc9879b86c79193fc6750d8f6022f9
6
+ metadata.gz: 132db88979be43ca20834522630d5970442a3565b7b14d6dafb5d970b7706b39112f56b83ab223c804e129ec9fcc612812ee691fa181d0dcdf7a86643ab7ba4b
7
+ data.tar.gz: 7bc7e311d1c22d81afada8611c1775b93a477c80d52b545c665975a8736a4fdb25dfcbde2c44604eb616c8018ab918148ba5b280166d228fae6205aa98b31322
data/README.md CHANGED
@@ -92,6 +92,8 @@ Set environment variable GRDIR.
92
92
  export GRDIR="your/path/to/gr"
93
93
  ```
94
94
 
95
+ * macOS Catalina and macOS Mojave: See the "How to open an app that hasn’t been notarized or is from an unidentified developer" section of [Safely open apps on your Mac](https://support.apple.com/en-us/HT202491) in the Apple documentation.
96
+
95
97
  ### Homebrew
96
98
 
97
99
  ```sh
@@ -106,9 +108,13 @@ export GRDIR=$(brew --prefix libgr)
106
108
 
107
109
  If you fail to build libgr using homebrew, Please feel free to [send us your feedback](https://github.com/red-data-tools/GR.rb/issues).
108
110
 
111
+ ### Red data tools repository
112
+
113
+ Red data tools provides [packages](https://github.com/red-data-tools/packages.red-data-tools.org ) related to our project including `libgr-dev` and `libgr3-dev` for advanced users.
114
+
109
115
  ## Backend for Charty
110
116
 
111
- GR.rb is expected to be the backend for [Charty](https://github.com/red-data-tools/charty) in the future.
117
+ GR.rb will be the default backend for [Charty](https://github.com/red-data-tools/charty).
112
118
 
113
119
  ## Contributing
114
120
 
@@ -116,8 +122,9 @@ GR.rb is expected to be the backend for [Charty](https://github.com/red-data-too
116
122
  * Fix bugs and submit pull requests
117
123
  * Write, clarify, or fix documentation
118
124
  * Suggest or add new features
125
+ * Create visualization library based on GR.rb
119
126
 
120
127
  ## Acknowledgements
121
128
 
122
- We would like to thank Josef Heinen, the creator of [GR.jl](https://github.com/jheinen/GR.jl) and Florian Rhiem, the creator of [python-gr](https://github.com/sciapp/python-gr).
129
+ We would like to thank Josef Heinen, the creator of [GR.jl](https://github.com/jheinen/GR.jl), Florian Rhiem, the creator of [python-gr](https://github.com/sciapp/python-gr), and [GR](https://github.com/sciapp/gr) developers.
123
130
 
data/lib/gr.rb CHANGED
@@ -2,40 +2,46 @@
2
2
 
3
3
  # OverView of GR.rb
4
4
  #
5
- # +--------------------+
6
- # +-------------------+ | GR3 module |
7
- # | GR module | | +----------------+ |
8
- # | +---------------+ | | | GR3::FFI | |
9
- # | | GR::FFI | | | | + libGR3.so | |
10
- # | | + libGR.so | | | +----------------+ |
11
- # | +---------------+ | | | define_method |
12
- # | | define_method | | +----------------+ |
13
- # | +---------------+ | | | | GR3::GR3Base | |
14
- # | | | GR::GRBase | | | | v (Private) | |
15
- # | | v (Private) | | | +++--------------+ |
16
- # | +++-------------+ | | | Extend |
17
- # | | Extend | | v +------+ |
18
- # | v | | |Check | |
19
- # | | | <--+Error | |
20
- # +-------+-----------+ | +------+ |
21
- # ^ +---------+----------+
22
- # | +------------------+ ^
23
- # Extend | | GRCommons module | | Extend
24
- # | | +--------------+ | |
25
- # | | | Fiddley | | |
26
- # | | +--------------+ | |
27
- # | | +--------------+ | |
28
- # +----+ CommonUtils +----+
29
- # | | +--------------+ | |
30
- # | | +--------------+ | |
31
- # +----+ Version +----+
32
- # | | +--------------+ |
33
- # | | +--------------+ |
34
- # +----+JupyterSupport| |
35
- # | +--------------+ |
36
- # +------------------+
5
+ # +--------------------+ +--------------------+
6
+ # | GR module | | GR3 module |
7
+ # | +----------------+ | | +----------------+ |
8
+ # | | GR::FFI | | | | GR3::FFI | |
9
+ # | | + libGR.so | | | | + libGR3.so | |
10
+ # | +----------------+ | | +----------------+ |
11
+ # | | define_method | | | define_method |
12
+ # | +----------------+ | | +----------------+ |
13
+ # | | | GR::GRBase | | | | | GR3::GR3Base | |
14
+ # | | v (Pri^ate) | | | | v (Pri^ate) | |
15
+ # | +++--------------+ | | +++--------------+ |
16
+ # | | Extend | | | Extend |
17
+ # | v | | v +-------+ |
18
+ # | +-----------+ | | | Check | |
19
+ # | | GR::Plot | | | <--+ Error | |
20
+ # | +-----------+ | | +-------+ |
21
+ # +--------------------+ +----------+---------+
22
+ # ^ ^
23
+ # | +------------------+ |
24
+ # Extend | | GRCommons module | | Extend
25
+ # | | +--------------+ | |
26
+ # | | | Fiddley | | |
27
+ # | | +--------------+ | |
28
+ # | | +--------------+ | |
29
+ # +----+ CommonUtils +----+
30
+ # | | +--------------+ | |
31
+ # | | +--------------+ | |
32
+ # +----+ Version +----+
33
+ # | | +--------------+ |
34
+ # | | +--------------+ |
35
+ # +----+JupyterSupport| |
36
+ # | +--------------+ |
37
+ # +------------------+
38
+ #
39
+ # (You can edit the above AA diagram with http://asciiflow.com/))
40
+ #
41
+ # Fiddley is Ruby-FFI compatible API layer for Fiddle.
37
42
  #
38
43
  # The GR module works without Numo::Narrray.
44
+ # GR3 and GR::Plot depends on numo-narray.
39
45
  #
40
46
  # This is a procedural interface to the GR plotting library,
41
47
  # https://github.com/sciapp/gr
@@ -59,7 +65,7 @@ module GR
59
65
  self.ffi_lib = File.expand_path('lib/libGR.so', ENV['GRDIR'])
60
66
  end
61
67
 
62
- # Change the default encoding to UTF-8
68
+ # Change the default encoding to UTF-8.
63
69
  ENV['GKS_ENCODING'] ||= 'utf8'
64
70
 
65
71
  require_relative 'gr_commons/gr_commons'
@@ -67,16 +73,19 @@ module GR
67
73
  require_relative 'gr/ffi'
68
74
  require_relative 'gr/grbase'
69
75
 
76
+ # `inquiry` methods etc. are defined here.
77
+ extend GRCommons::GRCommonUtils
78
+
79
+ # Support for Jupyter Notebook / Lab.
70
80
  extend GRCommons::JupyterSupport
71
81
 
72
- # `double` is the default type in GR
82
+ # `double` is the default type in GR.
73
83
  # A Ruby array or NArray passed to GR method is automatically converted to
74
- # a FFI::MemoryPointer in the GRBase class.
84
+ # a Fiddley::MemoryPointer in the GRBase class.
75
85
  extend GRBase
76
86
 
77
87
  # Now you can see a lot of methods just calling super here.
78
- # Why? Do they really need?
79
- # Yes. They are written to help the yard generate the documentation.
88
+ # They are written to help the yard generate the documentation.
80
89
  class << self
81
90
  def initgr(*)
82
91
  super
data/lib/gr/grbase.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GR
4
- # This module automatically converts Ruby arrays and Numo::Narray into pointers.
4
+ # This module automatically converts Ruby arrays and Numo::Narray into
5
+ # Fiddley::MemoryPointer.
5
6
  module GRBase
6
7
  extend GRCommons::DefineMethods
7
8
  define_ffi_methods(FFI,
@@ -9,6 +10,4 @@ module GR
9
10
  default_type: :double)
10
11
  end
11
12
  private_constant :GRBase
12
-
13
- extend GRCommons::GRCommonUtils
14
13
  end
data/lib/gr/plot.rb CHANGED
@@ -43,9 +43,9 @@ module GR
43
43
  xform xlabel xlim xlog yflip ylabel ylim ylog zflip zlabel zlim
44
44
  zlog clim subplot].freeze
45
45
 
46
- @@last_plot = nil
47
- def self.last_plot
48
- @@last_plot
46
+ @last_plot = nil
47
+ class << self
48
+ attr_accessor :last_plot
49
49
  end
50
50
 
51
51
  def initialize(*args)
@@ -64,14 +64,14 @@ module GR
64
64
 
65
65
  @args = plot_args(args) # method name is the same as Julia/Python
66
66
  @kvs[:size] ||= [600, 450]
67
- @kvs[:ax] ||= false
67
+ @kvs[:ax] = false if @kvs[:ax].nil?
68
68
  @kvs[:subplot] ||= [0, 1, 0, 1]
69
- @kvs[:clear] ||= true
70
- @kvs[:update] ||= true
69
+ @kvs[:clear] = true if @kvs[:clear].nil?
70
+ @kvs[:update] = true if @kvs[:update].nil?
71
71
  @scheme = 0
72
72
  @background = 0xffffff
73
73
  @handle = nil
74
- @@last_plot = self
74
+ self.class.last_plot = self
75
75
  end
76
76
  attr_accessor :args, :kvs, :scheme
77
77
 
@@ -582,8 +582,7 @@ module GR
582
582
 
583
583
  GR.uselinespec(' ')
584
584
  args.each do |x, y, z, c, spec|
585
- # FIXME
586
- spec ||= ''
585
+ spec ||= kvs[:spec] ||= ''
587
586
  GR.savestate
588
587
  GR.settransparency(kvs[:alpha]) if kvs.has_key?(:alpha)
589
588
 
@@ -795,7 +794,9 @@ module GR
795
794
  colorbar(0.05)
796
795
 
797
796
  when :plot3
798
- GR.polyline3d(x, y, z)
797
+ mask = GR.uselinespec(spec)
798
+ GR.polyline3d(x, y, z) if hasline(mask)
799
+ GR.polymarker3d(x, y, z) if hasmarker(mask)
799
800
  draw_axes(kind, 2)
800
801
 
801
802
  when :scatter3
@@ -858,7 +859,7 @@ module GR
858
859
 
859
860
  draw_legend if %i[line step scatter stem].include?(kind) && kvs.has_key?(:labels)
860
861
 
861
- if kvs.has_key?(:update)
862
+ if kvs[:update]
862
863
  GR.updatews
863
864
  # if GR.isinline()
864
865
  # restore_context()
@@ -978,24 +979,31 @@ module GR
978
979
  [*0..(num - 1)].collect { |i| low + i.to_f * (high - low) / (num - 1) }
979
980
  end
980
981
 
981
- def plot_args(args, _fmt = :xys)
982
+ def plot_args(args)
982
983
  # FIXME
983
984
  args = [args] unless args.all? do |i|
984
985
  i.is_a?(Array) && (i[0].is_a?(Array) || narray?(i[0]))
985
986
  end
986
987
  args.map do |xyzc|
988
+ spec = nil
989
+ case xyzc.last
990
+ when String
991
+ spec = xyzc.pop
992
+ when Hash
993
+ spec = xyzc.pop[:spec]
994
+ end
995
+
987
996
  x, y, z, c = xyzc.map do |i|
988
- if i.is_a?(Array) || narray?(i)
997
+ if i.is_a?(Array) || narray?(i) || i.nil?
989
998
  i
990
999
  elsif i.respond_to?(:to_a)
991
1000
  # Convert an Array-like class such as Daru::Vector to an Array
992
1001
  i.to_a
993
- else
994
- # String
1002
+ else # String
995
1003
  i
996
1004
  end
997
1005
  end
998
- [x, y, z, c]
1006
+ [x, y, z, c, spec]
999
1007
  end
1000
1008
  end
1001
1009
 
@@ -1185,7 +1193,8 @@ module GR
1185
1193
  # (Plot) Draw a heatmap.
1186
1194
  def heatmap(*args)
1187
1195
  # FIXME
1188
- _x, _y, z, kv = parse_args(*args)
1196
+ args, kv = format_xyzc(*args)
1197
+ _x, _y, z = args
1189
1198
  ysize, xsize = z.shape
1190
1199
  z = z.reshape(xsize, ysize)
1191
1200
  create_plot(:heatmap, kv) do |plt|
@@ -1213,15 +1222,13 @@ module GR
1213
1222
  alias _contour_ contour
1214
1223
  # (Plot) Draw a contour plot.
1215
1224
  def contour(*args)
1216
- x, y, z, kv = parse_args(*args)
1217
- create_plot(:contour, x, y, z, kv)
1225
+ create_plot(:contour, *format_xyzc(*args))
1218
1226
  end
1219
1227
 
1220
1228
  alias _contourf_ contourf
1221
1229
  # (Plot) Draw a filled contour plot.
1222
1230
  def contourf(*args)
1223
- x, y, z, kv = parse_args(*args)
1224
- create_plot(:contourf, x, y, z, kv)
1231
+ create_plot(:contourf, *format_xyzc(*args))
1225
1232
  end
1226
1233
 
1227
1234
  alias _hexbin_ hexbin
@@ -1232,21 +1239,18 @@ module GR
1232
1239
 
1233
1240
  # (Plot) Draw a triangular contour plot.
1234
1241
  def tricont(*args)
1235
- x, y, z, kv = parse_args(*args)
1236
- create_plot(:tricont, x, y, z, kv)
1242
+ create_plot(:tricont, *format_xyzc(*args))
1237
1243
  end
1238
1244
 
1239
1245
  # (Plot) Draw a three-dimensional wireframe plot.
1240
1246
  def wireframe(*args)
1241
- x, y, z, kv = parse_args(*args)
1242
- create_plot(:wireframe, x, y, z, kv)
1247
+ create_plot(:wireframe, *format_xyzc(*args))
1243
1248
  end
1244
1249
 
1245
1250
  # (Plot) Draw a three-dimensional surface plot.
1246
1251
  alias _surface_ surface
1247
1252
  def surface(*args)
1248
- x, y, z, kv = parse_args(*args)
1249
- create_plot(:surface, x, y, z, kv)
1253
+ create_plot(:surface, *format_xyzc(*args))
1250
1254
  end
1251
1255
 
1252
1256
  # (Plot)
@@ -1256,8 +1260,7 @@ module GR
1256
1260
 
1257
1261
  # (Plot) Draw a triangular surface plot.
1258
1262
  def trisurf(*args)
1259
- x, y, z, kv = parse_args(*args)
1260
- create_plot(:trisurf, x, y, z, kv)
1263
+ create_plot(:trisurf, *format_xyzc(*args))
1261
1264
  end
1262
1265
 
1263
1266
  # (Plot) Draw one or more three-dimensional line plots.
@@ -1326,6 +1329,33 @@ module GR
1326
1329
  end
1327
1330
  end
1328
1331
 
1332
+ def hold(flag = true)
1333
+ plt = GR::Plot.last_plot
1334
+ plt.kvs.slice(:window, :scale, :xaxis, :yaxis, :zaxis).merge({ ax: flag, clear: !flag })
1335
+ end
1336
+
1337
+ # Set current subplot index.
1338
+ def subplot(nr, nc, p)
1339
+ xmin = 1
1340
+ xmax = 0
1341
+ ymin = 1
1342
+ ymax = 0
1343
+ p = [p] if p.is_a? Integer
1344
+ p.each do |i|
1345
+ r = (nr - (i - 1) / nc).to_f
1346
+ c = ((i - 1) % nc + 1).to_f
1347
+ xmin = [xmin, (c - 1) / nc].min
1348
+ xmax = [xmax, c / nc].max
1349
+ ymin = [ymin, (r - 1) / nr].min
1350
+ ymax = [ymax, r / nr].max
1351
+ end
1352
+ {
1353
+ subplot: [xmin, xmax, ymin, ymax],
1354
+ clear: p[0] == 1,
1355
+ update: p[-1] == nr * nc
1356
+ }
1357
+ end
1358
+
1329
1359
  # (Plot) Save the current figure to a file.
1330
1360
  def savefig(filename, kv = {})
1331
1361
  GR.beginprint(filename)
@@ -1337,40 +1367,41 @@ module GR
1337
1367
 
1338
1368
  private
1339
1369
 
1340
- def create_plot(type, *args, &block)
1370
+ def create_plot(type, *args)
1341
1371
  plt = GR::Plot.new(*args)
1342
1372
  plt.kvs[:kind] = type
1343
- block.call(plt) if block_given?
1373
+ yield(plt) if block_given?
1344
1374
  plt.plot_data
1345
1375
  plt
1346
1376
  end
1347
1377
 
1348
- def parse_args(*args)
1378
+ def format_xyzc(*args)
1349
1379
  kv = if args[-1].is_a? Hash
1350
1380
  args.pop
1351
1381
  else
1352
1382
  {}
1353
1383
  end
1354
- if args.size == 1
1355
- if args[0].is_a? Array
1356
- z = Numo::DFloat.cast(args[0])
1357
- elsif narray?(args[0])
1358
- z = args[0]
1384
+
1385
+ args = [args] unless args.all? do |i|
1386
+ i.is_a?(Array) && (i[0].is_a?(Array) || narray?(i[0]))
1387
+ end
1388
+ args.map! do |xyzc|
1389
+ if xyzc.size == 1
1390
+ if xyzc[0].is_a? Array
1391
+ z = Numo::DFloat.cast(xyzc[0])
1392
+ elsif narray?(xyzc[0])
1393
+ z = xyzc[0]
1394
+ end
1395
+ xsize, ysize = z.shape
1396
+ x = (1..ysize).to_a * xsize
1397
+ y = (1..xsize).map { |i| Array.new(ysize, i) }.flatten
1398
+ [x, y, z]
1399
+ else
1400
+
1401
+ xyzc
1359
1402
  end
1360
- xsize, ysize = z.shape
1361
- # NOTE:
1362
- # See
1363
- # https://github.com/jheinen/GR.jl/pull/246
1364
- # https://github.com/jheinen/GR.jl/issues/241
1365
- x = (1..ysize).to_a * xsize
1366
- y = (1..xsize).map { |i| Array.new(ysize, i) }.flatten
1367
-
1368
- elsif args.size == 3
1369
- x, y, z = args
1370
- else
1371
- raise
1372
1403
  end
1373
- [x, y, z, kv]
1404
+ [*args, kv]
1374
1405
  end
1375
1406
 
1376
1407
  def hist(x, nbins = 0)
data/lib/gr3.rb CHANGED
@@ -2,43 +2,48 @@
2
2
 
3
3
  # OverView of GR.rb
4
4
  #
5
- # +--------------------+
6
- # +-------------------+ | GR3 module |
7
- # | GR module | | +----------------+ |
8
- # | +---------------+ | | | GR3::FFI | |
9
- # | | GR::FFI | | | | + libGR3.so | |
10
- # | | + libGR.so | | | +----------------+ |
11
- # | +---------------+ | | | define_method |
12
- # | | define_method | | +----------------+ |
13
- # | +---------------+ | | | | GR3::GR3Base | |
14
- # | | | GR::GRBase | | | | v (Private) | |
15
- # | | v (Private) | | | +++--------------+ |
16
- # | +++-------------+ | | | Extend |
17
- # | | Extend | | v +------+ |
18
- # | v | | |Check | |
19
- # | | | <--+Error | |
20
- # +-------+-----------+ | +------+ |
21
- # ^ +---------+----------+
22
- # | +------------------+ ^
23
- # Extend | | GRCommons module | | Extend
24
- # | | +--------------+ | |
25
- # | | | Fiddley | | |
26
- # | | +--------------+ | |
27
- # | | +--------------+ | |
28
- # +----+ CommonUtils +----+
29
- # | | +--------------+ | |
30
- # | | +--------------+ | |
31
- # +----+ Version +----+
32
- # | | +--------------+ |
33
- # | | +--------------+ |
34
- # +----+JupyterSupport| |
35
- # | +--------------+ |
36
- # +------------------+
5
+ # +--------------------+ +--------------------+
6
+ # | GR module | | GR3 module |
7
+ # | +----------------+ | | +----------------+ |
8
+ # | | GR::FFI | | | | GR3::FFI | |
9
+ # | | + libGR.so | | | | + libGR3.so | |
10
+ # | +----------------+ | | +----------------+ |
11
+ # | | define_method | | | define_method |
12
+ # | +----------------+ | | +----------------+ |
13
+ # | | | GR::GRBase | | | | | GR3::GR3Base | |
14
+ # | | v (Pri^ate) | | | | v (Pri^ate) | |
15
+ # | +++--------------+ | | +++--------------+ |
16
+ # | | Extend | | | Extend |
17
+ # | v | | v +-------+ |
18
+ # | +-----------+ | | | Check | |
19
+ # | | GR::Plot | | | <--+ Error | |
20
+ # | +-----------+ | | +-------+ |
21
+ # +--------------------+ +----------+---------+
22
+ # ^ ^
23
+ # | +------------------+ |
24
+ # Extend | | GRCommons module | | Extend
25
+ # | | +--------------+ | |
26
+ # | | | Fiddley | | |
27
+ # | | +--------------+ | |
28
+ # | | +--------------+ | |
29
+ # +----+ CommonUtils +----+
30
+ # | | +--------------+ | |
31
+ # | | +--------------+ | |
32
+ # +----+ Version +----+
33
+ # | | +--------------+ |
34
+ # | | +--------------+ |
35
+ # +----+JupyterSupport| |
36
+ # | +--------------+ |
37
+ # +------------------+
38
+ #
39
+ # (You can edit the above AA diagram with http://asciiflow.com/)
40
+ #
41
+ # Fiddley is Ruby-FFI compatible API layer for Fiddle.
37
42
  #
38
43
  # Why not GR::GR3?
39
44
  # * kojix2 did not want to force gr3 to be loaded when gr is loaded.
40
45
  # * kojix2 did not want to write `GR3 = GR::GR3` or something.
41
- # * This is a opinion of kojix2 and may be changed in the future.
46
+ # * This is a opinion of kojix2 and may be changed by future maintainers.
42
47
  #
43
48
  # GR3 uses Numo::Narrray.
44
49
  # * It is difficult to write GR3 modules with only Ruby arrays.
@@ -68,7 +73,7 @@ module GR3
68
73
  self.ffi_lib = File.expand_path('lib/libGR3.so', ENV['GRDIR'])
69
74
  end
70
75
 
71
- # change the default encoding to UTF-8
76
+ # change the default encoding to UTF-8.
72
77
  ENV['GKS_ENCODING'] ||= 'utf8'
73
78
 
74
79
  require_relative 'gr_commons/gr_commons'
@@ -76,9 +81,12 @@ module GR3
76
81
  require_relative 'gr3/ffi'
77
82
  require_relative 'gr3/gr3base'
78
83
 
79
- # `float` is the default type in GR3
84
+ # `inquiry` methods etc. are defined here.
85
+ extend GRCommons::GRCommonUtils
86
+
87
+ # `float` is the default type in GR3.
80
88
  # A Ruby array or NArray passed to GR3 method is automatically converted to
81
- # a FFI::MemoryPointer in the GR3Base class.
89
+ # a Fiddley::MemoryPointer in the GR3Base class.
82
90
  extend GR3Base
83
91
 
84
92
  # This module is for adding error checking to all methods in GR3.
@@ -113,8 +121,7 @@ module GR3
113
121
  extend CheckError
114
122
 
115
123
  # Now you can see a lot of methods just calling super here.
116
- # Why? Do they really need?
117
- # Yes. They are written to help the yard generate the documentation.
124
+ # They are written to help the yard generate the documentation.
118
125
  class << self
119
126
  # This method initializes the gr3 context.
120
127
  # @return [Integer]
data/lib/gr3/gr3base.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GR3
4
- # This module automatically converts Ruby arrays and Numo::Narray into pointers.
4
+ # This module automatically converts Ruby arrays and Numo::Narray into
5
+ # Fiddley::MemoryPointer.
5
6
  module GR3Base
6
7
  extend GRCommons::DefineMethods
7
8
  define_ffi_methods(FFI,
@@ -15,6 +16,4 @@ module GR3
15
16
  default_type: :double)
16
17
  end
17
18
  private_constant :GR3Base
18
-
19
- extend GRCommons::GRCommonUtils
20
19
  end
@@ -16,9 +16,9 @@ module GRCommons
16
16
  args.map! do |arg|
17
17
  case arg
18
18
  when Array
19
- send(default_type, arg)
19
+ GRCommons::GRCommonUtils.send(default_type, arg)
20
20
  when ->(x) { defined?(Numo::NArray) && x.is_a?(Numo::NArray) }
21
- send(default_type, arg)
21
+ GRCommons::GRCommonUtils.send(default_type, arg)
22
22
  else
23
23
  arg
24
24
  end
@@ -3,7 +3,7 @@
3
3
  require 'fiddle/import'
4
4
 
5
5
  module GRCommons
6
- # Fiddley v0.0.8
6
+ # Fiddley v0.0.8 - Ruby-FFI compatible API layer for Fiddle
7
7
  # https://github.com/unak/fiddley
8
8
  #
9
9
  # Copyright (c) 2017 NAKAMURA Usaku usa@garbagecollect.jp
@@ -5,7 +5,7 @@ require 'gr_commons/fiddley'
5
5
  module GRCommons
6
6
  # This module provides functionality common to GR and GR3.
7
7
  module GRCommonUtils
8
- private
8
+ module_function
9
9
 
10
10
  def equal_length(*args)
11
11
  lengths = args.map(&:length)
@@ -17,34 +17,60 @@ module GRCommons
17
17
  lengths[0]
18
18
  end
19
19
 
20
+ # This constants is used in the test.
20
21
  SUPPORTED_TYPES = %i[uint8 uint16 int uint double float].freeze
21
22
 
22
- # NOTE: The following method converts Ruby Array or NArray into packed string.
23
- SUPPORTED_TYPES.each do |type|
24
- define_method(type) do |data|
25
- case data
26
- when Array
27
- data = data.flatten
28
- Fiddley::Utils.array2str(type, data)
29
- when ->(x) { narray?(x) }
30
- case type
31
- when :uint8
32
- Numo::UInt8.cast(data).to_binary
33
- when :uint16
34
- Numo::UInt16.cast(data).to_binary
35
- when :int
36
- Numo::Int32.cast(data).to_binary
37
- when :uint
38
- Numo::UInt32.cast(data).to_binary
39
- when :double
40
- Numo::DFloat.cast(data).to_binary
41
- when :float
42
- Numo::SFloat.cast(data).to_binary
43
- end
44
- else
45
- data = data.to_a.flatten
46
- Fiddley::Utils.array2str(type, data)
47
- end
23
+ # convert Ruby Array or NArray into packed string.
24
+ def uint8(data)
25
+ if narray?(data)
26
+ Numo::UInt8.cast(data).to_binary
27
+ else
28
+ Fiddley::Utils.array2str(:uint8, data.to_a.flatten)
29
+ end
30
+ end
31
+
32
+ # convert Ruby Array or NArray into packed string.
33
+ def uint16(data)
34
+ if narray?(data)
35
+ Numo::UInt16.cast(data).to_binary
36
+ else
37
+ Fiddley::Utils.array2str(:uint16, data.to_a.flatten)
38
+ end
39
+ end
40
+
41
+ # convert Ruby Array or NArray into packed string.
42
+ def int(data)
43
+ if narray?(data)
44
+ Numo::Int32.cast(data).to_binary
45
+ else
46
+ Fiddley::Utils.array2str(:int32, data.to_a.flatten)
47
+ end
48
+ end
49
+
50
+ # convert Ruby Array or NArray into packed string.
51
+ def uint(data)
52
+ if narray?(data)
53
+ Numo::UInt32.cast(data).to_binary
54
+ else
55
+ Fiddley::Utils.array2str(:uint, data.to_a.flatten)
56
+ end
57
+ end
58
+
59
+ # convert Ruby Array or NArray into packed string.
60
+ def double(data)
61
+ if narray?(data)
62
+ Numo::DFloat.cast(data).to_binary
63
+ else
64
+ Fiddley::Utils.array2str(:double, data.to_a.flatten)
65
+ end
66
+ end
67
+
68
+ # convert Ruby Array or NArray into packed string.
69
+ def float(data)
70
+ if narray?(data)
71
+ Numo::SFloat.cast(data).to_binary
72
+ else
73
+ Fiddley::Utils.array2str(:float, data.to_a.flatten)
48
74
  end
49
75
  end
50
76
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GRCommons
4
- VERSION = '0.0.15'
4
+ VERSION = '0.0.16'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-gr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - kojix2
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-03 00:00:00.000000000 Z
11
+ date: 2020-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler