setfu 1.2.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/setfu.rb +153 -75
  3. data/lib/setfu/version.rb +1 -1
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 72565070f36393bad5dc9eb8cbeba0dd49804c9a
4
- data.tar.gz: c1efb9f7cff8811a55282d31f6cbe0eda66a1bff
3
+ metadata.gz: 86cb17462d85ca1892275124d15b258e39500a81
4
+ data.tar.gz: 0c6b22148997f47f43494269c18fe78de5cec4fc
5
5
  SHA512:
6
- metadata.gz: 1256c103b03a79bfc631377c9eea812cbea1743fb7526a7c1fbd1edc366f04edc6fe6777a1ba320bb14d8290924bf701af2f7720327dfcabb7a9255d63488842
7
- data.tar.gz: 729b9b90ff87bda5ccd4b70f9241daed3a613ac16d9b74933903c79fe5bf0d5ba732aaf4cc659ad156d473c94b356caef1f4bec6d9a383111a73aa4ea91783ee
6
+ metadata.gz: ba3a1ecece8183f14ce227512e19b89fcda2724bcc84e7e5ec67e81b7c781013375ac29cd777370411dc9aaf499117fcc6100857211e06d9bc92713a360ffa89
7
+ data.tar.gz: c4f64253c8796b4e917aa09a0ff93eeefe9e2a05b39e5f212968aa51e02c8f123dfb662707f646c06362f79d7cf3ba9ac912e0f13f4649622a5bb66d6ee2dfb9
@@ -1,6 +1,6 @@
1
1
  require "setfu/version"
2
2
 
3
- class Set
3
+ class BitSet
4
4
  attr_reader :entropy
5
5
 
6
6
  def entropy=(ent) # entropy only gets bigger, just like the universe!
@@ -8,42 +8,42 @@ class Set
8
8
  end
9
9
 
10
10
  def self.uppercase_chars
11
- set = Set.new
11
+ set = BitSet.new
12
12
  set.set_bits!(2475880041677272402379145216)
13
13
  set.entropy=91
14
14
  return set
15
15
  end
16
16
 
17
17
  def self.lowercase_chars
18
- set = Set.new
18
+ set = BitSet.new
19
19
  set.set_bits!(10633823807823001954701781295154855936)
20
20
  set.entropy=123
21
21
  return set
22
22
  end
23
23
 
24
24
  def self.letter_chars
25
- set = Set.new
25
+ set = BitSet.new
26
26
  set.set_bits!(10633823810298881996379053697534001152)
27
27
  set.entropy=123
28
28
  return set
29
29
  end
30
30
 
31
31
  def self.digit_chars
32
- set = Set.new
32
+ set = BitSet.new
33
33
  set.set_bits!(287948901175001088)
34
34
  set.entropy=58
35
35
  return set
36
36
  end
37
37
 
38
38
  def self.parse_chars
39
- set = Set.new
39
+ set = BitSet.new
40
40
  set.set_bits!(159507359650170349735020301117175103487)
41
41
  set.entropy=127
42
42
  return set
43
43
  end
44
44
 
45
45
  def replace(ent)
46
- ent = ent.to_set
46
+ ent = ent.to_bset
47
47
  @mode = ent.mode
48
48
  @entropy = ent.entropy
49
49
  @bits = ent.to_i
@@ -52,53 +52,111 @@ class Set
52
52
 
53
53
  def add_parse_chars!
54
54
  # add! [0..47, 58..64, 91..96, 123..126]
55
- add! Set.parse_chars
55
+ add! BitSet.parse_chars
56
56
  self
57
57
  end
58
58
 
59
59
  def add_parse_chars
60
- return Set.parse_chars | self
60
+ return BitSet.parse_chars | self
61
61
  end
62
62
 
63
63
  def add_digit_chars!
64
- add! Set.digit_chars
64
+ add! BitSet.digit_chars
65
65
  self
66
66
  end
