setfu 2.0.0 → 2.1.0
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.
- checksums.yaml +4 -4
- data/lib/setfu/version.rb +1 -1
- data/lib/setfu.rb +505 -57
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 371320640c75eaaa4682a0c1e0d4ca0255353636
|
4
|
+
data.tar.gz: 440754a957cd4df9e83960b93b10c041b00d8ab7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a3fb347e019df2158eea8727ba768c58659335dc2a295fd00b36c3dce4bfbf1e36ac7d81b0719b63ccd581522e082deb0c6f967770985fa3191c34e2f187e4d
|
7
|
+
data.tar.gz: 591c8c369e1eb6abe642837b5f3af8aeda669a0a5d01200393dde21cd7d687e30b2204dbb4fa2438e15ef40abec6f53f87ae1a36f398fb8d8cf023d1fc58191f
|
data/lib/setfu/version.rb
CHANGED
data/lib/setfu.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "setfu/version"
|
2
|
+
require "prime"
|
2
3
|
|
3
4
|
class BitSet
|
4
5
|
attr_reader :entropy
|
@@ -154,21 +155,6 @@ class BitSet
|
|
154
155
|
return true
|
155
156
|
end
|
156
157
|
|
157
|
-
def add_opposing_case!
|
158
|
-
aa = BitSet.lowercase_chars
|
159
|
-
bb = BitSet.uppercase_chars
|
160
|
-
ka = aa & self # subset lower case
|
161
|
-
kb = bb & self # subset upper case
|
162
|
-
@bits |= ka.to_i >> 32
|
163
|
-
@bits |= kb.to_i << 32
|
164
|
-
self.entropy = 32 + kb.recalculate_entropy! if self.entropy <= 123
|
165
|
-
self
|
166
|
-
end
|
167
|
-
|
168
|
-
def add_opposing_case
|
169
|
-
dup.add_opposing_case!
|
170
|
-
end
|
171
|
-
|
172
158
|
def to_bset
|
173
159
|
return self
|
174
160
|
end
|
@@ -190,23 +176,25 @@ class BitSet
|
|
190
176
|
self
|
191
177
|
end
|
192
178
|
|
193
|
-
def inc!
|
194
|
-
|
195
|
-
@
|
179
|
+
def inc!(n=1)
|
180
|
+
raise "illegal negative parameter in #inc" if n < 0
|
181
|
+
@entropy += n
|
182
|
+
@bits <<= n
|
196
183
|
self
|
197
184
|
end
|
198
185
|
|
199
|
-
def dec!
|
200
|
-
|
186
|
+
def dec!(n=1)
|
187
|
+
raise "illegal negative parameter in #inc" if n < 0
|
188
|
+
@bits >>= n
|
201
189
|
self
|
202
190
|
end
|
203
191
|
|
204
|
-
def inc
|
205
|
-
return dup.inc!
|
192
|
+
def inc(n=1)
|
193
|
+
return dup.inc!(n)
|
206
194
|
end
|
207
195
|
|
208
|
-
def dec
|
209
|
-
return dup.dec!
|
196
|
+
def dec(n=1)
|
197
|
+
return dup.dec!(n)
|
210
198
|
end
|
211
199
|
|
212
200
|
def recalculate_entropy!
|
@@ -234,7 +222,7 @@ class BitSet
|
|
234
222
|
#@entropy += 1
|
235
223
|
@entropy
|
236
224
|
end
|
237
|
-
|
225
|
+
|
238
226
|
# this only works on integer ... String, Array, Range does not implement: &, |, ^
|
239
227
|
def coerce(other)
|
240
228
|
#puts "TESTING ... coerce called!"
|
@@ -433,17 +421,77 @@ class BitSet
|
|
433
421
|
end
|
434
422
|
return true
|
435
423
|
end
|
424
|
+
|
425
|
+
def reverse_each(*prms) # do a benchmark and see which is faster, reverse_each or each
|
426
|
+
int_mode = true
|
427
|
+
set = self.dup
|
428
|
+
prms.each do |prm|
|
429
|
+
if prm.respond_to? :first
|
430
|
+
set &= prm
|
431
|
+
else
|
432
|
+
int_mode = prm
|
433
|
+
end
|
434
|
+
end
|
435
|
+
ary = set.to_a(int_mode)
|
436
|
+
unless block_given?
|
437
|
+
enu = Enumerator.new do |yy|
|
438
|
+
while !ary.empty?
|
439
|
+
yy << ary.pop
|
440
|
+
end
|
441
|
+
return enu
|
442
|
+
end
|
443
|
+
end
|
444
|
+
while !ary.empty?
|
445
|
+
yield ary.pop
|
446
|
+
end
|
447
|
+
end
|
436
448
|
|
437
|
-
def
|
449
|
+
def each(*prms)
|
438
450
|
bits = @bits
|
439
451
|
pos = 0
|
452
|
+
stop = nil
|
453
|
+
chr_mode = false
|
454
|
+
prms.each do |prm|
|
455
|
+
if prm.respond_to? :first
|
456
|
+
a = prm.first.ord
|
457
|
+
b = prm.last.ord
|
458
|
+
a,b = b,a if a>b
|
459
|
+
pos = a
|
460
|
+
bits >>= pos
|
461
|
+
stop = b
|
462
|
+
else
|
463
|
+
chr_mode = !prm
|
464
|
+
end
|
465
|
+
end
|
466
|
+
unless block_given?
|
467
|
+
enu = Enumerator.new do |yy|
|
468
|
+
while bits > 0
|
469
|
+
if ((bits & 1) == 1)
|
470
|
+
yy << chr_mode ? pos.chr(Encoding::UTF_8) : pos
|
471
|
+
end
|
472
|
+
pos += 1
|
473
|
+
unless stop.nil?
|
474
|
+
break if pos > stop
|
475
|
+
end
|
476
|
+
bits >>= 1
|
477
|
+
end # while
|
478
|
+
end # do
|
479
|
+
return enu
|
480
|
+
end # unless
|
440
481
|
while bits > 0
|
441
|
-
|
482
|
+
if ((bits & 1) == 1)
|
483
|
+
yield chr_mode ? pos.chr(Encoding::UTF_8) : pos
|
484
|
+
end
|
442
485
|
pos += 1
|
486
|
+
unless stop.nil?
|
487
|
+
break if pos > stop
|
488
|
+
end
|
443
489
|
bits >>= 1
|
444
490
|
end
|
445
491
|
self
|
446
|
-
end
|
492
|
+
end #def
|
493
|
+
|
494
|
+
alias_method :each_member, :each
|
447
495
|
|
448
496
|
def to_i
|
449
497
|
return @bits
|
@@ -555,35 +603,6 @@ class BitSet
|
|
555
603
|
end
|
556
604
|
return state # this gets ignored, but to be safe, do what the previous version did
|
557
605
|
end
|
558
|
-
|
559
|
-
def min
|
560
|
-
return nil if empty?
|
561
|
-
range = (self.entropy)..(0)
|
562
|
-
while((range.first - range.last) >= 2) do
|
563
|
-
mid = ((range.first - range.last) >> 1) + range.last
|
564
|
-
top = (range.first)..(mid)
|
565
|
-
bot = (mid)..(range.last)
|
566
|
-
range = self ** bot ? bot : top
|
567
|
-
end
|
568
|
-
#byebug
|
569
|
-
return range.last if (self[range.last])
|
570
|
-
range.first
|
571
|
-
end
|
572
|
-
|
573
|
-
def max #look from left
|
574
|
-
#byebug
|
575
|
-
return nil if empty?
|
576
|
-
range = (self.entropy)..(0)
|
577
|
-
while((range.first - range.last) >= 2) do
|
578
|
-
mid = ((range.first - range.last) >> 1) + range.last
|
579
|
-
top = (range.first)..(mid)
|
580
|
-
bot = (mid)..(range.last)
|
581
|
-
range = self ** top ? top : bot
|
582
|
-
end
|
583
|
-
#byebug
|
584
|
-
return range.first if (self[range.first])
|
585
|
-
range.last
|
586
|
-
end
|
587
606
|
|
588
607
|
# :array :array_chars :string :set
|
589
608
|
def rand(elm_count, format = :set)
|
@@ -755,6 +774,435 @@ class Range
|
|
755
774
|
include SetFuMixinBinaryProperOperator
|
756
775
|
end
|
757
776
|
|
777
|
+
# for older rubbies ... slow but works ... >2.1.0 supports this and is much faster
|
778
|
+
# no need to improve as 1.9x is no longer supported
|
779
|
+
class Integer
|
780
|
+
unless 5.respond_to? :bit_length
|
781
|
+
def bit_length
|
782
|
+
pos = 0
|
783
|
+
n = self
|
784
|
+
loop do
|
785
|
+
break if n == 0
|
786
|
+
break if n == -1
|
787
|
+
n >>= 1
|
788
|
+
pos += 1
|
789
|
+
end
|
790
|
+
return pos
|
791
|
+
end
|
792
|
+
end
|
793
|
+
end
|
794
|
+
|
795
|
+
class Integer
|
796
|
+
def lsb_bit_position
|
797
|
+
return nil if zero?
|
798
|
+
pos = 0
|
799
|
+
n = self
|
800
|
+
while (n & 0xffffffffffffffff) == 0
|
801
|
+
n >>= 64
|
802
|
+
pos += 64
|
803
|
+
end
|
804
|
+
while (n & 0xff) == 0
|
805
|
+
n >>= 8
|
806
|
+
pos += 8
|
807
|
+
end
|
808
|
+
mask = 1
|
809
|
+
loop do
|
810
|
+
break if mask == (n & mask)
|
811
|
+
mask <<= 1
|
812
|
+
pos += 1
|
813
|
+
end
|
814
|
+
return pos
|
815
|
+
end
|
816
|
+
def msb_bit_position
|
817
|
+
t = bit_length
|
818
|
+
return t.zero? ? nil : t-1
|
819
|
+
end
|
820
|
+
end
|
821
|
+
|
822
|
+
=begin
|
823
|
+
#### too slow see first, last for improved performance
|
824
|
+
class BitSet
|
825
|
+
def min
|
826
|
+
return nil if empty?
|
827
|
+
range = (self.entropy)..(0)
|
828
|
+
while((range.first - range.last) >= 2) do
|
829
|
+
mid = ((range.first - range.last) >> 1) + range.last
|
830
|
+
top = (range.first)..(mid)
|
831
|
+
bot = (mid)..(range.last)
|
832
|
+
range = self ** bot ? bot : top
|
833
|
+
end
|
834
|
+
#byebug
|
835
|
+
return range.last if (self[range.last])
|
836
|
+
range.first
|
837
|
+
end
|
838
|
+
|
839
|
+
def max #look from left
|
840
|
+
#byebug
|
841
|
+
return nil if empty?
|
842
|
+
range = (self.entropy)..(0)
|
843
|
+
while((range.first - range.last) >= 2) do
|
844
|
+
mid = ((range.first - range.last) >> 1) + range.last
|
845
|
+
top = (range.first)..(mid)
|
846
|
+
bot = (mid)..(range.last)
|
847
|
+
range = self ** top ? top : bot
|
848
|
+
end
|
849
|
+
#byebug
|
850
|
+
return range.first if (self[range.first])
|
851
|
+
range.last
|
852
|
+
end
|
853
|
+
end
|
854
|
+
=end
|
855
|
+
|
856
|
+
class BitSet
|
857
|
+
def entropy_2n! # set entropy to the next greater power of 2**n
|
858
|
+
@entropy = 1 << @bits.bit_length.bit_length
|
859
|
+
end
|
860
|
+
end
|
861
|
+
|
862
|
+
class BitSet
|
863
|
+
def first(p=true)
|
864
|
+
rtn = @bits.lsb_bit_position
|
865
|
+
return p ? rtn : rtn.chr(Encoding::UTF_8)
|
866
|
+
end
|
867
|
+
def last(p=true)
|
868
|
+
rtn = @bits.msb_bit_position
|
869
|
+
return p ? rtn : rtn.chr(Encoding::UTF_8)
|
870
|
+
end
|
871
|
+
def first!(p=true)
|
872
|
+
rtn = @bits.lsb_bit_position
|
873
|
+
replace(self ^ [rtn]) unless rtn.nil?
|
874
|
+
return p ? rtn : rtn.chr(Encoding::UTF_8)
|
875
|
+
end
|
876
|
+
def last!(p=true)
|
877
|
+
rtn = @bits.msb_bit_position
|
878
|
+
replace(self ^ [rtn]) unless rtn.nil?
|
879
|
+
return p ? rtn : rtn.chr(Encoding::UTF_8)
|
880
|
+
end
|
881
|
+
end
|
882
|
+
|
883
|
+
class BitSet
|
884
|
+
alias_method :min, :first
|
885
|
+
alias_method :max, :last
|
886
|
+
end
|
887
|
+
|
888
|
+
class BitSet
|
889
|
+
@@even_bits = 0x5555555555555555555555555555555555555555555555555555555555555555
|
890
|
+
@@odd_bits = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
891
|
+
@@shifts = 256
|
892
|
+
def odd
|
893
|
+
t = @@odd_bits
|
894
|
+
s = @@shifts
|
895
|
+
while @bits > t
|
896
|
+
t |= t << s
|
897
|
+
s <<= 1
|
898
|
+
end
|
899
|
+
rtn = self.dup
|
900
|
+
rtn.set_bits!(t & @bits)
|
901
|
+
return rtn
|
902
|
+
end
|
903
|
+
def even
|
904
|
+
t = @@even_bits
|
905
|
+
s = @@shifts
|
906
|
+
while @bits > t
|
907
|
+
t |= t << s
|
908
|
+
s <<= 1
|
909
|
+
end
|
910
|
+
rtn = self.dup
|
911
|
+
rtn.set_bits!(t & @bits)
|
912
|
+
return rtn
|
913
|
+
end
|
914
|
+
def odd!
|
915
|
+
t1 = @@odd_bits
|
916
|
+
t2 = @@even_bits
|
917
|
+
s = @@shifts
|
918
|
+
while @bits > t2
|
919
|
+
t1 |= t1 << s
|
920
|
+
t2 |= t2 << s
|
921
|
+
s <<= 1
|
922
|
+
end
|
923
|
+
rtn = self.dup
|
924
|
+
rtn.set_bits!(t2 & @bits)
|
925
|
+
self.set_bits!(t1 & @bits)
|
926
|
+
return rtn
|
927
|
+
end
|
928
|
+
def even!
|
929
|
+
t1 = @@odd_bits
|
930
|
+
t2 = @@even_bits
|
931
|
+
s = @@shifts
|
932
|
+
while @bits > t2
|
933
|
+
t1 |= t1 << s
|
934
|
+
t2 |= t2 << s
|
935
|
+
s <<= 1
|
936
|
+
end
|
937
|
+
rtn = self.dup
|
938
|
+
rtn.set_bits!(t1 & @bits)
|
939
|
+
self.set_bits!(t2 & @bits)
|
940
|
+
return rtn
|
941
|
+
end
|
942
|
+
def odd?
|
943
|
+
return false if empty?
|
944
|
+
t = @@odd_bits
|
945
|
+
s = @@shifts
|
946
|
+
while @bits > t
|
947
|
+
t |= t << s
|
948
|
+
s <<= 1
|
949
|
+
end
|
950
|
+
tst = t & @bits
|
951
|
+
return tst == @bits
|
952
|
+
end
|
953
|
+
def even?
|
954
|
+
return false if empty?
|
955
|
+
t = @@even_bits
|
956
|
+
s = @@shifts
|
957
|
+
while @bits > t
|
958
|
+
t |= t << s
|
959
|
+
s <<= 1
|
960
|
+
end
|
961
|
+
tst = t & @bits
|
962
|
+
return tst == @bits
|
963
|
+
end
|
964
|
+
end
|
965
|
+
|
966
|
+
class BitSet
|
967
|
+
def add_primes!(n=100)
|
968
|
+
self.add!(Prime.take(n))
|
969
|
+
end
|
970
|
+
def add_primes(n=100)
|
971
|
+
self.add(Prime.take(n))
|
972
|
+
end
|
973
|
+
end
|
974
|
+
|
975
|
+
class BitSet
|
976
|
+
def self.default_utf_case_pairs
|
977
|
+
@@TRANS_HASH = {
|
978
|
+
192=>224, 193=>225, 194=>226, 195=>227, 196=>228, 197=>229, 198=>230, 199=>231, 200=>232, 201=>233, 202=>234,
|
979
|
+
203=>235, 204=>236, 205=>237, 206=>238, 207=>239, 208=>240, 209=>241, 210=>242, 211=>243, 212=>244, 213=>245,
|
980
|
+
214=>246, 216=>248, 217=>249, 218=>250, 219=>251, 220=>252, 221=>253, 222=>254, 224=>192, 225=>193, 226=>194,
|
981
|
+
227=>195, 228=>196, 229=>197, 230=>198, 231=>199, 232=>200, 233=>201, 234=>202, 235=>203, 236=>204, 237=>205,
|
982
|
+
238=>206, 239=>207, 240=>208, 241=>209, 242=>210, 243=>211, 244=>212, 245=>213, 246=>214, 248=>216, 249=>217,
|
983
|
+
250=>218, 251=>219, 252=>220, 253=>221, 254=>222, 255=>376, 256=>257, 257=>256, 258=>259, 259=>258, 260=>261,
|
984
|
+
261=>260, 262=>263, 263=>262, 264=>265, 265=>264, 266=>267, 267=>266, 268=>269, 269=>268, 270=>271, 271=>270,
|
985
|
+
272=>273, 273=>272, 274=>275, 275=>274, 276=>277, 277=>276, 278=>279, 279=>278, 280=>281, 281=>280, 282=>283,
|
986
|
+
283=>282, 284=>285, 285=>284, 286=>287, 287=>286, 288=>289, 289=>288, 290=>291, 291=>290, 292=>293, 293=>292,
|
987
|
+
294=>295, 295=>294, 296=>297, 297=>296, 298=>299, 299=>298, 300=>301, 301=>300, 302=>303, 303=>302, 306=>307,
|
988
|
+
307=>306, 308=>309, 309=>308, 310=>311, 311=>310, 313=>314, 314=>313, 315=>316, 316=>315, 317=>318, 318=>317,
|
989
|
+
319=>320, 320=>319, 321=>322, 322=>321, 323=>324, 324=>323, 325=>326, 326=>325, 327=>328, 328=>327, 330=>331,
|
990
|
+
331=>330, 332=>333, 333=>332, 334=>335, 335=>334, 336=>337, 337=>336, 338=>339, 339=>338, 340=>341, 341=>340,
|
991
|
+
342=>343, 343=>342, 344=>345, 345=>344, 346=>347, 347=>346, 348=>349, 349=>348, 350=>351, 351=>350, 352=>353,
|
992
|
+
353=>352, 354=>355, 355=>354, 356=>357, 357=>356, 358=>359, 359=>358, 360=>361, 361=>360, 362=>363, 363=>362,
|
993
|
+
364=>365, 365=>364, 366=>367, 367=>366, 368=>369, 369=>368, 370=>371, 371=>370, 372=>373, 373=>372, 374=>375,
|
994
|
+
375=>374, 376=>255, 377=>378, 378=>377, 379=>380, 380=>379, 381=>382, 382=>381, 384=>579, 385=>595, 386=>387,
|
995
|
+
387=>386, 388=>389, 389=>388, 390=>596, 391=>392, 392=>391, 393=>598, 394=>599, 395=>396, 396=>395, 398=>477,
|
996
|
+
399=>601, 400=>603, 401=>402, 402=>401, 403=>608, 404=>611, 405=>502, 406=>617, 407=>616, 408=>409, 409=>408,
|
997
|
+
410=>573, 412=>623, 413=>626, 414=>544, 415=>629, 416=>417, 417=>416, 418=>419, 419=>418, 420=>421, 421=>420,
|
998
|
+
423=>424, 424=>423, 425=>643, 428=>429, 429=>428, 430=>648, 431=>432, 432=>431, 433=>650, 434=>651, 435=>436,
|
999
|
+
436=>435, 437=>438, 438=>437, 439=>658, 440=>441, 441=>440, 444=>445, 445=>444, 447=>503, 452=>454, 454=>452, 455=>457, 457=>455, 458=>460, 460=>458, 461=>462, 462=>461,
|
1000
|
+
463=>464, 464=>463, 465=>466, 466=>465, 467=>468, 468=>467, 469=>470, 470=>469, 471=>472, 472=>471, 473=>474,
|
1001
|
+
474=>473, 475=>476, 476=>475, 477=>398, 478=>479, 479=>478, 480=>481, 481=>480, 482=>483, 483=>482, 484=>485,
|
1002
|
+
485=>484, 486=>487, 487=>486, 488=>489, 489=>488, 490=>491, 491=>490, 492=>493, 493=>492, 494=>495, 495=>494, 497=>499, 499=>497,
|
1003
|
+
500=>501, 501=>500, 502=>405, 503=>447, 504=>505, 505=>504, 506=>507, 507=>506, 508=>509, 509=>508, 510=>511,
|
1004
|
+
511=>510, 512=>513, 513=>512, 514=>515, 515=>514, 516=>517, 517=>516, 518=>519, 519=>518, 520=>521, 521=>520,
|
1005
|
+
522=>523, 523=>522, 524=>525, 525=>524, 526=>527, 527=>526, 528=>529, 529=>528, 530=>531, 531=>530, 532=>533,
|
1006
|
+
533=>532, 534=>535, 535=>534, 536=>537, 537=>536, 538=>539, 539=>538, 540=>541, 541=>540, 542=>543, 543=>542,
|
1007
|
+
544=>414, 546=>547, 547=>546, 548=>549, 549=>548, 550=>551, 551=>550, 552=>553, 553=>552, 554=>555, 555=>554,
|
1008
|
+
556=>557, 557=>556, 558=>559, 559=>558, 560=>561, 561=>560, 562=>563, 563=>562, 570=>11365, 571=>572, 572=>571,
|
1009
|
+
573=>410, 574=>11366, 575=>11390, 576=>11391, 577=>578, 578=>577, 579=>384, 580=>649, 581=>652, 582=>583, 583=>582,
|
1010
|
+
584=>585, 585=>584, 586=>587, 587=>586, 588=>589, 589=>588, 590=>591, 591=>590, 592=>11375, 593=>11373, 594=>11376,
|
1011
|
+
595=>385, 596=>390, 598=>393, 599=>394, 601=>399, 603=>400, 608=>403, 611=>404, 616=>407, 617=>406, 623=>412, 626=>413,
|
1012
|
+
629=>415, 643=>425, 648=>430, 649=>580, 650=>433, 651=>434, 652=>581, 658=>439, 913=>945, 914=>946, 915=>947, 916=>948,
|
1013
|
+
917=>949, 918=>950, 919=>951, 920=>952, 921=>953, 922=>954, 923=>955, 924=>956, 925=>957, 926=>958, 927=>959, 928=>960,
|
1014
|
+
929=>961, 931=>963, 932=>964, 933=>965, 934=>966, 935=>967, 936=>968, 937=>969, 945=>913, 946=>914, 947=>915, 948=>916,
|
1015
|
+
949=>917, 950=>918, 951=>919, 952=>920, 953=>921, 954=>922, 955=>923, 956=>924, 957=>925, 958=>926, 959=>927, 960=>928,
|
1016
|
+
961=>929, 962=>931, 963=>931, 964=>932, 965=>933, 966=>934, 967=>935, 968=>936, 969=>937, 11365=>570, 11366=>574, 11373=>593,
|
1017
|
+
11375=>592, 11376=>594, 11390=>575, 11391=>576, 64257=>64258, 64258=>64257 }
|
1018
|
+
end
|
1019
|
+
|
1020
|
+
default_utf_case_pairs # initialize with above
|
1021
|
+
|
1022
|
+
def self.zap_utf_case_pairs
|
1023
|
+
@@TRANS_HASH = {}
|
1024
|
+
end
|
1025
|
+
|
1026
|
+
def self.rm_utf_case_pairs(obj)
|
1027
|
+
if obj.respond_to? :each_char
|
1028
|
+
obj.each_char do |ch|
|
1029
|
+
@@TRANS_HASH.delete str.ord
|
1030
|
+
end
|
1031
|
+
else
|
1032
|
+
obj.each do |elm|
|
1033
|
+
@@TRANS_HASH.delete elm
|
1034
|
+
end
|
1035
|
+
end
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
def self.add_utf_case_pairs(str)
|
1039
|
+
return if str.empty?
|
1040
|
+
raise "add_utf_case_pairs requires even number of characters" unless str.length.even?
|
1041
|
+
0.step(str.length-2,2) do |x|
|
1042
|
+
@@TRANS_HASH[str[x].ord]=str[x+1].ord
|
1043
|
+
end
|
1044
|
+
end
|
1045
|
+
|
1046
|
+
def self.get_utf_case_pairs(char=true)
|
1047
|
+
return @@TRANS_HASH.dup unless char
|
1048
|
+
rtn = {}
|
1049
|
+
@@TRANS_HASH.each_pair do |key,value|
|
1050
|
+
rtn[key.chr(Encoding::UTF_8)] = value.chr(Encoding::UTF_8)
|
1051
|
+
rtn[value.chr(Encoding::UTF_8)] = key.chr(Encoding::UTF_8)
|
1052
|
+
end
|
1053
|
+
return rtn
|
1054
|
+
end
|
1055
|
+
|
1056
|
+
def add_opposing_case!
|
1057
|
+
aa = BitSet.lowercase_chars
|
1058
|
+
bb = BitSet.uppercase_chars
|
1059
|
+
ka = aa & self # subset lower case
|
1060
|
+
kb = bb & self # subset upper case
|
1061
|
+
@bits |= ka.to_i >> 32
|
1062
|
+
@bits |= kb.to_i << 32
|
1063
|
+
self.entropy = 32 + kb.recalculate_entropy! if self.entropy <= 123
|
1064
|
+
self
|
1065
|
+
end
|
1066
|
+
|
1067
|
+
def add_opposing_case
|
1068
|
+
dup.add_opposing_case!
|
1069
|
+
end
|
1070
|
+
|
1071
|
+
def add_opposing_utf_case!
|
1072
|
+
add_opposing_case!
|
1073
|
+
tmp = @@TRANS_HASH.sort
|
1074
|
+
st = tmp.first[0]
|
1075
|
+
nd = tmp.last[0]
|
1076
|
+
self.each_member(st..nd) do |elm|
|
1077
|
+
unless @@TRANS_HASH[elm].nil?
|
1078
|
+
@bits |= 1 << @@TRANS_HASH[elm]
|
1079
|
+
@entropy = elm if elm > @entropy
|
1080
|
+
end
|
1081
|
+
end
|
1082
|
+
end
|
1083
|
+
def add_opposing_utf_case
|
1084
|
+
dup.add_opposing_utf_case!
|
1085
|
+
end
|
1086
|
+
end
|
1087
|
+
|
1088
|
+
class BitSet
|
1089
|
+
def split
|
1090
|
+
ary = self.to_a
|
1091
|
+
len = ary.length
|
1092
|
+
lh = len >> 1
|
1093
|
+
a = ary[0..(lh-1)].to_bset
|
1094
|
+
b = ary[lh..len].to_bset
|
1095
|
+
return [a,b]
|
1096
|
+
end
|
1097
|
+
def split!
|
1098
|
+
both = self.split
|
1099
|
+
rtn = both.last
|
1100
|
+
self.replace both.first
|
1101
|
+
return rtn
|
1102
|
+
end
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
# now the stuff that slows down the editor ... so last goes here
|
1106
|
+
class BitSet
|
1107
|
+
|
1108
|
+
UTF_UPPER_CASE_CHARS = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝÞðĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁɃɄɅɆɈɊɌɎΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩⱭⱯⱰⱾⱿfl"
|
1109
|
+
UTF_LOWER_CASE_CHARS = "Ðàáâãäåçèéêëìíîïñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįĵķĺļľŀłńņňŋōŏőŕŗřśŝşšţťŧũūŭůűųŵŷźżžƀƃƅƈƌƒƕƙƚƞơƥƨƭưƴƶƹƽƿǎǐǒǔǖǘǚǜǝǟǡǥǧǩǫǭǯǵǹǻǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȥȧȩȫȭȯȱȳȼȿɀɂɇɉɋɍɏɐɑɒɓɔɖɗəɛɠɣɨɩɯɲɵʀʃʈʉʊʋʌʒαβγδεζηθικλμνξοπρςστυφχψωⱥⱦfi"
|
1110
|
+
UTF_LOWER_CASE_DUAL_CHARS = "ȸȹijnjdždzʣʥæǣǽƣœœɶʦljʪʫijȣ"
|
1111
|
+
UTF_UPPER_CASE_DUAL_CHARS = "NJDŽDZÆǢǼƢƢŒLJIJIJȢ"
|
1112
|
+
UTF_MIXED_CASE_DUAL_CHARS = "LjNjDžDz"
|
1113
|
+
|
1114
|
+
def self.default_utf_sets
|
1115
|
+
@@UTF_UPPER_CASE_CHARS = UTF_UPPER_CASE_CHARS
|
1116
|
+
@@UTF_LOWER_CASE_CHARS = UTF_LOWER_CASE_CHARS
|
1117
|
+
@@UTF_LOWER_CASE_DUAL_CHARS = UTF_LOWER_CASE_DUAL_CHARS
|
1118
|
+
@@UTF_UPPER_CASE_DUAL_CHARS = UTF_UPPER_CASE_DUAL_CHARS
|
1119
|
+
@@UTF_MIXED_CASE_DUAL_CHARS = UTF_MIXED_CASE_DUAL_CHARS
|
1120
|
+
|
1121
|
+
@@UTF_UPPER_CASE_SET = UTF_UPPER_CASE_CHARS.to_bset
|
1122
|
+
@@UTF_LOWER_CASE_SET = UTF_LOWER_CASE_CHARS.to_bset
|
1123
|
+
@@UTF_LOWER_CASE_DUAL_SET = UTF_LOWER_CASE_DUAL_CHARS.to_bset
|
1124
|
+
@@UTF_UPPER_CASE_DUAL_SET = UTF_UPPER_CASE_DUAL_CHARS.to_bset
|
1125
|
+
@@UTF_MIXED_CASE_DUAL_SET = UTF_MIXED_CASE_DUAL_CHARS.to_bset
|
1126
|
+
end
|
1127
|
+
default_utf_sets
|
1128
|
+
|
1129
|
+
def self.zap_utf_sets
|
1130
|
+
@@UTF_UPPER_CASE_CHARS = ""
|
1131
|
+
@@UTF_LOWER_CASE_CHARS = ""
|
1132
|
+
@@UTF_LOWER_CASE_DUAL_CHARS = ""
|
1133
|
+
@@UTF_UPPER_CASE_DUAL_CHARS = ""
|
1134
|
+
@@UTF_MIXED_CASE_DUAL_CHARS = ""
|
1135
|
+
|
1136
|
+
@@UTF_UPPER_CASE_SET = "".to_bset
|
1137
|
+
@@UTF_LOWER_CASE_SET = "".to_bset
|
1138
|
+
@@UTF_LOWER_CASE_DUAL_SET = "".to_bset
|
1139
|
+
@@UTF_UPPER_CASE_DUAL_SET = "".to_bset
|
1140
|
+
@@UTF_MIXED_CASE_DUAL_SET = "".to_bset
|
1141
|
+
end
|
1142
|
+
|
1143
|
+
def self.modify_utf_sets(*prms)
|
1144
|
+
flag_add = true
|
1145
|
+
target_chars = nil
|
1146
|
+
target_set = nil
|
1147
|
+
source = nil
|
1148
|
+
prms.each do |prm|
|
1149
|
+
if prm.kind_of? String
|
1150
|
+
source = prm
|
1151
|
+
elsif prm.kind_of? BitSet
|
1152
|
+
source = prm
|
1153
|
+
elsif prm.kind_of? Symbol
|
1154
|
+
if prm == :rm
|
1155
|
+
flag_add = false
|
1156
|
+
elsif prm == :add
|
1157
|
+
flag_add = true
|
1158
|
+
elsif prm == :mix
|
1159
|
+
target_chars = "@@UTF_MIXED_CASE_DUAL_CHARS"
|
1160
|
+
target_set = "@@UTF_MIXED_CASE_DUAL_SET"
|
1161
|
+
elsif prm == :upper
|
1162
|
+
target_chars = "@@UTF_UPPER_CASE_CHARS"
|
1163
|
+
target_set = "@@UTF_UPPER_CASE_SET"
|
1164
|
+
elsif prm == :lower
|
1165
|
+
target_chars = "@@UTF_LOWER_CASE_CHARS"
|
1166
|
+
target_set = "@@UTF_LOWER_CASE_SET"
|
1167
|
+
elsif prm == :dual_upper
|
1168
|
+
target_chars = "@@UTF_UPPER_CASE_DUAL_CHARS"
|
1169
|
+
target_set = "@@UTF_UPPER_CASE_DUAL_SET"
|
1170
|
+
elsif prm == :dual_lower
|
1171
|
+
target_chars = "@@UTF_LOWER_CASE_DUAL_CHARS"
|
1172
|
+
target_set = "@@UTF_LOWER_CASE_DUAL_SET"
|
1173
|
+
end
|
1174
|
+
end
|
1175
|
+
end
|
1176
|
+
return false if target_chars.nil?
|
1177
|
+
return false if source.nil?
|
1178
|
+
return false unless source ** target_set
|
1179
|
+
if flag_add
|
1180
|
+
eval("#{target_set} |= source")
|
1181
|
+
eval("#{target_chars} |= #{target_set}.to_s")
|
1182
|
+
else
|
1183
|
+
eval("#{target_set} -= source")
|
1184
|
+
eval("#{target_chars} -= #{target_set}.to_s")
|
1185
|
+
end
|
1186
|
+
return true
|
1187
|
+
end
|
1188
|
+
|
1189
|
+
def self.uppercase_utf_chars
|
1190
|
+
return @@UTF_UPPER_CASE_SET.dup
|
1191
|
+
end
|
1192
|
+
def self.lowercase_utf_chars
|
1193
|
+
return @@UTF_LOWER_CASE_SET.dup
|
1194
|
+
end
|
1195
|
+
def self.mixcase_utf_chars
|
1196
|
+
return @@UTF_MIXED_CASE_DUAL_SET.dup
|
1197
|
+
end
|
1198
|
+
def self.dual_uppercase_utf_chars
|
1199
|
+
return @@UTF_UPPER_CASE_DUAL_SET.dup
|
1200
|
+
end
|
1201
|
+
def self.dual_lowercase_utf_chars
|
1202
|
+
return @@UTF_LOWER_CASE_DUAL_SET.dup
|
1203
|
+
end
|
1204
|
+
end
|
1205
|
+
|
758
1206
|
=begin
|
759
1207
|
# BAD IDEA ... nil is usually an error
|
760
1208
|
class NilClass # treat nil as empty set
|
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: 2.
|
4
|
+
version: 2.1.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:
|
11
|
+
date: 2017-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -126,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
126
|
version: '0'
|
127
127
|
requirements: []
|
128
128
|
rubyforge_project:
|
129
|
-
rubygems_version: 2.
|
129
|
+
rubygems_version: 2.5.1
|
130
130
|
signing_key:
|
131
131
|
specification_version: 4
|
132
132
|
summary: Set class
|