dumb_numb_set 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|