67
67
 
68
68
  def add_digit_chars
69
- return Set.digit_chars | self
69
+ return BitSet.digit_chars | self
70
70
  end
71
71
 
72
72
  def add_uppercase_chars!
73
- add! Set.uppercase_chars
73
+ add! BitSet.uppercase_chars
74
74
  self
75
75
  end
76
76
 
77
77
  def add_uppercase_chars
78
- return Set.uppercase_chars | self
78
+ return BitSet.uppercase_chars | self
79
79
  end
80
80
 
81
81
  def add_lowercase_chars!
82
- add! Set.lowercase_chars
82
+ add! BitSet.lowercase_chars
83
83
  self
84
84
  end
85
85
 
86
86
  def add_lowercase_chars
87
- return Set.lowercase_chars | self
87
+ return BitSet.lowercase_chars | self
88
88
  end
89
89
 
90
90
  def add_letter_chars
91
- return Set.letter_chars | self
91
+ return BitSet.letter_chars | self
92
92
  end
93
93
 
94
94
  def add_letter_chars!
95
- add! Set.letter_chars
95
+ add! BitSet.letter_chars
96
96
  self
97
97
  end
98
98
 
99
+ # 01100010011111111100010101001101 ... test
100
+ # 01100010011111111100010101001101 ... left shift
101
+ # 001000000011111111000000000001000 ... and with left shift
102
+ #
103
+ # 01100010011111111100010101001101 ... test
104
+ # 00110001001111111110001010100110 ... right shift
105
+ # 00100000001111111100000000000100 ... and with right shift
106
+ #
107
+ # 001000000011111111000000000001000 ... AND with left shift
108
+ # 00100000001111111100000000000100 ... AND with right shift
109
+ # 001100000011111111100000000001100 ... OR the two ands
110
+ # 01100010011111111100010101001101 ... test original
111
+ # 01100000011111111100000000001100 ... BINGO ... original with the OR gives us the runs only
112
+ # 00000010000000000000010101000001 ... BINGO ... original XOR with OR gives us the singles!
113
+
114
+ def runs # runs << creates a set of touching elements
115
+ an_l = (@bits << 1) & @bits
116
+ an_r = (@bits >> 1) & @bits
117
+ or_lr = an_l | an_r
118
+ rtn = BitSet.new
119
+ rtn.set_bits!(or_lr & @bits)
120
+ rtn.entropy=self.entropy
121
+ return rtn
122
+ end
123
+
124
+ def singles # singles << creates a set of non-touching elements
125
+ an_l = (@bits << 1) & @bits
126
+ an_r = (@bits >> 1) & @bits
127
+ or_lr = an_l | an_r
128
+ rtn = BitSet.new
129
+ rtn.set_bits!(or_lr ^ @bits)
130
+ rtn.entropy=self.entropy
131
+ return rtn
132
+ end
133
+
134
+ def max_run # max_run << returns maximum number of consecutive numbers
135
+ return 0 if @bits==0
136
+ mx = 1
137
+ bits = @bits
138
+ loop do
139
+ bits <<= 1
140
+ bits &= @bits
141
+ break if 0 == bits
142
+ mx += 1
143
+ end
144
+ return mx
145
+ end
146
+
147
+ def runs?(cnt=2)
148
+ bits = @bits
149
+ (cnt-1).times do
150
+ bits <<= 1
151
+ bits &= @bits
152
+ return false if 0 == bits
153
+ end
154
+ return true
155
+ end
156
+
99
157
  def add_opposing_case!
100
- aa = Set.lowercase_chars
101
- bb = Set.uppercase_chars
158
+ aa = BitSet.lowercase_chars
159
+ bb = BitSet.uppercase_chars
102
160
  ka = aa & self # subset lower case
103
161
  kb = bb & self # subset upper case
104
162
  @bits |= ka.to_i >> 32
@@ -111,7 +169,7 @@ class Set
111
169
  dup.add_opposing_case!
