range_list 1.1.0 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cbae62498893749767a5138f59caacd3de650bf62f566859d2ff16fc69e04a73
4
- data.tar.gz: b5317ec465420963e3d392f89f22e2bf3a7a662a569c82084b4cbe5383eaab32
3
+ metadata.gz: c3bbec9e50fbfcf613d6371f9851c1410269819c738d362bbe0db73bf6ab1ed6
4
+ data.tar.gz: 48b42d5f37e67577cc92528b4f3e898b58f81f7781fa4ea388347572fb70d90a
5
5
  SHA512:
6
- metadata.gz: 9f39a299e682ca947eeb1518cdba35eaad08b806433a849f1651ead445a7602fcb7c290611b8c3fa2601994003b74f3edbbe7909967d02064316db27d0d03a46
7
- data.tar.gz: 286f03c1ecc1de6b5d0b5d4d271b0fcb2d3ea2f56c5a146d26e66b68a0fe168e0a8d093e781bb7c4a4551501682e8ea4534495a86f669470b73db52aa48a2028
6
+ metadata.gz: c6f784320a3ab3b9b1c7714c9c7350aef3824b222a28ca0b1278722a728564b91c6c40faf3bbb8ea8a2926795daa56ca8f3db740cec6fd8833371bb60214ddd8
7
+ data.tar.gz: 98c20d0456e3c84432dfa9d3d09438c4887606dead589cfb1006407569b3c7f1330e0e3401fba5562b0c1c0c3dba408ad43fa0ea18f99232775ce7dcef69c3ee
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- range_list (1.1.0)
5
- treemap (~> 1.0)
4
+ range_list (1.2.0)
5
+ rbtree (~> 0.4.5)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -15,6 +15,7 @@ GEM
15
15
  ast (~> 2.4.1)
16
16
  rainbow (3.1.1)
17
17
  rake (13.0.6)
18
+ rbtree (0.4.5)
18
19
  regexp_parser (2.2.1)
19
20
  rexml (3.2.5)
20
21
  rubocop (1.25.1)
@@ -44,7 +45,6 @@ GEM
44
45
  standard (1.7.2)
45
46
  rubocop (= 1.25.1)
46
47
  rubocop-performance (= 1.13.2)
47
- treemap (1.0.3)
48
48
  unicode-display_width (2.1.0)
49
49
  webrick (1.7.0)
50
50
  yard (0.9.27)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class RangeList
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
5
5
  end
data/lib/range_list.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "treemap"
3
+ require "rbtree"
4
4
  require_relative "range_list/version"
5
5
  require_relative "range_list/errors"
6
6
 
@@ -8,7 +8,7 @@ class RangeList
8
8
  include Enumerable
9
9
 
10
10
  def initialize
11
- @tree = TreeMap.new
11
+ @tree = RBTree.new
12
12
  end
13
13
 
14
14
  # Add range into current range list.
@@ -23,27 +23,27 @@ class RangeList
23
23
  return self if empty_range?(range)
24
24
 
25
25
  # Get real range start.
26
- start_floor_entry = tree.floor_entry(range[0])
27
- range_start = if !start_floor_entry.nil? && start_floor_entry.value >= range[0]
28
- start_floor_entry.key
26
+ start_floor_entry = tree.upper_bound(range[0])
27
+ range_start = if !start_floor_entry.nil? && start_floor_entry[1] >= range[0]
28
+ start_floor_entry[0]
29
29
  else
30
30
  range[0]
31
31
  end
32
32
 
33
33
  # Get real range end.
34
- end_floor_entry = tree.floor_entry(range[1])
35
- range_end = if !end_floor_entry.nil? && end_floor_entry.value >= range[1]
36
- end_floor_entry.value
34
+ end_floor_entry = tree.upper_bound(range[1])
35
+ range_end = if !end_floor_entry.nil? && end_floor_entry[1] >= range[1]
36
+ end_floor_entry[1]
37
37
  else
38
38
  range[1]
39
39
  end
40
40
 
41
41
  # Insert or replace new range.
42
- tree.put(range_start, range_end)
42
+ tree[range_start] = range_end
43
43
 
44
44
  # Remove keys between range, exclude start, include end.
45
- between_maps = tree.sub_map(range[0], false, range[1], true)
46
- between_maps.keys.each { |key| tree.remove(key) }
45
+ between_maps = tree.bound(range[0] + 1, range[1])
46
+ between_maps.to_a.each { |key, _value| tree.delete(key) }
47
47
 
