package com.revolsys.collection.range; /** * * Ranges are immutable */ public class CharRange extends AbstractRange<Character> { public static boolean isLower(final char character) { return character >= 'a' && character <= 'z'; } public static boolean isLowerOrUpper(final char character) { return isLower(character) || isUpper(character); } public static boolean isUpper(final char character) { return character >= 'A' && character <= 'Z'; } private char from; private char to; protected CharRange(final char value) { this(value, value); } protected CharRange(final char from, final char to) { if (isLower(from)) { if (isLower(to)) { } else if (isUpper(to)) { throw new RangeInvalidException("Cannot mix lower and upper case " + from + "~" + to + " must both between either a~z or A~Z"); } else { throw new RangeInvalidException(from + "~" + to + " are not both between a~z or A~Z"); } } else if (isUpper(from)) { if (isUpper(to)) { } else if (isLower(to)) { throw new RangeInvalidException("Cannot mix lower and upper case " + from + "~" + to + " must both between either a~z or A~Z"); } else { throw new IllegalArgumentException(from + "~" + to + " are not both between a~z or A~Z"); } } else { throw new RangeInvalidException(from + "~" + to + " are not both between a~z or A~Z"); } if (from < to) { this.from = from; this.to = to; } else { this.from = to; this.to = from; } } @Override public AbstractRange<?> expand(final Object value) { if (value instanceof Character) { final Character character = (Character)value; return expand(character); } else if (value instanceof String) { final String string = (String)value; if (string.length() == 1) { final char character = string.charAt(0); return super.expand(character); } } return null; } @Override public Character getFrom() { return this.from; } @Override public Character getTo() { return this.to; } @Override protected AbstractRange<?> newRange(final Object from, final Object to) { return Ranges.newRange(((Character)from).charValue(), ((Character)to).charValue()); } @Override public Character next(final Object value) { if (value == null) { return null; } else if (value instanceof Character) { final char character = (Character)value; if ('Z' == character || 'z' == character || !isLowerOrUpper(character)) { return null; } else { return (char)(character + 1); } } else { return null; } } @Override public Character previous(final Object value) { if (value == null) { return null; } else if (value instanceof Character) { final char character = (Character)value; if ('A' == character || 'a' == character || !isLowerOrUpper(character)) { return null; } else { return (char)(character - 1); } } else { return null; } } @Override public long size() { return this.to - this.from + 1; } }