112
170
  end
113
171
 
114
- def to_set
172
+ def to_bset
115
173
  return self
116
174
  end
117
175
 
@@ -119,10 +177,10 @@ class Set
119
177
  return @mode
120
178
  end
121
179
 
122
- def initialize(data=nil)
180
+ def initialize(*data)
123
181
  @bits = 0
124
182
  @entropy = 0
125
- add!(data) unless data.nil?
183
+ add!(data)
126
184
  self
127
185
  end
128
186
 
@@ -132,6 +190,25 @@ class Set
132
190
  self
133
191
  end
134
192
 
193
+ def inc!
194
+ @entropy += 1
195
+ @bits <<= 1
196
+ self
197
+ end
198
+
199
+ def dec!
200
+ @bits >>= 1
201
+ self
202
+ end
203
+
204
+ def inc
205
+ return dup.inc!
206
+ end
207
+
208
+ def dec
209
+ return dup.dec!
210
+ end
211
+
135
212
  def recalculate_entropy!
136
213
  @entropy = 0
137
214
  bits = @bits
@@ -165,17 +242,17 @@ class Set
165
242
  end
166
243
 
167
244
  def dup
168
- rtn = Set.new
245
+ rtn = BitSet.new
169
246
  rtn.replace(self)
170
247
  return rtn
171
248
  end
172
249
 
173
250
  def ^(item)
174
251
  rtn = self.dup
175
- if(item.class==Set)
252
+ if(item.class==BitSet)
176
253
  rtn.set_bits!(rtn.to_i ^ item.to_i)
177
254
  else
178
- rtn = Set.new(item)
255
+ rtn = BitSet.new(item)
179
256
  rtn.set_bits!(@bits ^ rtn.to_i)
180
257
  end
181
258
  rtn
@@ -183,11 +260,11 @@ class Set
183
260
 
184
261
  def |(item)
185
262
  rtn = self.dup
186
- if(item.class==Set)
263
+ if(item.class==BitSet)
187
264
  rtn.set_bits!(rtn.to_i | item.to_i)
188
265
  self.entropy=item.entropy
189
266
  else
190
- rtn = Set.new(item)
267
+ rtn = BitSet.new(item)
191
268
  rtn.set_bits!(@bits | rtn.to_i)
192
269
  end
193
270
  rtn
@@ -195,24 +272,24 @@ class Set
195
272
 
196
273
  def &(item)
197
274
  rtn = self.dup
198
- if(item.class==Set)
275
+ if(item.class==BitSet)
199
276
  rtn.set_bits!(rtn.to_i & item.to_i)
200
277
  else
201
- rtn = Set.new(item)
278
+ rtn = BitSet.new(item)
202
279
  rtn.set_bits!(@bits & rtn.to_i)
203
280
  end
204
281
  rtn
205
282
  end
206
283
 
207
284
  def -(item)
208
- rtn = Set.new
285
+ rtn = BitSet.new
209
286
  rtn.entropy = self.entropy
210
287
  a = self.to_i
211
- if(item.class==Set)
288
+ if(item.class==BitSet)
212
289
  b = item.to_i
213
290
  rtn.entropy = item.entropy
214
291
  else
215
- b = Set.new(item)
292
+ b = BitSet.new(item)
216
293
  rtn.entropy = b.entropy
217
294
  b = b.to_i
218
295
  end
@@ -223,26 +300,26 @@ class Set
223
300
  end
224
301
 
225
302
  def **(item) # intersection test
226
- set_item = Set.new(item)
303
+ set_item = BitSet.new(item)
227
304
  return false if (self & set_item).empty?
228
305
  return true
229
306
  end
230
307
 
231
308
  # comparison operators:
232
309
  def ==(item)
233
- if(item.class==Set)
310
+ if(item.class==BitSet)
234
311
  rtn = item.to_i == self.to_i
235
312
  else
