sorted_set 1.0.2 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68fcb999cddaa00ed34e33a59b341765b591fcf9857cdc43e5bd19cca6bd492f
4
- data.tar.gz: 8342e64136084cbe36b6d88dfec25109800ba84fdef461e0c01fac3d567852bf
3
+ metadata.gz: 17f8b2af487ef500475c4f5672b5ae6b9e1b721d9e3a2ce50a517a762c3849ef
4
+ data.tar.gz: 4357d24f7a29756be8be22825d1ba19425203e5612faf5c425e4e5726a569627
5
5
  SHA512:
6
- metadata.gz: 0b12d809099ca51e91d911ec83584abd82bb4cb7c213ce7ce479936983d180c41e0ebad82ef20da120c952e7d37ea0537f1a33b460f886e8dd6e1c3d3a04731c
7
- data.tar.gz: 53a543b11b7aabdececd3dec96ec7a8cc17bb85b6a451b60ca88b4c09488d31b4ca15a5e783ae4f0f0525eba9d0d1328162d9061be1c38963a13efd1b9b8964f
6
+ metadata.gz: 6b22b97acc84ea89d70f8bd769af3faabde25f25731d48518a7762d60e7175ac565fae626334d802488fd65c5eef39b3f3a08618c85397a15f23c902570d2b1f
7
+ data.tar.gz: f682ed1e5ec304f3c8d94dc85053d1b9b29f54e67c4abb68b98f405dc34f606fd1e6a5697825e191a31403974b66a70587d81fa8412f27154fd67c271b3b2045
@@ -7,13 +7,13 @@ jobs:
7
7
  strategy:
8
8
  fail-fast: false
9
9
  matrix:
10
- ruby: [ 2.7, head, jruby ]
10
+ ruby: [ '2.7', '3.4', '4.0', head, jruby, jruby-head ]
11
11
  os: [ ubuntu ]
12
12
 
13
13
  name: >-
14
14
  ${{matrix.os}}-ruby-${{matrix.ruby}}
15
15
  runs-on: ${{matrix.os}}-latest
16
- continue-on-error: ${{matrix.ruby == 'head'}}
16
+ continue-on-error: ${{matrix.ruby == 'head' || matrix.ruby == 'jruby-head'}}
17
17
 
18
18
  steps:
19
19
  - name: Check out
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # SortedSet Changelog
2
2
 
