Javolution 6.0.0 java
CharSet.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.text;
10 
12 import javolution.lang.MathLib;
13 
35 public final class CharSet implements Immutable<CharSet> {
36 
40  public static final CharSet EMPTY = new CharSet(new long[0]);
41 
46  public static final CharSet WHITESPACES = CharSet.valueOf(new char[] { 0x9,
47  0xA, 0xB, 0xC, 0xD, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x1680, 0x180E,
48  0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2008,
49  0x2009, 0x200A, 0x200B, 0x2028, 0x2029, 0x205F, 0x3000 });
50 
55  public static final CharSet SPACES = CharSet.valueOf(new char[] { 0x20,
56  0xA0, 0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004,
57  0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x2028,
58  0x2029, 0x202F, 0x205F, 0x3000 });
59 
64  public static final CharSet ISO_CONTROLS = CharSet.valueOf(new char[] {
65  0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC,
66  0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
67  0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x7F, 0x80, 0x81,
68  0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C,
69  0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
70  0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F });
71 
75  private final long[] _mapping;
76 
82  private CharSet(long[] mapping) {
83  _mapping = mapping;
84  }
85 
92  public static CharSet valueOf(char... chars) {
93  int maxChar = 0;
94  for (int i = chars.length; --i >= 0;) {
95  if (chars[i] > maxChar) {
96  maxChar = chars[i];
97  }
98  }
99  CharSet charSet = new CharSet(new long[(maxChar >> 6) + 1]);
100  for (int i = chars.length; --i >= 0;) {
101  char c = chars[i];
102  charSet._mapping[c >> 6] |= 1L << (c & 63);
103  }
104  return charSet;
105  }
106 
116  public static CharSet rangeOf(char first, char last) {
117  if (first > last)
118  throw new IllegalArgumentException(
119  "first should be less or equal to last");
120  CharSet charSet = new CharSet(new long[(last >> 6) + 1]);
121  for (char c = first; c <= last; c++) {
122  charSet._mapping[c >> 6] |= 1L << (c & 63);
123  }
124  return charSet;
125 
126  }
127 
135  public boolean contains(char c) {
136  final int i = c >> 6;
137  return i < _mapping.length ? (_mapping[i] & (1L << (c & 63))) != 0
138  : false;
139  }
140 
149  public int indexIn(CharSequence csq) {
150  return indexIn(csq, 0);
151  }
152 
162  public int indexIn(CharSequence csq, int fromIndex) {
163  for (int i = fromIndex, n = csq.length(); i < n; i++) {
164  if (contains(csq.charAt(i)))
165  return i;
166  }
167  return -1;
168  }
169 
176  public int indexIn(char[] chars) {
177  return indexIn(chars, 0);
178  }
179 
189  public int indexIn(char[] chars, int fromIndex) {
190  for (int i = fromIndex, n = chars.length; i < n; i++) {
191  if (contains(chars[i]))
192  return i;
193  }
194  return -1;
195  }
196 
206  public int lastIndexIn(CharSequence csq) {
207  return lastIndexIn(csq, csq.length() - 1);
208  }
209 
219  public int lastIndexIn(CharSequence csq, int fromIndex) {
220  for (int i = fromIndex; i >= 0; --i) {
221  if (contains(csq.charAt(i)))
222  return i;
223  }
224  return -1;
225  }
226 
234  public int lastIndexIn(char[] chars) {
235  return lastIndexIn(chars, chars.length - 1);
236  }
237 
247  public int lastIndexIn(char[] chars, int fromIndex) {
248  for (int i = fromIndex; i >= 0; i--) {
249  if (contains(chars[i]))
250  return i;
251  }
252  return -1;
253  }
254 
262  public CharSet plus(CharSet that) {
263  if (that._mapping.length > this._mapping.length)
264  return that.plus(this);
265  CharSet result = this.copy();
266  for (int i = that._mapping.length; --i >= 0;) {
267  result._mapping[i] |= that._mapping[i];
268  }
269  return result;
270  }
271 
279  public CharSet minus(CharSet that) {
280  CharSet result = this.copy();
281  for (int i = MathLib.min(this._mapping.length, that._mapping.length); --i >= 0;) {
282  result._mapping[i] &= ~that._mapping[i];
283  }
284  return result;
285  }
286 
292  @Override
293  public String toString() {
294  TextBuilder tb = new TextBuilder();
295  tb.append('{');
296  int length = _mapping.length << 6;
297  for (int i = 0; i < length; i++) {
298  if (this.contains((char) i)) {
299  if (tb.length() > 1) {
300  tb.append(',');
301  tb.append(' ');
302  }
303  tb.append('\'');
304  tb.append((char) i);
305  tb.append('\'');
306  }
307  }
308  tb.append('}');
309  return tb.toString();
310  }
311 
315  private CharSet copy() {
316  CharSet charSet = new CharSet(new long[this._mapping.length]);
317  for (int i = _mapping.length; --i >= 0;) {
318  charSet._mapping[i] = _mapping[i];
319  }
320  return charSet;
321  }
322 
323  @Override
324  public CharSet value() {
325  return this;
326  }
327 }
javolution.text.CharSet.lastIndexIn
int lastIndexIn(CharSequence csq, int fromIndex)
Definition: CharSet.java:219
javolution
javolution.text.TextBuilder.append
final TextBuilder append(char c)
Definition: TextBuilder.java:202
javolution.text.CharSet.indexIn
int indexIn(char[] chars)
Definition: CharSet.java:176
javolution.lang.MathLib
Definition: MathLib.java:20
javolution.text.CharSet.value
CharSet value()
Definition: CharSet.java:324
javolution.text.CharSet.copy
CharSet copy()
Definition: CharSet.java:315
javolution.text.CharSet.indexIn
int indexIn(CharSequence csq, int fromIndex)
Definition: CharSet.java:162
javolution.text.TextBuilder
Definition: TextBuilder.java:29
javolution.text.TextBuilder.toString
final String toString()
Definition: TextBuilder.java:780
javolution.text.CharSet.rangeOf
static CharSet rangeOf(char first, char last)
Definition: CharSet.java:116
javolution.text.CharSet.lastIndexIn
int lastIndexIn(CharSequence csq)
Definition: CharSet.java:206
javolution.text.CharSet.toString
String toString()
Definition: CharSet.java:293
javolution.text.CharSet.CharSet
CharSet(long[] mapping)
Definition: CharSet.java:82
javolution.text.CharSet.WHITESPACES
static final CharSet WHITESPACES
Definition: CharSet.java:46
javolution.text.CharSet.EMPTY
static final CharSet EMPTY
Definition: CharSet.java:40
javolution.text.CharSet.contains
boolean contains(char c)
Definition: CharSet.java:135
javolution.text.CharSet.minus
CharSet minus(CharSet that)
Definition: CharSet.java:279
javolution.lang
Definition: Configurable.java:9
javolution.text.CharSet._mapping
final long[] _mapping
Definition: CharSet.java:75
javolution.text.TextBuilder.length
final int length()
Definition: TextBuilder.java:91
javolution.text.CharSet.valueOf
static CharSet valueOf(char... chars)
Definition: CharSet.java:92
javolution.text.CharSet.SPACES
static final CharSet SPACES
Definition: CharSet.java:55
javolution.text.CharSet
Definition: CharSet.java:35
javolution.text.CharSet.lastIndexIn
int lastIndexIn(char[] chars)
Definition: CharSet.java:234
javolution.text.CharSet.indexIn
int indexIn(CharSequence csq)
Definition: CharSet.java:149
javolution.text.CharSet.plus
CharSet plus(CharSet that)
Definition: CharSet.java:262
javolution.text.CharSet.lastIndexIn
int lastIndexIn(char[] chars, int fromIndex)
Definition: CharSet.java:247
javolution.text.CharSet.ISO_CONTROLS
static final CharSet ISO_CONTROLS
Definition: CharSet.java:64
javolution.lang.Immutable
Definition: Immutable.java:38
javolution.text.CharSet.indexIn
int indexIn(char[] chars, int fromIndex)
Definition: CharSet.java:189
javolution.lang.MathLib.min
static int min(int x, int y)
Definition: MathLib.java:1010