236
- rtn = Set.new(item).to_i == self.to_i
313
+ rtn = BitSet.new(item).to_i == self.to_i
237
314
  end
238
315
  rtn
239
316
  end
240
317
 
241
318
  def !=(item)
242
- if(item.class==Set)
319
+ if(item.class==BitSet)
243
320
  rtn = item.to_i != self.to_i
244
321
  else
245
- rtn = Set.new(item).to_i != self.to_i
322
+ rtn = BitSet.new(item).to_i != self.to_i
246
323
  end
247
324
  rtn
248
325
  end
@@ -257,7 +334,7 @@ class Set
257
334
  # item ... case clause ... case(item)
258
335
  # Note: coerce does not work in this context ...
259
336
 
260
- md = item.to_set.mode || @mode
337
+ md = item.to_bset.mode || @mode
261
338
 
262
339
  case md
263
340
  when :mode_intersection
@@ -276,18 +353,18 @@ class Set
276
353
  end
277
354
 
278
355
  def <=(item)
279
- si = Set.new item
356
+ si = BitSet.new item
280
357
  return si.include?(self)
281
358
  end
282
359
 
283
360
  def <(item)
284
- si = Set.new item
361
+ si = BitSet.new item
285
362
  return false if (si == self) # not a 'proper' subset
286
363
  return si.include?(self)
287
364
  end
288
365
 
289
366
  def add!(items)
290
- if(items.class==Set)
367
+ if(items.class==BitSet)
291
368
  @bits |= items.to_i
292
369
  entropy = items.entropy
293
370
  elsif(items.class==Range)
@@ -325,8 +402,9 @@ class Set
325
402
  end
326
403
 
327
404
  def include?(items)
405
+ return false if items.nil? # sets never include nil
328
406
  return false if @bits == 0 # empty sets include nothing including other empty sets
329
- if(items.class==Set)
407
+ if(items.class==BitSet)
330
408
  tmp = @bits & items.to_i
331
409
  return false if tmp==0
332
410
  return (tmp) == items.to_i
@@ -458,17 +536,17 @@ class Set
458
536
  end
459
537
  end
460
538
  unless idx.nil?
461
- raise "Negative indexes are illegal for Set" if idx < 0
539
+ raise "Negative indexes are illegal for BitSet" if idx < 0
462
540
  self.entropy = idx+1
463
541
  y = @bits & (1<<idx)
464
542
  return true if y > 0
465
543
  return false
466
544
  end
467
- return pset.to_set & self
545
+ return pset.to_bset & self
468
546
  end
469
547
 
470
548
  def []=(*pset,value) # pset goes in the box, value after '='
471
- pset = pset.to_set
549
+ pset = pset.to_bset
472
550
  state = value ? true : false
473
551
  if state
474
552
  replace pset | self # add elements to set
@@ -529,47 +607,47 @@ class Set
529
607
  end
530
608
  return rtn.join ""
531
609
  else # :set
532
- return ary.to_set
610
+ return ary.to_bset
533
611
  end
534
612
  end
535
613
 
536
- end # end Set
614
+ end # end BitSet
537
615
 
538
616
  module SetFuMixinBinaryAndOperator
539
617
  def &(item)
540
- a = Set.new(self)
541
- b = Set.new(item)
618
+ a = BitSet.new(self)
619
+ b = BitSet.new(item)
542
620
  return a & b
543
621
  end
544
622
  end
545
623
 
546
624
  module SetFuMixinBinaryOrOperator
547
625
  def |(item)
548
- a = Set.new(self)
549
- b = Set.new(item)
626
+ a = BitSet.new(self)
627
+ b = BitSet.new(item)
550
628
  return a | b
551
629
  end
552
630
  end
553
631
 
554
632
  module SetFuMixinBinaryXorOperator
555
633
  def ^(item)
556
- a = Set.new(self)
557
- b = Set.new(item)
634
+ a = BitSet.new(self)
635
+ b = BitSet.new(item)
558
636
  return a ^ b