3
+ ## 1.1.0 (2026-03-05)
4
+
5
+ * Enhancements
6
+ * Support Ruby 4.0, where Set is a built-in C class that no longer uses `@hash`. SortedSet now overrides primitive methods and relies on `Set::SubclassCompatible` for composite operations.
7
+ * Support JRuby with Ruby 4.0 compatibility, using `java.util.TreeSet` as the backing store instead of rbtree.
8
+ * Remove the runtime dependency on the set gem, which is part of the standard library or built-in across all supported Ruby versions.
9
+
10
+ ## 1.0.3 (2021-02-13)
11
+
12
+ * Enhancements
13
+ * Switch back to the original [rbtree](https://rubygems.org/gems/rbtree) gem, which added support for Ruby >=3.0.
14
+
3
15
  ## 1.0.2 (2020-12-24)
4
16
 
5
17
  * Enhancements
data/Gemfile CHANGED
@@ -3,6 +3,5 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in sorted_set.gemspec
4
4
  gemspec
5
5
 
6
- gem "rake", "~> 12.0"
7
- gem "minitest", "~> 5.0"
6
+ gem "rake"
8
7
  gem "test-unit"
@@ -0,0 +1,93 @@
1
+ # JRuby with Ruby >= 4.0 compat: Set is a built-in class and SortedSet
2
+ # has been removed. Subclassing Set auto-includes
3
+ # Set::SubclassCompatible. We use java.util.TreeSet as the backing
4
+ # store instead of RBTree (a C extension unavailable on JRuby).
5
+
6
+ require 'java'
7
+
8
+ class SortedSet
9
+ def initialize(enum = nil, &block)
10
+ @tree = java.util.TreeSet.new
11
+ super
12
+ end
13
+
14
+ def add(o)
15
+ check_frozen
16
+ @tree.add(o)
17
+ self
18
+ end
19
+ alias << add
20
+
21
+ def delete(o)
22
+ check_frozen
23
+ @tree.remove(o)
24
+ self
25
+ end
26
+
27
+ def include?(o)
28
+ @tree.contains(o)
29
+ end
30
+ alias member? include?
31
+
32
+ def each(&block)
33
+ block or return enum_for(__method__) { size }
34
+ @tree.each(&block)
35
+ self
36
+ end
37
+
38
+ def size
39
+ @tree.size
40
+ end
41
+ alias length size
42
+
43
+ def empty?
44
+ @tree.is_empty
45
+ end
46
+
47
+ def clear
48
+ check_frozen
49
+ @tree.clear
50
+ self
51
+ end
52
+
53
+ def replace(enum)
54
+ check_frozen
55
+ if enum.instance_of?(self.class)
56
+ @tree = enum.instance_variable_get(:@tree).dup
57
+ else
58
+ @tree.clear
59
+ merge(enum)
60
+ end
61
+ self
62
+ end
63
+
64
+ def to_a
65
+ @tree.to_a
66
+ end
67
+
68
+ def hash
69
+ @tree.to_a.hash
70
+ end
71
+
72
+ def freeze
73
+ super
74
+ end
75
+
76
+ def initialize_dup(orig)
77
+ super
78
+ @tree = orig.instance_variable_get(:@tree).dup
79
+ end
80
+
81
+ def initialize_clone(orig, freeze: nil)
82
+ super
83
+ @tree = orig.instance_variable_get(:@tree).dup
84
+ end
85
+
86
+ private
87
+
88
+ # Java objects do not honor Ruby's freeze semantics, so we must
89
+ # guard mutation methods ourselves.
90
+ def check_frozen
91
+ raise FrozenError, "can't modify frozen #{self.class}: #{inspect}" if frozen?
92
+ end
93
+ end
@@ -0,0 +1,9 @@
1
+ # Ruby < 4.0: Set uses @hash internally. Replacing it with an
2
+ # RBTree gives us sorted iteration for free.
3
+
4
+ class SortedSet
5
+ def initialize(*args)
6
+ @hash = RBTree.new
7
+ super
8
+ end
9
+ end
@@ -0,0 +1,81 @@
1
+ # Ruby >= 4.0: Set is a built-in class backed by C code and no longer
2
+ # uses @hash. Subclassing Set automatically includes
3
+ # Set::SubclassCompatible, which delegates composite operations to
4
+ # primitive methods. We override those primitives to use RBTree.
5
+
6
+ class SortedSet
7
+ def initialize(enum = nil, &block)
8
+ @tree = RBTree.new
9
+ super
10
+ end
11
+
12
+ def add(o)
13
+ @tree[o] = true
14
+ self
15
+ end
16
+ alias << add
17
+
18
+ def delete(o)
19
+ @tree.delete(o)
20
+ self
21
+ end
22
+
23
+ def include?(o)
24
+ @tree.has_key?(o)
25
+ end
26
+ alias member? include?
27
+
28
+ def each(&block)
29
+ block or return enum_for(__method__) { size }
30
+ @tree.each_key(&block)
31
+ self
32
+ end
33
+
34
+ def size
35
+ @tree.size
36
+ end
37
+ alias length size
38
+
39
+ def empty?
40
+ @tree.empty?
41
+ end
42
+
43
+ def clear
44
+ @tree.clear
45
+ self
46
+ end
47
+
48
+ def replace(enum)
49
+ if enum.instance_of?(self.class)
50
+ @tree = enum.instance_variable_get(:@tree).dup
51
+ else
52
+ clear
53
+ merge(enum)
54
+ end
55
+ self
56
+ end
57
+
58
+ def to_a
59
+ @tree.keys
60
+ end
61
+
62
+ def hash
63
+ @tree.keys.hash
64
+ end
65
+
66
+ def freeze
67
+ @tree.freeze
68
+ super
69
+ end
70
+
71
+ def initialize_dup(orig)
72
+ super
73
+ @tree = orig.instance_variable_get(:@tree).dup
74
+ end
75
+
76
+ def initialize_clone(orig, freeze: nil)
77
+ super
78
+ # When freeze is nil, clone preserves the frozen state of orig.
79
+ @tree = orig.instance_variable_get(:@tree).clone(freeze: freeze.nil? ? orig.frozen? : freeze)
80
+ end
81
+ end
data/lib/sorted_set.rb CHANGED
@@ -2,9 +2,12 @@
2
2
 
3
3
  require 'set'
4
4
 
5
- return if defined?(JRUBY_VERSION)
6
-
7
- require 'rbtree'
5
+ if defined?(JRUBY_VERSION)
6
+ # JRuby has a built-in SortedSet (at least through JRuby 10).
7
+ return if defined?(::SortedSet)
8
+ else
9
+ require 'rbtree'
10
+ end
8
11
 
9
12
  Object.instance_exec do
10
13
  # Undefine SortedSet for two reasons.
@@ -49,9 +52,12 @@ end
49
52
  # ```
50
53
 
51
54
  class SortedSet < Set
52
- # Creates a SortedSet. See Set.new for details.
53
- def initialize(*args)
54
- @hash = RBTree.new
55
- super
56
- end
55
+ end
56
+
57
+ if defined?(JRUBY_VERSION)
58
+ require_relative 'sorted_set/jruby'
59
+ elsif defined?(Set::CoreSet)
60
+ require_relative 'sorted_set/ruby4'
61
+ else
62
+ require_relative 'sorted_set/ruby3'
57
63
  end
data/sorted_set.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "sorted_set"
3
- spec.version = "1.0.2"
3
+ spec.version = "1.1.0"
4
4
  spec.authors = ["Akinori MUSHA"]
5
5
  spec.email = ["knu@idaemons.org"]
6
6
 
@@ -26,7 +26,6 @@ Gem::Specification.new do |spec|
26
26
  if defined?(JRUBY_VERSION)
27
27
  spec.platform = "java"
28
28
  else
29
- spec.add_runtime_dependency "set", "~> 1.0"
30
- spec.add_runtime_dependency "rbtree3"
29
+ spec.add_runtime_dependency "rbtree"
31
30
  end
32
31
  end
metadata CHANGED
@@ -1,31 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorted_set
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akinori MUSHA
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2020-12-23 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: set
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.0'
27
- - !ruby/object:Gem::Dependency
28
- name: rbtree3
13
+ name: rbtree
29
14
  requirement: !ruby/object:Gem::Requirement
30
15
  requirements:
31
16
  - - ">="
@@ -55,6 +40,9 @@ files:
55
40
  - bin/console
56
41
  - bin/setup
57
42
  - lib/sorted_set.rb
43
+ - lib/sorted_set/jruby.rb
44
+ - lib/sorted_set/ruby3.rb
45
+ - lib/sorted_set/ruby4.rb
58
46
  - sorted_set.gemspec
59
47
  homepage: https://github.com/knu/sorted_set
60
48
  licenses:
@@ -62,8 +50,7 @@ licenses:
62
50
  metadata:
63
51
  homepage_uri: https://github.com/knu/sorted_set
64
52
  source_code_uri: https://github.com/knu/sorted_set
65
- changelog_uri: https://github.com/knu/sorted_set/blob/v1.0.2/CHANGELOG.md
66
- post_install_message:
53
+ changelog_uri: https://github.com/knu/sorted_set/blob/v1.1.0/CHANGELOG.md
67
54
  rdoc_options: []
68
55
  require_paths:
69
56
  - lib
@@ -78,8 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
65
  - !ruby/object:Gem::Version
79
66
  version: '0'
80
67
  requirements: []
81
- rubygems_version: 3.2.1
82
- signing_key:
68
+ rubygems_version: 4.0.5
83
69
  specification_version: 4
84
70
  summary: Implements a variant of Set whose elements are sorted in ascending order
85
71
  test_files: []