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