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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/setfu/version.rb +1 -1
  3. data/lib/setfu.rb +505 -57
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 86cb17462d85ca1892275124d15b258e39500a81
4
- data.tar.gz: 0c6b22148997f47f43494269c18fe78de5cec4fc
3
+ metadata.gz: 371320640c75eaaa4682a0c1e0d4ca0255353636
4
+ data.tar.gz: 440754a957cd4df9e83960b93b10c041b00d8ab7
5
5
  SHA512:
6
- metadata.gz: ba3a1ecece8183f14ce227512e19b89fcda2724bcc84e7e5ec67e81b7c781013375ac29cd777370411dc9aaf499117fcc6100857211e06d9bc92713a360ffa89
7
- data.tar.gz: c4f64253c8796b4e917aa09a0ff93eeefe9e2a05b39e5f212968aa51e02c8f123dfb662707f646c06362f79d7cf3ba9ac912e0f13f4649622a5bb66d6ee2dfb9
6
+ metadata.gz: 9a3fb347e019df2158eea8727ba768c58659335dc2a295fd00b36c3dce4bfbf1e36ac7d81b0719b63ccd581522e082deb0c6f967770985fa3191c34e2f187e4d
7
+ data.tar.gz: 591c8c369e1eb6abe642837b5f3af8aeda669a0a5d01200393dde21cd7d687e30b2204dbb4fa2438e15ef40abec6f53f87ae1a36f398fb8d8cf023d1fc58191f
data/lib/setfu/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Setfu
2
- VERSION = "2.0.0"
2
+ VERSION = "2.1.0"
3
3
  end
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
- @entropy += 1
195
- @bits <<= 1
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
- @bits >>= 1
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 each_member
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
- yield pos if ((bits & 1) == 1)
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.0.0
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: 2016-02-01 00:00:00.000000000 Z
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.4.8
129
+ rubygems_version: 2.5.1
130
130
  signing_key:
131
131
  specification_version: 4
132
132
  summary: Set class