559
637
  end
560
638
  end
561
639
 
562
640
  module SetFuMixinBinaryIntersectionOperator
563
641
  def **(item) # intersection test
564
- a = Set.new(self)
565
- b = Set.new(item)
642
+ a = BitSet.new(self)
643
+ b = BitSet.new(item)
566
644
  return a ** b
567
645
  end
568
646
  end
569
647
 
570
648
  module SetFuMixinToSetMethod
571
- def to_set
572
- rtn = Set.new(self)
649
+ def to_bset
650
+ rtn = BitSet.new(self)
573
651
  # byebug
574
652
  return rtn
575
653
  end
@@ -578,31 +656,31 @@ end
578
656
  module SetFuMixinTrippleEqualsOperator
579
657
  alias_method :old_triple_equal4Set, :===
580
658
  def ===(item)
581
- return old_triple_equal4Set(item) unless (item.class==Set)
582
- return self.to_set === item
659
+ return old_triple_equal4Set(item) unless (item.class==BitSet)
660
+ return self.to_bset === item
583
661
  end
584
662
  end
585
663
 
586
664
  module SetFuMixinBinarySubtractOperator
587
665
  def -(item)
588
- a = Set.new(self)
589
- b = Set.new(item)
666
+ a = BitSet.new(self)
667
+ b = BitSet.new(item)
590
668
  return a - b
591
669
  end
592
670
  end
593
671
 
594
672
  module SetFuMixinBinarySubsetOperator
595
673
  def <=(item)
596
- a = Set.new(self)
597
- b = Set.new(item)
674
+ a = BitSet.new(self)
675
+ b = BitSet.new(item)
598
676
  return a <= b
599
677
  end
600
678
  end
601
679
 
602
680
  module SetFuMixinBinaryProperOperator
603
681
  def <(item)
604
- a = Set.new(self)
605
- b = Set.new(item)
682
+ a = BitSet.new(self)
683
+ b = BitSet.new(item)
606
684
  return a < b
607
685
  end
608
686
  end
@@ -621,14 +699,14 @@ class String
621
699
 
622
700
  def <=(item)
623
701
  return old_string_lte4set(item) if (item.class==String)
624
- a = Set.new(self)
625
- b = Set.new(item)
702
+ a = BitSet.new(self)
703
+ b = BitSet.new(item)
626
704
  return a <= b
627
705
  end
628
706
  def <(item)
629
707
  return old_string_lt4set(item) if (item.class==String)
630
- a = Set.new(self)
631
- b = Set.new(item)
708
+ a = BitSet.new(self)
709
+ b = BitSet.new(item)
632
710
  return a < b
633
711
  end
634
712
  end
@@ -647,20 +725,20 @@ class Array
647
725
 
648
726
  def -(item)
649
727
  return old_subtract_method4set(item) if (item.class==Array)
650
- a = Set.new(self)
651
- b = Set.new(item)
728
+ a = BitSet.new(self)
729
+ b = BitSet.new(item)
652
730
  return a - b
653
731
  end
654
732
  def &(item)
655
733
  return old_and_method4set(item) if (item.class==Array)
656
- a = Set.new(self)
657
- b = Set.new(item)
734
+ a = BitSet.new(self)
735
+ b = BitSet.new(item)
658
736
  return a & b
659
737
  end
660
738
  def |(item)
661
739
  return old_or_method4set(item) if (item.class==Array)
662
- a = Set.new(self)
663
- b = Set.new(item)
740
+ a = BitSet.new(self)
741
+ b = BitSet.new(item)
664
742
  return a | b
665
743
  end
666
744
  end
@@ -1,3 +1,3 @@
1
1
  module Setfu
2
- VERSION = "1.2.1"
2
+ VERSION = "2.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: setfu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Colvin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-04 00:00:00.000000000 Z
11
+ date: 2016-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler