chars 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +1 -1
- data/.github/workflows/ruby.yml +28 -0
- data/.gitignore +8 -0
- data/.yardopts +1 -1
- data/ChangeLog.md +33 -0
- data/Gemfile +12 -0
- data/LICENSE.txt +1 -1
- data/README.md +130 -50
- data/Rakefile +6 -30
- data/benchmarks/compare.rb +16 -0
- data/benchmarks/substrings.rb +25 -0
- data/chars.gemspec +39 -105
- data/gemspec.yml +9 -5
- data/lib/chars/char_set.rb +371 -162
- data/lib/chars/chars.rb +86 -21
- data/lib/chars/extensions/integer.rb +34 -17
- data/lib/chars/extensions/string.rb +34 -17
- data/lib/chars/string_enumerator.rb +98 -0
- data/lib/chars/version.rb +2 -2
- data/spec/char_set_spec.rb +623 -110
- data/spec/chars_spec.rb +183 -27
- data/spec/extensions/integer_spec.rb +18 -18
- data/spec/extensions/string_spec.rb +20 -18
- data/spec/spec_helper.rb +0 -2
- data/spec/string_enumerator_spec.rb +99 -0
- metadata +57 -77
data/lib/chars/chars.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'chars/char_set'
|
2
4
|
|
3
5
|
module Chars
|
4
6
|
# The numeric decimal character set
|
5
7
|
NUMERIC = CharSet['0'..'9']
|
6
8
|
|
9
|
+
# @see NUMERIC
|
10
|
+
#
|
11
|
+
# @since 0.3.0
|
12
|
+
DIGITS = NUMERIC
|
13
|
+
|
7
14
|
# The octal character set
|
8
15
|
OCTAL = CharSet['0'..'7']
|
9
16
|
|
@@ -39,7 +46,11 @@ module Chars
|
|
39
46
|
]
|
40
47
|
|
41
48
|
# The space character set
|
42
|
-
|
49
|
+
#
|
50
|
+
# @since 0.3.0
|
51
|
+
WHITESPACE = CharSet[' ', "\f", "\n", "\r", "\t", "\v"]
|
52
|
+
|
53
|
+
SPACE = WHITESPACE
|
43
54
|
|
44
55
|
# The set of printable characters (not including spaces)
|
45
56
|
VISIBLE = ALPHA_NUMERIC | CharSet[
|
@@ -66,17 +77,30 @@ module Chars
|
|
66
77
|
# @return [CharSet]
|
67
78
|
# The decimal-digit character set.
|
68
79
|
#
|
69
|
-
|
80
|
+
# @see NUMERIC
|
81
|
+
#
|
82
|
+
def self.numeric
|
70
83
|
NUMERIC
|
71
84
|
end
|
72
85
|
|
86
|
+
#
|
87
|
+
# @see numeric
|
88
|
+
#
|
89
|
+
# @since 0.3.0
|
90
|
+
#
|
91
|
+
def self.digits
|
92
|
+
numeric
|
93
|
+
end
|
94
|
+
|
73
95
|
#
|
74
96
|
# The octal-digit character set.
|
75
97
|
#
|
76
98
|
# @return [CharSet]
|
77
99
|
# The octal-digit character set.
|
78
100
|
#
|
79
|
-
|
101
|
+
# @see OCTAL
|
102
|
+
#
|
103
|
+
def self.octal
|
80
104
|
OCTAL
|
81
105
|
end
|
82
106
|
|
@@ -86,7 +110,9 @@ module Chars
|
|
86
110
|
# @return [CharSet]
|
87
111
|
# The upper-case hexadecimal character set.
|
88
112
|
#
|
89
|
-
|
113
|
+
# @see UPPERCASE_HEXADECIMAL
|
114
|
+
#
|
115
|
+
def self.uppercase_hexadecimal
|
90
116
|
UPPERCASE_HEXADECIMAL
|
91
117
|
end
|
92
118
|
|
@@ -96,7 +122,9 @@ module Chars
|
|
96
122
|
# @return [CharSet]
|
97
123
|
# The lower-case hexadecimal character set.
|
98
124
|
#
|
99
|
-
|
125
|
+
# @see LOWERCASE_HEXADECIMAL
|
126
|
+
#
|
127
|
+
def self.lowercase_hexadecimal
|
100
128
|
LOWERCASE_HEXADECIMAL
|
101
129
|
end
|
102
130
|
|
@@ -106,7 +134,9 @@ module Chars
|
|
106
134
|
# @return [CharSet]
|
107
135
|
# The hexadecimal character set.
|
108
136
|
#
|
109
|
-
|
137
|
+
# @see HEXADECIMAL
|
138
|
+
#
|
139
|
+
def self.hexadecimal
|
110
140
|
HEXADECIMAL
|
111
141
|
end
|
112
142
|
|
@@ -116,7 +146,9 @@ module Chars
|
|
116
146
|
# @return [CharSet]
|
117
147
|
# The upper-case alphabetic character set.
|
118
148
|
#
|
119
|
-
|
149
|
+
# @see UPPERCASE_ALPHA
|
150
|
+
#
|
151
|
+
def self.uppercase_alpha
|
120
152
|
UPPERCASE_ALPHA
|
121
153
|
end
|
122
154
|
|
@@ -126,7 +158,9 @@ module Chars
|
|
126
158
|
# @return [CharSet]
|
127
159
|
# The lower-case alphabetic character set.
|
128
160
|
#
|
129
|
-
|
161
|
+
# @see LOWERCASE_ALPHA
|
162
|
+
#
|
163
|
+
def self.lowercase_alpha
|
130
164
|
LOWERCASE_ALPHA
|
131
165
|
end
|
132
166
|
|
@@ -136,7 +170,9 @@ module Chars
|
|
136
170
|
# @return [CharSet]
|
137
171
|
# The alphabetic character set.
|
138
172
|
#
|
139
|
-
|
173
|
+
# @see ALPHA
|
174
|
+
#
|
175
|
+
def self.alpha
|
140
176
|
ALPHA
|
141
177
|
end
|
142
178
|
|
@@ -146,7 +182,9 @@ module Chars
|
|
146
182
|
# @return [CharSet]
|
147
183
|
# The alpha-numeric character set.
|
148
184
|
#
|
149
|
-
|
185
|
+
# @see ALPHA_NUMERIC
|
186
|
+
#
|
187
|
+
def self.alpha_numeric
|
150
188
|
ALPHA_NUMERIC
|
151
189
|
end
|
152
190
|
|
@@ -156,7 +194,9 @@ module Chars
|
|
156
194
|
# @return [CharSet]
|
157
195
|
# The punctuation character set.
|
158
196
|
#
|
159
|
-
|
197
|
+
# @see PUNCTUATION
|
198
|
+
#
|
199
|
+
def self.punctuation
|
160
200
|
PUNCTUATION
|
161
201
|
end
|
162
202
|
|
@@ -166,18 +206,33 @@ module Chars
|
|
166
206
|
# @return [CharSet]
|
167
207
|
# The symbolic character set.
|
168
208
|
#
|
169
|
-
|
209
|
+
# @see SYMBOLS
|
210
|
+
#
|
211
|
+
def self.symbols
|
170
212
|
SYMBOLS
|
171
213
|
end
|
172
214
|
|
173
215
|
#
|
174
|
-
# The
|
216
|
+
# The whitespace character set.
|
175
217
|
#
|
176
218
|
# @return [CharSet]
|
177
|
-
# The
|
219
|
+
# The whitespace character set.
|
220
|
+
#
|
221
|
+
# @see SPACE
|
222
|
+
#
|
223
|
+
# @since 0.3.0
|
224
|
+
#
|
225
|
+
def self.whitespace
|
226
|
+
WHITESPACE
|
227
|
+
end
|
228
|
+
|
229
|
+
#
|
230
|
+
# The whitespace character set.
|
178
231
|
#
|
179
|
-
|
180
|
-
|
232
|
+
# @see #whitespace
|
233
|
+
#
|
234
|
+
def self.space
|
235
|
+
whitespace
|
181
236
|
end
|
182
237
|
|
183
238
|
#
|
@@ -186,7 +241,9 @@ module Chars
|
|
186
241
|
# @return [CharSet]
|
187
242
|
# The visible character set.
|
188
243
|
#
|
189
|
-
|
244
|
+
# @see VISIBLE
|
245
|
+
#
|
246
|
+
def self.visible
|
190
247
|
VISIBLE
|
191
248
|
end
|
192
249
|
|
@@ -196,7 +253,9 @@ module Chars
|
|
196
253
|
# @return [CharSet]
|
197
254
|
# The printable character set.
|
198
255
|
#
|
199
|
-
|
256
|
+
# @see PRINTABLE
|
257
|
+
#
|
258
|
+
def self.printable
|
200
259
|
PRINTABLE
|
201
260
|
end
|
202
261
|
|
@@ -206,7 +265,9 @@ module Chars
|
|
206
265
|
# @return [CharSet]
|
207
266
|
# The control-character character set.
|
208
267
|
#
|
209
|
-
|
268
|
+
# @see CONTROL
|
269
|
+
#
|
270
|
+
def self.control
|
210
271
|
CONTROL
|
211
272
|
end
|
212
273
|
|
@@ -216,7 +277,9 @@ module Chars
|
|
216
277
|
# @return [CharSet]
|
217
278
|
# The signed ASCII character set.
|
218
279
|
#
|
219
|
-
|
280
|
+
# @see SIGNED_ASCII
|
281
|
+
#
|
282
|
+
def self.signed_ascii
|
220
283
|
SIGNED_ASCII
|
221
284
|
end
|
222
285
|
|
@@ -226,7 +289,9 @@ module Chars
|
|
226
289
|
# @return [CharSet]
|
227
290
|
# The ASCII character set.
|
228
291
|
#
|
229
|
-
|
292
|
+
# @see ASCII
|
293
|
+
#
|
294
|
+
def self.ascii
|
230
295
|
ASCII
|
231
296
|
end
|
232
297
|
end
|
@@ -8,7 +8,8 @@ class Integer
|
|
8
8
|
# @return [Boolean]
|
9
9
|
# Specifies whether the byte belongs to the decimal-digit character set.
|
10
10
|
#
|
11
|
-
# @see Chars
|
11
|
+
# @see Chars::NUMERIC
|
12
|
+
# @see Chars::CharSet#include_byte?
|
12
13
|
#
|
13
14
|
def numeric?
|
14
15
|
Chars::NUMERIC.include_byte?(self)
|
@@ -20,7 +21,8 @@ class Integer
|
|
20
21
|
# @return [Boolean]
|
21
22
|
# Specifies whether the byte belongs to the octal-digit character set.
|
22
23
|
#
|
23
|
-
# @see Chars
|
24
|
+
# @see Chars::OCTAL
|
25
|
+
# @see Chars::CharSet#include_byte?
|
24
26
|
#
|
25
27
|
def octal?
|
26
28
|
Chars::OCTAL.include_byte?(self)
|
@@ -34,7 +36,8 @@ class Integer
|
|
34
36
|
# Specifies whether the byte belongs to the upper-case hexadecimal
|
35
37
|
# character set.
|
36
38
|
#
|
37
|
-
# @see Chars
|
39
|
+
# @see Chars::UPPERCASE_HEXADECIMAL
|
40
|
+
# @see Chars::CharSet#include_byte?
|
38
41
|
#
|
39
42
|
def uppercase_hex?
|
40
43
|
Chars::UPPERCASE_HEXADECIMAL.include_byte?(self)
|
@@ -48,7 +51,8 @@ class Integer
|
|
48
51
|
# Specifies whether the byte belongs to the lower-case hexadecimal
|
49
52
|
# character set.
|
50
53
|
#
|
51
|
-
# @see Chars
|
54
|
+
# @see Chars::LOWERCASE_HEXADECIMAL
|
55
|
+
# @see Chars::CharSet#include_byte?
|
52
56
|
#
|
53
57
|
def lowercase_hex?
|
54
58
|
Chars::LOWERCASE_HEXADECIMAL.include_byte?(self)
|
@@ -60,7 +64,8 @@ class Integer
|
|
60
64
|
# @return [Boolean]
|
61
65
|
# Specifies whether the byte belongs to the hexadecimal character set.
|
62
66
|
#
|
63
|
-
# @see Chars
|
67
|
+
# @see Chars::HEXADECIMAL
|
68
|
+
# @see Chars::CharSet#include_byte?
|
64
69
|
#
|
65
70
|
def hex?
|
66
71
|
Chars::HEXADECIMAL.include_byte?(self)
|
@@ -74,7 +79,8 @@ class Integer
|
|
74
79
|
# Specifies whether the byte belongs to the upper-case alphabetic
|
75
80
|
# character set.
|
76
81
|
#
|
77
|
-
# @see Chars
|
82
|
+
# @see Chars::UPPERCASE_ALPHA
|
83
|
+
# @see Chars::CharSet#include_byte?
|
78
84
|
#
|
79
85
|
def uppercase_alpha?
|
80
86
|
Chars::UPPERCASE_ALPHA.include_byte?(self)
|
@@ -88,7 +94,8 @@ class Integer
|
|
88
94
|
# Specifies whether the byte belongs to the lower-case alphabetic
|
89
95
|
# character set.
|
90
96
|
#
|
91
|
-
# @see Chars
|
97
|
+
# @see Chars::LOWERCASE_ALPHA
|
98
|
+
# @see Chars::CharSet#include_byte?
|
92
99
|
#
|
93
100
|
def lowercase_alpha?
|
94
101
|
Chars::LOWERCASE_ALPHA.include_byte?(self)
|
@@ -100,7 +107,8 @@ class Integer
|
|
100
107
|
# @return [Boolean]
|
101
108
|
# Specifies whether the byte belongs to the alphabetic character set.
|
102
109
|
#
|
103
|
-
# @see Chars
|
110
|
+
# @see Chars::ALPHA
|
111
|
+
# @see Chars::CharSet#include_byte?
|
104
112
|
#
|
105
113
|
def alpha?
|
106
114
|
Chars::ALPHA.include_byte?(self)
|
@@ -112,7 +120,8 @@ class Integer
|
|
112
120
|
# @return [Boolean]
|
113
121
|
# Specifies whether the byte belongs to the alpha-numeric character set.
|
114
122
|
#
|
115
|
-
# @see Chars
|
123
|
+
# @see Chars::ALPHA_NUMERIC
|
124
|
+
# @see Chars::CharSet#include_byte?
|
116
125
|
#
|
117
126
|
def alpha_numeric?
|
118
127
|
Chars::ALPHA_NUMERIC.include_byte?(self)
|
@@ -124,7 +133,8 @@ class Integer
|
|
124
133
|
# @return [Boolean]
|
125
134
|
# Specifies whether the byte belongs to the punctuation character set.
|
126
135
|
#
|
127
|
-
# @see Chars
|
136
|
+
# @see Chars::PUNCTUATION
|
137
|
+
# @see Chars::CharSet#include_byte?
|
128
138
|
#
|
129
139
|
def punctuation?
|
130
140
|
Chars::PUNCTUATION.include_byte?(self)
|
@@ -136,7 +146,8 @@ class Integer
|
|
136
146
|
# @return [Boolean]
|
137
147
|
# Specifies whether the byte belongs to the symbolic character set.
|
138
148
|
#
|
139
|
-
# @see Chars
|
149
|
+
# @see Chars::SYMBOLS
|
150
|
+
# @see Chars::CharSet#include_byte?
|
140
151
|
#
|
141
152
|
def symbolic?
|
142
153
|
Chars::SYMBOLS.include_byte?(self)
|
@@ -148,7 +159,8 @@ class Integer
|
|
148
159
|
# @return [Boolean]
|
149
160
|
# Specifies whether the byte belongs to the white-space character set.
|
150
161
|
#
|
151
|
-
# @see Chars
|
162
|
+
# @see Chars::SPACE
|
163
|
+
# @see Chars::CharSet#include_byte?
|
152
164
|
#
|
153
165
|
def space?
|
154
166
|
Chars::SPACE.include_byte?(self)
|
@@ -160,7 +172,8 @@ class Integer
|
|
160
172
|
# @return [Boolean]
|
161
173
|
# Specifies whether the byte belongs to the visible character set.
|
162
174
|
#
|
163
|
-
# @see Chars
|
175
|
+
# @see Chars::VISIBLE
|
176
|
+
# @see Chars::CharSet#include_byte?
|
164
177
|
#
|
165
178
|
def visible?
|
166
179
|
Chars::VISIBLE.include_byte?(self)
|
@@ -172,7 +185,8 @@ class Integer
|
|
172
185
|
# @return [Boolean]
|
173
186
|
# Specifies whether the byte belongs to the printable character set.
|
174
187
|
#
|
175
|
-
# @see Chars
|
188
|
+
# @see Chars::PRINTABLE
|
189
|
+
# @see Chars::CharSet#include_byte?
|
176
190
|
#
|
177
191
|
def printable?
|
178
192
|
Chars::PRINTABLE.include_byte?(self)
|
@@ -185,7 +199,8 @@ class Integer
|
|
185
199
|
# Specifies whether the byte belongs to the control-character character
|
186
200
|
# set.
|
187
201
|
#
|
188
|
-
# @see Chars
|
202
|
+
# @see Chars::CONTROL
|
203
|
+
# @see Chars::CharSet#include_byte?
|
189
204
|
#
|
190
205
|
def control?
|
191
206
|
Chars::CONTROL.include_byte?(self)
|
@@ -197,7 +212,8 @@ class Integer
|
|
197
212
|
# @return [Boolean]
|
198
213
|
# Specifies whether the byte belongs to the signed-ASCII character set.
|
199
214
|
#
|
200
|
-
# @see Chars
|
215
|
+
# @see Chars::SIGNED_ASCII
|
216
|
+
# @see Chars::CharSet#include_byte?
|
201
217
|
#
|
202
218
|
def signed_ascii?
|
203
219
|
Chars::SIGNED_ASCII.include_byte?(self)
|
@@ -209,7 +225,8 @@ class Integer
|
|
209
225
|
# @return [Boolean]
|
210
226
|
# Specifies whether the byte belongs to the ASCII character set.
|
211
227
|
#
|
212
|
-
# @see Chars
|
228
|
+
# @see Chars::ASCII
|
229
|
+
# @see Chars::CharSet#include_byte?
|
213
230
|
#
|
214
231
|
def ascii?
|
215
232
|
Chars::ASCII.include_byte?(self)
|
@@ -9,7 +9,8 @@ class String
|
|
9
9
|
# Specifies whether the String belongs to the decimal-digit character
|
10
10
|
# set.
|
11
11
|
#
|
12
|
-
# @see Chars
|
12
|
+
# @see Chars::NUMERIC
|
13
|
+
# @see Chars::CharSet#===
|
13
14
|
#
|
14
15
|
def numeric?
|
15
16
|
Chars::NUMERIC === self
|
@@ -22,7 +23,8 @@ class String
|
|
22
23
|
# Specifies whether the String belongs to the octal-digit character
|
23
24
|
# set.
|
24
25
|
#
|
25
|
-
# @see Chars
|
26
|
+
# @see Chars::OCTAL
|
27
|
+
# @see Chars::CharSet#===
|
26
28
|
#
|
27
29
|
def octal?
|
28
30
|
Chars::OCTAL === self
|
@@ -36,7 +38,8 @@ class String
|
|
36
38
|
# Specifies whether the String belongs to the upper-case hexadecimal
|
37
39
|
# character set.
|
38
40
|
#
|
39
|
-
# @see Chars
|
41
|
+
# @see Chars::UPPERCASE_HEXADECIMAL
|
42
|
+
# @see Chars::CharSet#===
|
40
43
|
#
|
41
44
|
def uppercase_hex?
|
42
45
|
Chars::UPPERCASE_HEXADECIMAL === self
|
@@ -50,7 +53,8 @@ class String
|
|
50
53
|
# Specifies whether the String belongs to the lower-case hexadecimal
|
51
54
|
# character set.
|
52
55
|
#
|
53
|
-
# @see Chars
|
56
|
+
# @see Chars::LOWERCASE_HEXADECIMAL
|
57
|
+
# @see Chars::CharSet#===
|
54
58
|
#
|
55
59
|
def lowercase_hex?
|
56
60
|
Chars::LOWERCASE_HEXADECIMAL === self
|
@@ -62,7 +66,8 @@ class String
|
|
62
66
|
# @return [Boolean]
|
63
67
|
# Specifies whether the String belongs to the hexadecimal character set.
|
64
68
|
#
|
65
|
-
# @see Chars
|
69
|
+
# @see Chars::HEXADECIMAL
|
70
|
+
# @see Chars::CharSet#===
|
66
71
|
#
|
67
72
|
def hex?
|
68
73
|
Chars::HEXADECIMAL === self
|
@@ -76,7 +81,8 @@ class String
|
|
76
81
|
# Specifies whether the String belongs to the upper-case alphabetic
|
77
82
|
# character set.
|
78
83
|
#
|
79
|
-
# @see Chars
|
84
|
+
# @see Chars::UPPERCASE_ALPHA
|
85
|
+
# @see Chars::CharSet#===
|
80
86
|
#
|
81
87
|
def uppercase_alpha?
|
82
88
|
Chars::UPPERCASE_ALPHA === self
|
@@ -90,7 +96,8 @@ class String
|
|
90
96
|
# Specifies whether the String belongs to the lower-case alphabetic
|
91
97
|
# character set.
|
92
98
|
#
|
93
|
-
# @see Chars
|
99
|
+
# @see Chars::LOWERCASE_ALPHA
|
100
|
+
# @see Chars::CharSet#===
|
94
101
|
#
|
95
102
|
def lowercase_alpha?
|
96
103
|
Chars::LOWERCASE_ALPHA === self
|
@@ -102,7 +109,8 @@ class String
|
|
102
109
|
# @return [Boolean]
|
103
110
|
# Specifies whether the String belongs to the alphabetic character set.
|
104
111
|
#
|
105
|
-
# @see Chars
|
112
|
+
# @see Chars::ALPHA
|
113
|
+
# @see Chars::CharSet#===
|
106
114
|
#
|
107
115
|
def alpha?
|
108
116
|
Chars::ALPHA === self
|
@@ -116,7 +124,8 @@ class String
|
|
116
124
|
# Specifies whether the String belongs to the alpha-numeric character
|
117
125
|
# set.
|
118
126
|
#
|
119
|
-
# @see Chars
|
127
|
+
# @see Chars::ALPHA_NUMERIC
|
128
|
+
# @see Chars::CharSet#===
|
120
129
|
#
|
121
130
|
def alpha_numeric?
|
122
131
|
Chars::ALPHA_NUMERIC === self
|
@@ -128,7 +137,8 @@ class String
|
|
128
137
|
# @return [Boolean]
|
129
138
|
# Specifies whether the String belongs to the punctuation character set.
|
130
139
|
#
|
131
|
-
# @see Chars
|
140
|
+
# @see Chars::PUNCTUATION
|
141
|
+
# @see Chars::CharSet#===
|
132
142
|
#
|
133
143
|
def punctuation?
|
134
144
|
Chars::PUNCTUATION === self
|
@@ -140,7 +150,8 @@ class String
|
|
140
150
|
# @return [Boolean]
|
141
151
|
# Specifies whether the String belongs to the symbolic character set.
|
142
152
|
#
|
143
|
-
# @see Chars
|
153
|
+
# @see Chars::SYMBOLS
|
154
|
+
# @see Chars::CharSet#===
|
144
155
|
#
|
145
156
|
def symbolic?
|
146
157
|
Chars::SYMBOLS === self
|
@@ -152,7 +163,8 @@ class String
|
|
152
163
|
# @return [Boolean]
|
153
164
|
# Specifies whether the String belongs to the white-space character set.
|
154
165
|
#
|
155
|
-
# @see Chars
|
166
|
+
# @see Chars::SPACE
|
167
|
+
# @see Chars::CharSet#===
|
156
168
|
#
|
157
169
|
def space?
|
158
170
|
Chars::SPACE === self
|
@@ -164,7 +176,8 @@ class String
|
|
164
176
|
# @return [Boolean]
|
165
177
|
# Specifies whether the String belongs to the visible character set.
|
166
178
|
#
|
167
|
-
# @see Chars
|
179
|
+
# @see Chars::VISIBLE
|
180
|
+
# @see Chars::CharSet#===
|
168
181
|
#
|
169
182
|
def visible?
|
170
183
|
Chars::VISIBLE === self
|
@@ -176,7 +189,8 @@ class String
|
|
176
189
|
# @return [Boolean]
|
177
190
|
# Specifies whether the String belongs to the printable character set.
|
178
191
|
#
|
179
|
-
# @see Chars
|
192
|
+
# @see Chars::PRINTABLE
|
193
|
+
# @see Chars::CharSet#===
|
180
194
|
#
|
181
195
|
def printable?
|
182
196
|
Chars::PRINTABLE === self
|
@@ -190,7 +204,8 @@ class String
|
|
190
204
|
# Specifies whether the String belongs to the control-character
|
191
205
|
# character set.
|
192
206
|
#
|
193
|
-
# @see Chars
|
207
|
+
# @see Chars::CONTROL
|
208
|
+
# @see Chars::CharSet#===
|
194
209
|
#
|
195
210
|
def control?
|
196
211
|
Chars::CONTROL === self
|
@@ -203,7 +218,8 @@ class String
|
|
203
218
|
# Specifies whether the String belongs to the signed-ASCII character
|
204
219
|
# set.
|
205
220
|
#
|
206
|
-
# @see Chars
|
221
|
+
# @see Chars::SIGNED_ASCII
|
222
|
+
# @see Chars::CharSet#===
|
207
223
|
#
|
208
224
|
def signed_ascii?
|
209
225
|
Chars::SIGNED_ASCII === self
|
@@ -215,7 +231,8 @@ class String
|
|
215
231
|
# @return [Boolean]
|
216
232
|
# Specifies whether the String belongs to the ASCII character set.
|
217
233
|
#
|
218
|
-
# @see Chars
|
234
|
+
# @see Chars::ASCII
|
235
|
+
# @see Chars::CharSet#===
|
219
236
|
#
|
220
237
|
def ascii?
|
221
238
|
Chars::ASCII === self
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Chars
|
2
|
+
#
|
3
|
+
# Enumerates through every possible string belonging to a character set and
|
4
|
+
# of a given length.
|
5
|
+
#
|
6
|
+
# @api private
|
7
|
+
#
|
8
|
+
# @since 0.3.0
|
9
|
+
#
|
10
|
+
class StringEnumerator
|
11
|
+
|
12
|
+
include Enumerable
|
13
|
+
|
14
|
+
# The character set to generate the strings from.
|
15
|
+
#
|
16
|
+
# @return [CharSet]
|
17
|
+
attr_reader :char_set
|
18
|
+
|
19
|
+
# The desired length of each string.
|
20
|
+
#
|
21
|
+
# @return [Integer]
|
22
|
+
attr_reader :length
|
23
|
+
|
24
|
+
#
|
25
|
+
# Initializes the string enumerator.
|
26
|
+
#
|
27
|
+
# @param [Chars::CharSet] char_set
|
28
|
+
# The character set to generate the strings from.
|
29
|
+
#
|
30
|
+
# @param [Integer] length
|
31
|
+
# The desired length of each string.
|
32
|
+
#
|
33
|
+
def initialize(char_set,length)
|
34
|
+
@char_set = char_set
|
35
|
+
@length = length
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# Enumerates through every possible string belonging to {#char_set} and
|
40
|
+
# {#length} long.
|
41
|
+
#
|
42
|
+
# @yield [string]
|
43
|
+
# The given block will be passed each sequential string.
|
44
|
+
#
|
45
|
+
# @yieldparam [String] string
|
46
|
+
# A string belonging to {#char_set} and {#length} long.
|
47
|
+
#
|
48
|
+
# @return [Enumerator]
|
49
|
+
# If no block is given, an Enumerator will be returned.
|
50
|
+
#
|
51
|
+
def each
|
52
|
+
return enum_for(__method__) unless block_given?
|
53
|
+
|
54
|
+
if @char_set.empty?
|
55
|
+
return
|
56
|
+
elsif @length == 0
|
57
|
+
yield ""
|
58
|
+
return
|
59
|
+
end
|
60
|
+
|
61
|
+
chars = char_set.chars
|
62
|
+
first_char = chars.first
|
63
|
+
last_char = chars.last
|
64
|
+
|
65
|
+
next_char = {}
|
66
|
+
|
67
|
+
chars.each_cons(2) do |c1,c2|
|
68
|
+
next_char[c1] = c2
|
69
|
+
end
|
70
|
+
|
71
|
+
string = String.new(first_char * @length)
|
72
|
+
|
73
|
+
last_index = @length - 1
|
74
|
+
|
75
|
+
loop do
|
76
|
+
chars.each do |c|
|
77
|
+
string[last_index] = c
|
78
|
+
|
79
|
+
yield string.dup
|
80
|
+
end
|
81
|
+
|
82
|
+
last_index.downto(0) do |i|
|
83
|
+
if string[i] == last_char
|
84
|
+
string[i] = first_char
|
85
|
+
|
86
|
+
if i == 0
|
87
|
+
return
|
88
|
+
end
|
89
|
+
else
|
90
|
+
string[i] = next_char[string[i]]
|
91
|
+
break
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
data/lib/chars/version.rb
CHANGED