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.
Files changed (2) hide show
  1. data/lib/dumb_numb_set.rb +18 -32
  2. 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
- check_num num
53
+ raise ArgumentError, "Argument must be positive integer" unless num.is_a? Fixnum and num.integer? and num >= 0
54
54
 
55
- index = bitset_index num
55
+ index = num / @div
56
56
 
57
57
  bitset = @bitsets[index]
58
58
 
59
59
  if bitset
60
- @bitsets[index] = (bitset | bin_index(num))
60
+ @bitsets[index] = (bitset | (1 << (num % @div)))
61
61
  else
62
- @bitsets[index] = bin_index(num)
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
- check_num num
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 ^ bin_index(num))
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
- check_num num
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 & bin_index(num) != 0
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
- version: 0.0.2
5
- prerelease:
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-07-18 00:00:00.000000000 Z
12
+ date: 2013-09-01 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: ! 'Ever needed to compactly store and query a set of mostly consecutive,
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.25
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: []