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>&lt;</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>&lt;</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>&gt;</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