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.
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: []