dumb_numb_set 0.0.2 → 0.0.3
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.
- data/lib/dumb_numb_set.rb +18 -32
- metadata +16 -20
data/lib/dumb_numb_set.rb
CHANGED
@@ -50,16 +50,16 @@ class DumbNumbSet
|
|
50
50
|
# Add a non-negative integer to the set.
|
51
51
|
# Raises an ArgumentError if the number given is not a non-negative integer.
|
52
52
|
def add num
|
53
|
-
|
53
|
+
raise ArgumentError, "Argument must be positive integer" unless num.is_a? Fixnum and num.integer? and num >= 0
|
54
54
|
|
55
|
-
index =
|
55
|
+
index = num / @div
|
56
56
|
|
57
57
|
bitset = @bitsets[index]
|
58
58
|
|
59
59
|
if bitset
|
60
|
-
@bitsets[index] = (bitset |
|
60
|
+
@bitsets[index] = (bitset | (1 << (num % @div)))
|
61
61
|
else
|
62
|
-
@bitsets[index] =
|
62
|
+
@bitsets[index] = (1 << (num % @div))
|
63
63
|
end
|
64
64
|
|
65
65
|
self
|
@@ -67,18 +67,25 @@ class DumbNumbSet
|
|
67
67
|
|
68
68
|
alias << add
|
69
69
|
|
70
|
+
# Merge a collection of numbers into the set.
|
71
|
+
# Modifes and returns the target set.
|
72
|
+
def merge nums
|
73
|
+
nums.each do |num|
|
74
|
+
self.add num
|
75
|
+
end
|
76
|
+
|
77
|
+
self
|
78
|
+
end
|
79
|
+
|
70
80
|
# Remove number from set.
|
71
|
-
# Raises an ArgumentError if the number given is not a non-negative integer.
|
72
81
|
def remove num
|
73
|
-
|
74
|
-
|
75
|
-
index = bitset_index num
|
82
|
+
index = num / @div
|
76
83
|
|
77
84
|
bitset = @bitsets[index]
|
78
85
|
|
79
86
|
return false unless bitset
|
80
87
|
|
81
|
-
@bitsets[index] = (bitset ^
|
88
|
+
@bitsets[index] = (bitset ^ (1 << (num % @div)))
|
82
89
|
|
83
90
|
if @bitsets[index] == 0
|
84
91
|
@bitsets.delete index
|
@@ -92,40 +99,19 @@ class DumbNumbSet
|
|
92
99
|
# Returns true if the given number is in the set.
|
93
100
|
# Raises an ArgumentError if the number given is not a non-negative integer.
|
94
101
|
def include? num
|
95
|
-
|
96
|
-
|
97
|
-
index = bitset_index num
|
102
|
+
index = num / @div
|
98
103
|
|
99
104
|
bitset = @bitsets[index]
|
100
105
|
|
101
106
|
return false unless bitset
|
102
107
|
|
103
|
-
bitset &
|
108
|
+
bitset & (1 << (num % @div)) != 0
|
104
109
|
end
|
105
110
|
|
106
111
|
# Returns number of keys in set (not number of values).
|
107
112
|
def size
|
108
113
|
@bitsets.length
|
109
114
|
end
|
110
|
-
|
111
|
-
private
|
112
|
-
|
113
|
-
# Calculate the bitmask to index the given number in the bitset.
|
114
|
-
def bin_index num
|
115
|
-
1 << (num % @div)
|
116
|
-
end
|
117
|
-
|
118
|
-
# Calculate the key of the bitset for a given number.
|
119
|
-
def bitset_index num
|
120
|
-
(num / @div)
|
121
|
-
end
|
122
|
-
|
123
|
-
# Check that the argument is a valid number.
|
124
|
-
def check_num num
|
125
|
-
unless num.is_a? Fixnum and num.integer? and num >= 0
|
126
|
-
raise ArgumentError, "Argument must be positive integer"
|
127
|
-
end
|
128
|
-
end
|
129
115
|
end
|
130
116
|
|
131
117
|
# Custom marshal technique if MessagePack is available. Saves some bytes,
|
metadata
CHANGED
@@ -1,26 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dumb_numb_set
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Justin Collins
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-09-01 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description:
|
15
|
-
|
14
|
+
description: |
|
15
|
+
Ever needed to compactly store and query a set of mostly consecutive,
|
16
16
|
non-negative integers? Probably not, but if you do this library may work for
|
17
|
-
|
18
|
-
you. It''s just about as fast as a Set and a lot smaller for numbers that stay
|
19
|
-
|
17
|
+
you. It's just about as fast as a Set and a lot smaller for numbers that stay
|
20
18
|
close together.
|
21
|
-
|
22
|
-
'
|
23
|
-
email:
|
19
|
+
email:
|
24
20
|
executables: []
|
25
21
|
extensions: []
|
26
22
|
extra_rdoc_files: []
|
@@ -29,26 +25,26 @@ files:
|
|
29
25
|
homepage: https://github.com/presidentbeef/dumb-numb-set
|
30
26
|
licenses:
|
31
27
|
- MIT
|
32
|
-
post_install_message:
|
28
|
+
post_install_message:
|
33
29
|
rdoc_options: []
|
34
30
|
require_paths:
|
35
31
|
- lib
|
36
32
|
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
-
none: false
|
38
33
|
requirements:
|
39
|
-
- -
|
34
|
+
- - '>='
|
40
35
|
- !ruby/object:Gem::Version
|
41
36
|
version: '0'
|
42
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
37
|
none: false
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
39
|
requirements:
|
45
|
-
- -
|
40
|
+
- - '>='
|
46
41
|
- !ruby/object:Gem::Version
|
47
42
|
version: '0'
|
43
|
+
none: false
|
48
44
|
requirements: []
|
49
|
-
rubyforge_project:
|
50
|
-
rubygems_version: 1.8.
|
51
|
-
signing_key:
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 1.8.24
|
47
|
+
signing_key:
|
52
48
|
specification_version: 3
|
53
49
|
summary: A compact data structure for mostly consecutive, non-negative integers.
|
54
50
|
test_files: []
|