001 // Copyright (c) 2001 Hursh Jain (http://www.mollypages.org)
002 // The Molly framework is freely distributable under the terms of an
003 // MIT-style license. For details, see the molly pages web site at:
004 // http://www.mollypages.org/. Use, modify, have fun !
005
006 package fc.util;
007
008 import java.util.*;
009
010 /**
011 A range of characters.
012 <p>
013 Note, many methods in this particular class have the same
014 signatures as in the apache <tt>commons.lang</tt> package but the
015 <tt>implementation</tt> was strictly clean-room.
016 <p>
017 Thread Safety: This class is not thread safe in the face of any
018 concurrent modification (via changing the start/end chars or
019 union/intersection operations).
020
021 @author hursh jain
022 **/
023 public class CharRange extends Range
024 {
025 char startChar;
026 char endChar;
027
028 /**
029 Constructs a character range between the specified
030 start and end chars (both inclusive).
031
032 @throws IllegalArgumentException
033 if the end char is lesser (via a <tt><</tt> comparison)
034 than the start char (equal to the start char is ok)
035 **/
036 public CharRange(char start, char end)
037 {
038 Argcheck.istrue(start <= end, "end char lesser than start char in the specified range, start=["+start+"], end=["+end+"]");
039 startChar = start;
040 endChar = end;
041 }
042
043 /** Get the start character for this character range **/
044 public char getStart()
045 {
046 return startChar;
047 }
048
049 /**
050 Get the end character for this character range.
051 **/
052 public char getEnd()
053 {
054 return endChar;
055 }
056
057 /** Is the passed in character inside this range **/
058 public boolean inRange(char c)
059 {
060 boolean result = (c >= startChar) && (c <= endChar);
061
062 if (negated)
063 return !result;
064 else
065 return result;
066 }
067
068 /**
069 Sets the end character for this character range
070
071 @param c the end char
072 @throws IllegalArgumentException
073 if the end char is lesser (via a <tt><</tt> comparison)
074 than the current start char (equal to the start char is
075 ok)
076 **/
077 public void setEnd(char c)
078 {
079 Argcheck.istrue(startChar <= c, "end char lesser than start char in the specified range, start=["+startChar+"], specified end=["+c+"]");
080 endChar = c;
081 }
082
083 /** Set the start character for this character range
084
085 @throws IllegalArgumentException
086 if the start char is greater (via a <tt>></tt> comparison)
087 than the current end char (equal to the end char is
088 ok)
089 **/
090 public void setStart(char c)
091 {
092 Argcheck.istrue(c <= endChar, "start char greater than end char in the specified range, end=["+endChar+"], specified start=["+c+"]");
093 startChar = c;
094 }
095
096 /** Output a string representation of the character range **/
097 public java.lang.String toString()
098 {
099 String str = "CharRange:[";
100 if (isNegated())
101 str += "^";
102 str += "'" + startChar + "'-'" + endChar + "']";
103 return str;
104 }
105
106 public static void main(String[] args)
107 {
108 CharRange r = new CharRange('b', 'z');
109 System.out.println("constructed range:" + r);
110 //normal
111 test(r);
112
113 //negate
114 r.setNegated(true);
115 System.out.println("setting the range to be negated:" + r);
116 test(r);
117
118 System.out.println("the following should throw an exception");
119 r = new CharRange('b', 'a');
120 }
121
122 private static void test(CharRange r)
123 {
124 System.out.println("'b' in range:" + r.inRange('b'));
125 System.out.println("'z' in range:" + r.inRange('z'));
126 System.out.println("'d' in range:" + r.inRange('d'));
127 System.out.println("'a' in range:" + r.inRange('a'));
128 System.out.println("'A' in range:" + r.inRange('A'));
129 }
130
131 } //~class CharRange