r4r 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 503aaa9fc4fa100b6bb5e2962146523ebe0141e2
4
+ data.tar.gz: 5c62f478f3e0b8c8e9974bea14ce0649489298a1
5
+ SHA512:
6
+ metadata.gz: d3b54ded1917f54d95a5d16519ddf0c60efd41c744dde4587905fe4b3995a5b35ccfdc0b5d5dfedef28532d9b639b42b47bec4aa2e47669169d1fbd43abc9576
7
+ data.tar.gz: ae5ed5bc6472c53519b1fda0b506476c21e29f8f9b3e8964938d1603a32c191880ccd431fab60568144aaf95693715295f69e9053a72aa1e07c3402838040159
@@ -0,0 +1,110 @@
1
+ version: 2
2
+
3
+ shared_ghpages: &shared_ghpages
4
+ working_directory: ~/repo
5
+ environment:
6
+ TERM: dump
7
+
8
+ steps:
9
+ - checkout
10
+ # Download and cache dependencies
11
+ - restore_cache:
12
+ keys:
13
+ - v1-dependencies-{{ .Environment.CIRCLE_STAGE }}-{{ checksum "Gemfile.lock" }}
14
+ - v1-dependencies-
15
+
16
+ - run:
17
+ name: install dependencies
18
+ command: |
19
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
20
+
21
+ - save_cache:
22
+ paths:
23
+ - ./vendor/bundle
24
+ key: v1-dependencies-{{ .Environment.CIRCLE_STAGE }}-{{ checksum "Gemfile.lock" }}
25
+
26
+ - add-ssh-keys:
27
+ fingerprints:
28
+ - "af:38:77:24:f4:c6:33:f2:74:60:e5:cc:76:0e:a7:ad"
29
+
30
+ - run:
31
+ name: publish gh-pages
32
+ command: |
33
+ git config --global user.email "ghpages@dmexe.me"
34
+ git config --global user.name $CIRCLE_USERNAME
35
+ bin/ghpages
36
+
37
+ shared_ruby_build: &shared_ruby_build
38
+ working_directory: ~/repo
39
+ environment:
40
+ TERM: dump
41
+
42
+ steps:
43
+ - checkout
44
+ # Download and cache dependencies
45
+ - restore_cache:
46
+ keys:
47
+ - v1-dependencies-{{ .Environment.CIRCLE_STAGE }}-{{ checksum "Gemfile.lock" }}
48
+ - v1-dependencies-
49
+
50
+ - run:
51
+ name: install dependencies
52
+ command: |
53
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
54
+
55
+ - save_cache:
56
+ paths:
57
+ - ./vendor/bundle
58
+ key: v1-dependencies-{{ .Environment.CIRCLE_STAGE }}-{{ checksum "Gemfile.lock" }}
59
+
60
+ - run:
61
+ name: compile
62
+ command: |
63
+ bin/rake compile
64
+
65
+ - run:
66
+ name: run tests
67
+ command: |
68
+ bin/rake test TESTOPTS="--ci-dir=$CIRCLE_TEST_REPORTS/reports"
69
+
70
+ - run:
71
+ name: run bench
72
+ command: |
73
+ bin/rake bench
74
+
75
+ - store_test_results:
76
+ path: /reports
77
+
78
+ - store_artifacts:
79
+ path: /reports
80
+ destination: test-results
81
+
82
+ jobs:
83
+ ruby22:
84
+ <<: *shared_ruby_build
85
+ docker:
86
+ - image: ruby:2.2
87
+ ruby24:
88
+ <<: *shared_ruby_build
89
+ docker:
90
+ - image: ruby:2.4
91
+ ghpages:
92
+ <<: *shared_ghpages
93
+ docker:
94
+ - image: ruby:2.4
95
+
96
+ workflows:
97
+ version: 2
98
+ build-test-deploy:
99
+ jobs:
100
+ - ruby22
101
+ - ruby24
102
+ - ghpages:
103
+ requires:
104
+ - ruby22
105
+ - ruby24
106
+ filters:
107
+ branches:
108
+ only: master
109
+
110
+
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /pkg/
6
+ /spec/reports/
7
+ /tmp/
8
+ *.bundle
9
+ *.o
10
+ /html/
11
+ /test/reports/
12
+ /docs/
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in r4r.gemspec
6
+ gemspec
@@ -0,0 +1,39 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ r4r (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ansi (1.5.0)
10
+ builder (3.2.3)
11
+ minitest (5.10.3)
12
+ minitest-ci (3.3.0)
13
+ minitest (>= 5.0.6)
14
+ minitest-reporters (1.1.19)
15
+ ansi
16
+ builder
17
+ minitest (>= 5.0)
18
+ ruby-progressbar
19
+ rake (11.3.0)
20
+ rake-compiler (1.0.4)
21
+ rake
22
+ ruby-progressbar (1.9.0)
23
+ yard (0.9.12)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ bundler (~> 1.15)
30
+ minitest (~> 5.0)
31
+ minitest-ci (~> 3.3)
32
+ minitest-reporters (~> 1.1)
33
+ r4r!
34
+ rake (~> 11.0)
35
+ rake-compiler (~> 1.0)
36
+ yard (~> 0.9)
37
+
38
+ BUNDLED WITH
39
+ 1.16.0
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Dmitry Galinsky
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,15 @@
1
+ # R4r
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ gem 'r4r'
8
+
9
+ And then execute:
10
+
11
+ $ bundle
12
+
13
+ Or install it yourself as:
14
+
15
+ $ gem install r4r
@@ -0,0 +1,38 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ Rake::TestTask.new(:bench) do |t|
11
+ t.libs << "test"
12
+ t.libs << "lib"
13
+ t.test_files = FileList["test/**/benchmark_*.rb"]
14
+ end
15
+
16
+ task :default => :test
17
+
18
+ require 'rake/extensiontask'
19
+ spec = Gem::Specification.load('r4r.gemspec')
20
+
21
+ Dir.glob("ext/r4r/*").each do |dirname|
22
+ extname = File.basename dirname
23
+
24
+ Rake::ExtensionTask.new do |ext|
25
+ ext.name = extname
26
+ ext.ext_dir = dirname
27
+ ext.lib_dir = 'lib/r4r'
28
+ ext.gem_spec = spec
29
+ end
30
+
31
+ end
32
+
33
+ require 'yard'
34
+ YARD::Rake::YardocTask.new do |t|
35
+ t.files = ['lib/**/*.rb', 'ext/**/*.c']
36
+ t.options = ['-r', 'README.md', '-o', 'docs']
37
+ t.stats_options = ['--list-undoc']
38
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "r4r"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,19 @@
1
+ #!/bin/bash
2
+
3
+ set -ex
4
+
5
+ git diff-index --quiet HEAD -- || (
6
+ echo "Uncommitted changes detected"
7
+ exit 1
8
+ )
9
+
10
+ bin/rake yard
11
+
12
+ git add -f docs
13
+ git commit -m 'add /docs'
14
+
15
+ git push origin `git subtree split --prefix docs HEAD`:gh-pages --force
16
+ git reset --hard HEAD~1
17
+
18
+ echo ""
19
+ echo "DONE"
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bash
2
+ exec bundle exec rake $@
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+ bundle exec rake compile
8
+
9
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,7 @@
1
+ require "mkmf"
2
+
3
+ $CFLAGS = "-O2 -Wall -std=c99"
4
+
5
+ extension_name = 'ring_bits_ext'
6
+ dir_config(extension_name)
7
+ create_makefile "#{extension_name}"
@@ -0,0 +1,173 @@
1
+ #include <ruby.h>
2
+ #include <stdint.h>
3
+ #include <stdio.h>
4
+ #include <stdbool.h>
5
+ #include <assert.h>
6
+
7
+ #define ADDRESS_BITS_PER_WORD 6
8
+
9
+ struct ring_bits_ext {
10
+ size_t size; //the size of the ring bit set
11
+ uint64_t * words;
12
+ };
13
+
14
+ /**
15
+ * Free resources allocated for ring_bits_ext.
16
+ */
17
+ static void
18
+ ring_bits_ext_free(void *p) {
19
+ struct ring_bits_ext *ptr = p;
20
+ if (ptr->size > 0) {
21
+ free(ptr->words);
22
+ }
23
+ }
24
+
25
+ /**
26
+ * Given a bit index, return word index containing it.
27
+ */
28
+ size_t
29
+ ring_bits_ext_word_index(int bit_index) {
30
+ return bit_index >> ADDRESS_BITS_PER_WORD;
31
+ }
32
+
33
+ /**
34
+ * Allocates resources for a ring_bits_ext.
35
+ */
36
+ static VALUE
37
+ ring_bits_ext_alloc(VALUE klass) {
38
+ VALUE obj;
39
+ struct ring_bits_ext *ptr;
40
+
41
+ obj = Data_Make_Struct(klass, struct ring_bits_ext, NULL, ring_bits_ext_free, ptr);
42
+ ptr->size = 0;
43
+ ptr->words = NULL;
44
+
45
+ return obj;
46
+ }
47
+
48
+ /**
49
+ * Inits a new ring_bits_ext object.
50
+ *
51
+ * @param [Fixnum] capacity a ring bits buffer size.
52
+ * @raise [ArgumentError] if capacity is negative
53
+ */
54
+ static VALUE
55
+ ring_bits_ext_init(VALUE self, VALUE capacity) {
56
+ struct ring_bits_ext *ptr;
57
+ int ring_bits_ext_size = NUM2INT(capacity);
58
+
59
+ if (0 >= ring_bits_ext_size) {
60
+ rb_raise(rb_eArgError, "ring bit's size must be positive, got %i", ring_bits_ext_size);
61
+ return Qnil;
62
+ }
63
+
64
+ size_t count_of_words_required = ring_bits_ext_word_index(ring_bits_ext_size - 1) + 1;
65
+
66
+ Data_Get_Struct(self, struct ring_bits_ext, ptr);
67
+ ptr->size = count_of_words_required << ADDRESS_BITS_PER_WORD;
68
+ ptr->words = calloc(count_of_words_required, sizeof(uint64_t));
69
+
70
+ return self;
71
+ }
72
+
73
+ /**
74
+ * Returns an actual ring bits capacity.
75
+ */
76
+ static VALUE
77
+ ring_bits_ext_get_size(VALUE self) {
78
+ struct ring_bits_ext *ptr;
79
+ Data_Get_Struct(self, struct ring_bits_ext, ptr);
80
+ return SIZET2NUM(ptr->size);
81
+ }
82
+
83
+ bool
84
+ _ring_bits_ext_set(struct ring_bits_ext *ptr, int bit_index, bool value) {
85
+ assert(bit_index >= 0);
86
+
87
+ size_t word_index = ring_bits_ext_word_index(bit_index);
88
+
89
+ uint64_t bit_mask = ((uint64_t) 1) << bit_index;
90
+ bool previous = (ptr->words[word_index] & bit_mask) != 0;
91
+
92
+ //fprintf(stderr, "set: word_index: %lu bit_index: %i bit_mask: %llx \n", word_index, bit_index, bit_mask);
93
+
94
+ if (value) {
95
+ ptr->words[word_index] |= bit_mask;
96
+ } else {
97
+ ptr->words[word_index] &= ~bit_mask;
98
+ }
99
+
100
+ return previous;
101
+ }
102
+
103
+ /**
104
+ * Sets the bit at the specified index to value.
105
+ *
106
+ * @param [Fixnum] bit_index_value a bit index
107
+ * @return previous state of bit_index that can be true or false
108
+ * @raise [ArgumentError] if the specified index is negative
109
+ */
110
+ static VALUE
111
+ ring_bits_ext_set(VALUE self, VALUE bit_index_value, VALUE value) {
112
+ struct ring_bits_ext *ptr;
113
+ Data_Get_Struct(self, struct ring_bits_ext, ptr);
114
+
115
+ int bit_index = NUM2INT(bit_index_value);
116
+ if (0 > bit_index) {
117
+ rb_raise(rb_eArgError, "ring bit's index must be positive, got %i", bit_index);
118
+ }
119
+
120
+ bool previous = _ring_bits_ext_set(ptr, bit_index, value == Qtrue);
121
+ return previous ? Qtrue : Qfalse;
122
+ }
123
+
124
+ bool
125
+ _ring_bits_ext_get(struct ring_bits_ext *ptr, int bit_index) {
126
+ assert(0 <= bit_index);
127
+
128
+ size_t word_index = ring_bits_ext_word_index(bit_index);
129
+ uint64_t bit_mask = ((uint64_t) 1) << bit_index;
130
+
131
+ //fprintf(stderr, "get: word_index: %lu bit_index: %i bit_mask: %llx\n", word_index, bit_index, bit_mask);
132
+
133
+ return (ptr->words[word_index] & bit_mask) != 0;
134
+ }
135
+
136
+ /**
137
+ * Gets the bit at the specified index.
138
+ *
139
+ * @param [Fixnum] bit_index_value a bit index
140
+ * @return state of bit_index that can be true or false
141
+ * @raise [ArgumentError] if the specified index is negative
142
+ */
143
+ static VALUE
144
+ ring_bits_ext_get(VALUE self, VALUE bit_index_value) {
145
+ struct ring_bits_ext *ptr;
146
+ Data_Get_Struct(self, struct ring_bits_ext, ptr);
147
+
148
+ int bit_index = NUM2INT(bit_index_value);
149
+ if (0 > bit_index) {
150
+ rb_raise(rb_eArgError, "ring bit's index must be positive, got %i", bit_index);
151
+ }
152
+
153
+ bool value = _ring_bits_ext_get(ptr, bit_index);
154
+ return value ? Qtrue : Qfalse;
155
+ }
156
+
157
+ /**
158
+ * Module entry point.
159
+ */
160
+ void
161
+ Init_ring_bits_ext() {
162
+ VALUE mR4r;
163
+ VALUE cRingBitSet;
164
+
165
+ mR4r = rb_define_module("R4r");
166
+ cRingBitSet = rb_define_class_under(mR4r, "RingBitsExt", rb_cObject);
167
+
168
+ rb_define_alloc_func(cRingBitSet, ring_bits_ext_alloc);
169
+ rb_define_method(cRingBitSet, "initialize", ring_bits_ext_init, 1);
170
+ rb_define_method(cRingBitSet, "size", ring_bits_ext_get_size, 0);
171
+ rb_define_method(cRingBitSet, "set", ring_bits_ext_set, 2);
172
+ rb_define_method(cRingBitSet, "get", ring_bits_ext_get, 1);
173
+ }