1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Copyright (c) 2010 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  All rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Redistribution and use in source and binary forms, with or without
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  modification, are permitted provided that the following conditions
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  are met:
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  1. Redistributions of source code must retain the above copyright
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      notice, this list of conditions and the following disclaimer.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  2. Redistributions in binary form must reproduce the above copyright
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      notice, this list of conditions and the following disclaimer in the
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      documentation and/or other materials provided with the distribution.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  3. The name of the author may not be used to endorse or promote products
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      derived from this software without specific prior written permission.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.misc;
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.HashMap;
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.Map;
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class Utils {
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public static final int INTEGER_POOL_MAX_VALUE = 1000;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	static Integer[] ints = new Integer[INTEGER_POOL_MAX_VALUE+1];
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Integer objects are immutable so share all Integers with the
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  same value up to some max size.  Use an array as a perfect hash.
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  Return shared object for 0..INTEGER_POOL_MAX_VALUE or a new
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 *  Integer object with x in it.
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public static Integer integer(int x) {
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( x<0 || x>INTEGER_POOL_MAX_VALUE ) {
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return new Integer(x);
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( ints[x]==null ) {
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ints[x] = new Integer(x);
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return ints[x];
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Given a source string, src,
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		a string to replace, replacee,
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		and a string to replace with, replacer,
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return a new string w/ the replacing done.
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		You can use replacer==null to remove replacee from the string.
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		This should be faster than Java's String.replaceAll as that one
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		uses regex (I only want to play with strings anyway).
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public static String replace(String src, String replacee, String replacer) {
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		StringBuffer result = new StringBuffer(src.length() + 50);
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int startIndex = 0;
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int endIndex = src.indexOf(replacee);
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		while(endIndex != -1) {
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			result.append(src.substring(startIndex,endIndex));
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( replacer!=null ) {
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				result.append(replacer);
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			startIndex = endIndex + replacee.length();
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			endIndex = src.indexOf(replacee,startIndex);
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		result.append(src.substring(startIndex,src.length()));
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return result.toString();
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//	/** mimic struct; like a non-iterable map. */
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//	public static class Struct {
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//		public Map<String,Object> fields = new HashMap<String,Object>();
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//		@Override
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//		public String toString() { return fields.toString(); }
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//	}
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//	public static Struct struct(String propNames, Object... values) {
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//		String[] props = propNames.split(",");
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//		int i=0;
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//		Struct s = new Struct();
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//		for (String p : props) s.fields.put(p, values[i++]);
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//		return s;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//	}
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
93