48
48
  self
49
49
  end
@@ -59,20 +59,20 @@ class RangeList
59
59
  return self if empty_range?(range)
60
60
 
61
61
  # Insert end lower entry
62
- end_lower_entry = tree.lower_entry(range[1])
63
- if !end_lower_entry.nil? && end_lower_entry.value > range[1]
64
- tree.put(range[1], end_lower_entry.value)
62
+ end_lower_entry = tree.upper_bound(range[1] - 1)
63
+ if !end_lower_entry.nil? && end_lower_entry[1] > range[1]
64
+ tree[range[1]] = end_lower_entry[1]
65
65
  end
66
66
 
67
67
  # Relace start lower entry
68
- start_lower_entry = tree.lower_entry(range[0])
69
- if !start_lower_entry.nil? && start_lower_entry.value > range[0]
70
- tree.put(start_lower_entry.key, range[0])
68
+ start_lower_entry = tree.upper_bound(range[0] - 1)
69
+ if !start_lower_entry.nil? && start_lower_entry[1] > range[0]
70
+ tree[start_lower_entry[0]] = range[0]
71
71
  end
72
72
 
73
73
  # Remove keys between range, include start, exclude end
74
- between_maps = tree.sub_map(range[0], true, range[1], false)
75
- between_maps.keys.each { |key| tree.remove(key) }
74
+ between_maps = tree.bound(range[0], range[1] - 1)
75
+ between_maps.to_a.each { |key, _value| tree.delete(key) }
76
76
 
77
77
  self
78
78
  end
@@ -94,8 +94,8 @@ class RangeList
94
94
  # Return false when range is empty.
95
95
  return false if empty_range?(range)
96
96
 
97
- start_floor_entry = tree.floor_entry(range[0])
98
- !start_floor_entry.nil? && start_floor_entry.value >= range[1]
97
+ start_floor_entry = tree.upper_bound(range[0])
98
+ !start_floor_entry.nil? && start_floor_entry[1] >= range[1]
99
99
  end
100
100
 
101
101
  # Returns true if current ranges contains any element of the range.
@@ -109,8 +109,8 @@ class RangeList
109
109
  # Return false when range is empty.
110
110
  return false if empty_range?(range)
111
111
 
112
- end_lower_entry = tree.lower_entry(range[1])
113
- !end_lower_entry.nil? && end_lower_entry.value > range[0]
112
+ end_lower_entry = tree.upper_bound(range[1] - 1)
113
+ !end_lower_entry.nil? && end_lower_entry[1] > range[0]
114
114
  end
115
115
 
116
116
  # Returns true if current ranges contains the element.
@@ -120,17 +120,15 @@ class RangeList
120
120
  def contains?(element)
121
121
  raise ArgumentError, "`element` should be `Integer` type." unless element.is_a?(Integer)
122
122
 
123
- floor_entry = tree.floor_entry(element)
124
- !floor_entry.nil? && floor_entry.value > element
123
+ floor_entry = tree.upper_bound(element)
124
+ !floor_entry.nil? && floor_entry[1] > element
125
125
  end
126
126
 
127
127
  # Give RangeList iterative ability.
128
128
  # @yield [range_start, range_end] give the range element to the block
129
129
  def each(&block)
130
130
  if block
131
- # Iterating an empty tree will raise an error,
132
- # see https://github.com/davidkellis/treemap/issues/1
133
- tree.empty? ? self : tree.each(&block)
131
+ tree.each(&block)
134
132
  else
135
133
  enum_for(:each)
136
134
  end
data/range_list.gemspec CHANGED
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
34
34
 
35
35
  # Uncomment to register a new dependency of your gem
36
36
  # spec.add_dependency "example-gem", "~> 1.0"
37
- spec.add_dependency "treemap", "~> 1.0"
37
+ spec.add_dependency "rbtree", "~> 0.4.5"
38
38
 
39
39
  # For more information and examples about making a new gem, check out our
40
40
  # guide at: https://bundler.io/guides/creating_gem.html
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: range_list
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Song Huang
@@ -11,19 +11,19 @@ cert_chain: []
11
11
  date: 2022-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: treemap
14
+ name: rbtree
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: 0.4.5
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.0'
26
+ version: 0.4.5
27
27
  description:
28
28
  email:
29
29
  - songhuangcn@gmail.com