zig_example 0.1.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 +7 -0
- data/ext/zigrb_100doors/build.zig +49 -0
- data/ext/zigrb_100doors/extconf.rb +20 -0
- data/ext/zigrb_100doors/src/main.zig +53 -0
- data/lib/zig_example/version.rb +5 -0
- data/lib/zig_example.rb +7 -0
- metadata +51 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 260dd4c8b12f9b2c17421f30a42f1b3db48f5c8aa829da99bf9401e8792eb545
|
4
|
+
data.tar.gz: 15de9092ee7235cfdb0b8631bdf5ac322e3725f0768f988d251907b76d1ddedb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ab303f22055fd6f39993ad4d99a5069ec69c8f134606ee04bae141b1f29057125a52a8a1796c1f0e66fc64d8f2bbdb5f2f7654e3d2f9c4b48ec09449a3932ee6
|
7
|
+
data.tar.gz: 906c175473e4f67ac945002d0db22ce0b2437b5530483fa51a5f2919b11e22486e077efe028140281a71da836ecfeb0e7245cdcbdf8924b9d3d8a6cde98be0b1
|
@@ -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_100doors",
|
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_100doors'
|
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,53 @@
|
|
1
|
+
const std = @import("std");
|
2
|
+
const ruby = @cImport(@cInclude("ruby/ruby.h"));
|
3
|
+
const testing = std.testing;
|
4
|
+
|
5
|
+
// Calculate number of open doors after N passes
|
6
|
+
// Code taken from Rosetta Code: https://rosettacode.org/wiki/100_doors#Zig
|
7
|
+
fn hundred_doors(passes: c_int) c_int {
|
8
|
+
var doors = [_]bool{false} ** 101;
|
9
|
+
var pass: u8 = 1;
|
10
|
+
var door: u8 = undefined;
|
11
|
+
|
12
|
+
while (pass <= passes) : (pass += 1) {
|
13
|
+
door = pass;
|
14
|
+
while (door <= 100) : (door += pass)
|
15
|
+
doors[door] = !doors[door];
|
16
|
+
}
|
17
|
+
|
18
|
+
var num_open: u8 = 0;
|
19
|
+
for (doors) |open| {
|
20
|
+
if (open)
|
21
|
+
num_open += 1;
|
22
|
+
}
|
23
|
+
return num_open;
|
24
|
+
}
|
25
|
+
|
26
|
+
// This is a wrapper for hundred_doors function to make it work with Ruby.
|
27
|
+
fn rb_hundred_doors(...) callconv(.C) ruby.VALUE {
|
28
|
+
var ap = @cVaStart();
|
29
|
+
defer @cVaEnd(&ap);
|
30
|
+
|
31
|
+
// first argument is `self`, but we don't use it so we need to discard it
|
32
|
+
var self = @cVaArg(&ap, ruby.VALUE);
|
33
|
+
_ = self;
|
34
|
+
|
35
|
+
// back and forth conversion from Ruby types to internal types + delegation to
|
36
|
+
// actual `hundred_doors` function
|
37
|
+
var passes = ruby.NUM2INT(@cVaArg(&ap, ruby.VALUE));
|
38
|
+
return ruby.INT2NUM(hundred_doors(passes));
|
39
|
+
}
|
40
|
+
|
41
|
+
export fn Init_libzigrb_100doors() void {
|
42
|
+
ruby.ruby_init();
|
43
|
+
var zig_rb_class: ruby.VALUE = ruby.rb_define_class("ZigExample", ruby.rb_cObject);
|
44
|
+
_ = ruby.rb_define_method(zig_rb_class, "hundred_doors", rb_hundred_doors, 1);
|
45
|
+
}
|
46
|
+
|
47
|
+
test "hundred doors 100 passes" {
|
48
|
+
try testing.expect(hundred_doors(100) == 10);
|
49
|
+
}
|
50
|
+
|
51
|
+
test "hundred_doors 1 pass" {
|
52
|
+
try testing.expect(hundred_doors(1) == 100);
|
53
|
+
}
|
data/lib/zig_example.rb
ADDED
metadata
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zig_example
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Frank J. Cameron
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-04-21 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
- fjc@fastmail.net
|
16
|
+
executables: []
|
17
|
+
extensions:
|
18
|
+
- ext/zigrb_100doors/extconf.rb
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- ext/zigrb_100doors/build.zig
|
22
|
+
- ext/zigrb_100doors/extconf.rb
|
23
|
+
- ext/zigrb_100doors/src/main.zig
|
24
|
+
- lib/zig_example.rb
|
25
|
+
- lib/zig_example/version.rb
|
26
|
+
homepage: https://gitlab.com/fjc/ruby-zig_example
|
27
|
+
licenses:
|
28
|
+
- MIT
|
29
|
+
metadata:
|
30
|
+
homepage_uri: https://gitlab.com/fjc/ruby-zig_example
|
31
|
+
source_code_uri: https://gitlab.com/fjc/ruby-zig_example
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.6.0
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubygems_version: 3.2.5
|
48
|
+
signing_key:
|
49
|
+
specification_version: 4
|
50
|
+
summary: An example gem for ruby with a native zig extension.
|
51
|
+
test_files: []
|