zig_example 0.1.0 → 0.2.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/ext/zigrb_ackermann/build.zig +49 -0
- data/ext/zigrb_ackermann/extconf.rb +20 -0
- data/ext/zigrb_ackermann/src/main.zig +37 -0
- data/lib/zig_example/version.rb +1 -1
- data/lib/zig_example.rb +9 -4
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78cf562dbd8af1b7d9badd8701f811d23c53566e0533fd85d708d7aa8aacfae8
|
4
|
+
data.tar.gz: 16379b58200d91656978a9ec696efc9f13b0b4b43ee4be590efe82504cfc4d29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3130b68fb94dbbe6de189f122c9bf3b43be22a8fdff6fa827604cd081608a96e88252eb051f39669a7b216c69ed0c460b79ba1a85508f86887d9f3b653c1f96
|
7
|
+
data.tar.gz: 8ca455621357daafa0f059f4137e4370bad1c813367bb13e86a9d9c658fa9a131bf105dd3699d76190d1c2a85d4c1eb2e316491142f0734d44c2485f07146ae9
|
@@ -0,0 +1,49 @@
|
|
1
|
+
const std = @import("std");
|
2
|
+
|
3
|
+
pub fn build(b: *std.Build) void {
|
4
|
+
const optimize = b.standardOptimizeOption(.{});
|
5
|
+
const target = b.standardTargetOptions(.{});
|
6
|
+
|
7
|
+
var rubylibdir = std.os.getenv("RUBYLIBDIR") orelse "";
|
8
|
+
var rubyhdrdir = std.os.getenv("RUBYHDRDIR") orelse "";
|
9
|
+
var rubyarchhdrdir = std.os.getenv("RUBYARCHHDRDIR") orelse "";
|
10
|
+
|
11
|
+
////////////////////////////////////////////////////////////////
|
12
|
+
// lib
|
13
|
+
|
14
|
+
const lib = b.addSharedLibrary(.{
|
15
|
+
.name = "zigrb_ackermann",
|
16
|
+
.root_source_file = .{ .path = "src/main.zig" },
|
17
|
+
.target = target,
|
18
|
+
.optimize = optimize,
|
19
|
+
});
|
20
|
+
|
21
|
+
lib.addLibraryPath(rubylibdir);
|
22
|
+
lib.addIncludePath(rubyhdrdir);
|
23
|
+
lib.addIncludePath(rubyarchhdrdir);
|
24
|
+
|
25
|
+
lib.linkSystemLibrary("ruby");
|
26
|
+
lib.linkSystemLibrary("c");
|
27
|
+
|
28
|
+
b.installArtifact(lib);
|
29
|
+
|
30
|
+
////////////////////////////////////////////////////////////////
|
31
|
+
// test
|
32
|
+
|
33
|
+
const unit_tests = b.addTest(.{
|
34
|
+
.root_source_file = .{ .path = "src/main.zig" },
|
35
|
+
.target = target,
|
36
|
+
.optimize = optimize,
|
37
|
+
});
|
38
|
+
|
39
|
+
unit_tests.addLibraryPath(rubylibdir);
|
40
|
+
unit_tests.addIncludePath(rubyhdrdir);
|
41
|
+
unit_tests.addIncludePath(rubyarchhdrdir);
|
42
|
+
|
43
|
+
unit_tests.linkSystemLibrary("ruby");
|
44
|
+
unit_tests.linkSystemLibrary("c");
|
45
|
+
|
46
|
+
const run_unit_tests = b.addRunArtifact(unit_tests);
|
47
|
+
const test_step = b.step("test", "Run unit tests");
|
48
|
+
test_step.dependOn(&run_unit_tests.step);
|
49
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
$objs = ['']
|
4
|
+
$srcs = ['']
|
5
|
+
TARGET = 'libzigrb_ackermann'
|
6
|
+
|
7
|
+
create_makefile TARGET
|
8
|
+
File.open('Makefile', 'a') do |f|
|
9
|
+
f.puts <<~MFILE
|
10
|
+
|
11
|
+
clean: clean-zig
|
12
|
+
clean-zig:
|
13
|
+
\t-$(Q)$(RM) -rf zig-cache zig-out
|
14
|
+
|
15
|
+
#{TARGET}.so: Makefile build.zig src/main.zig
|
16
|
+
\tenv -u DESTDIR RUBYLIBDIR=$(rubylibdir) RUBYHDRDIR=$(rubyhdrdir) RUBYARCHHDRDIR=$(rubyarchhdrdir) zig build test install
|
17
|
+
\tcp -v zig-out/lib/#{TARGET}.so .
|
18
|
+
|
19
|
+
MFILE
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
const std = @import("std");
|
2
|
+
const ruby = @cImport(@cInclude("ruby/ruby.h"));
|
3
|
+
const testing = std.testing;
|
4
|
+
|
5
|
+
// https://rosettacode.org/wiki/Ackermann_function#Zig
|
6
|
+
pub fn ack(m: c_int, n: c_int) c_int {
|
7
|
+
if (m == 0) return n + 1;
|
8
|
+
if (n == 0) return ack(m - 1, 1);
|
9
|
+
return ack(m - 1, ack(m, n - 1));
|
10
|
+
}
|
11
|
+
|
12
|
+
fn rb_ack(...) callconv(.C) ruby.VALUE {
|
13
|
+
var ap = @cVaStart();
|
14
|
+
defer @cVaEnd(&ap);
|
15
|
+
|
16
|
+
// first argument is `self` in ruby; discard it
|
17
|
+
var self = @cVaArg(&ap, ruby.VALUE); _ = self;
|
18
|
+
|
19
|
+
// back and forth type conversions + delegation
|
20
|
+
var m = ruby.NUM2INT(@cVaArg(&ap, ruby.VALUE));
|
21
|
+
var n = ruby.NUM2INT(@cVaArg(&ap, ruby.VALUE));
|
22
|
+
return ruby.INT2NUM(ack(m, n));
|
23
|
+
}
|
24
|
+
|
25
|
+
export fn Init_libzigrb_ackermann() void {
|
26
|
+
ruby.ruby_init();
|
27
|
+
var zig_rb_class: ruby.VALUE = ruby.rb_define_class("ZigExample", ruby.rb_cObject);
|
28
|
+
_ = ruby.rb_define_method(zig_rb_class, "ack", rb_ack, 2);
|
29
|
+
}
|
30
|
+
|
31
|
+
test "ack(0, 0) passes" {
|
32
|
+
try testing.expect(ack(0, 0) == 1);
|
33
|
+
}
|
34
|
+
|
35
|
+
test "ack(3, 4) passes" {
|
36
|
+
try testing.expect(ack(3, 4) == 125);
|
37
|
+
}
|
data/lib/zig_example/version.rb
CHANGED
data/lib/zig_example.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
require_relative 'zig_example/version'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
%w{
|
4
|
+
zigrb_100doors
|
5
|
+
zigrb_ackermann
|
6
|
+
}.each do |lib|
|
7
|
+
begin
|
8
|
+
require "lib#{lib}"
|
9
|
+
rescue LoadError
|
10
|
+
require_relative "../ext/#{lib}/lib#{lib}"
|
11
|
+
end
|
7
12
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zig_example
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frank J. Cameron
|
@@ -16,11 +16,15 @@ email:
|
|
16
16
|
executables: []
|
17
17
|
extensions:
|
18
18
|
- ext/zigrb_100doors/extconf.rb
|
19
|
+
- ext/zigrb_ackermann/extconf.rb
|
19
20
|
extra_rdoc_files: []
|
20
21
|
files:
|
21
22
|
- ext/zigrb_100doors/build.zig
|
22
23
|
- ext/zigrb_100doors/extconf.rb
|
23
24
|
- ext/zigrb_100doors/src/main.zig
|
25
|
+
- ext/zigrb_ackermann/build.zig
|
26
|
+
- ext/zigrb_ackermann/extconf.rb
|
27
|
+
- ext/zigrb_ackermann/src/main.zig
|
24
28
|
- lib/zig_example.rb
|
25
29
|
- lib/zig_example/version.rb
|
26
30
|
homepage: https://gitlab.com/fjc/ruby-zig_example
|