]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/util/Visitor.java
icu4jsrc
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / util / Visitor.java
1 \r
2 /*\r
3  *******************************************************************************\r
4  * Copyright (C) 2002-2004, International Business Machines Corporation and    *\r
5  * others. All Rights Reserved.                                                *\r
6  *******************************************************************************\r
7  */\r
8 package com.ibm.icu.dev.test.util;\r
9 \r
10 import java.util.*;\r
11 import com.ibm.icu.text.UnicodeSet;\r
12 import com.ibm.icu.text.UnicodeSetIterator;\r
13 \r
14 public abstract class Visitor {\r
15     \r
16     public void doAt(Object item) {\r
17         if (item instanceof Collection) {\r
18             doAt((Collection) item);\r
19         } else if (item instanceof Map) {\r
20             doAt((Map) item);\r
21         } else if (item instanceof Object[]) {\r
22             doAt((Object[]) item);\r
23         } else if (item instanceof UnicodeSet) {\r
24             doAt((UnicodeSet) item);\r
25         } else {\r
26             doSimpleAt(item);\r
27         }\r
28     }\r
29 \r
30     public int count(Object item) {\r
31         if (item instanceof Collection) {\r
32             return ((Collection) item).size();\r
33         } else if (item instanceof Map) {\r
34             return ((Map) item).size();\r
35         } else if (item instanceof Object[]) {\r
36             return ((Object[]) item).length;\r
37         } else if (item instanceof UnicodeSet) {\r
38             return ((UnicodeSet) item).size();\r
39         } else {\r
40             return 1;\r
41         }\r
42     }\r
43 \r
44     // the default implementation boxing\r
45     \r
46     public void doAt(int o) {\r
47         doSimpleAt(new Integer(o));\r
48     }\r
49     public void doAt(double o) {\r
50         doSimpleAt(new Double(o));\r
51     }\r
52     public void doAt(char o) {\r
53         doSimpleAt(new Character(o));\r
54     }\r
55     \r
56     // for subclassing\r
57     \r
58     protected void doAt (Collection c) {\r
59         if (c.size() == 0) doBefore(c, null);\r
60         Iterator it = c.iterator();\r
61         boolean first = true;\r
62         Object last = null;\r
63         while (it.hasNext()) {\r
64             Object item = it.next();\r
65             if (first) {\r
66                 doBefore(c, item);\r
67                 first = false;\r
68             } else {\r
69                 doBetween(c, last, item);\r
70             }    \r
71             doAt(last=item);\r
72         }\r
73         doAfter(c, last);\r
74     }\r
75 \r
76     protected void doAt (Map c) {\r
77         doAt(c.entrySet());\r
78     }\r
79 \r
80     protected void doAt (UnicodeSet c) {\r
81         if (c.size() == 0) doBefore(c, null);\r
82         UnicodeSetIterator it = new UnicodeSetIterator(c);\r
83         boolean first = true;\r
84         Object last = null;\r
85         Object item;\r
86         CodePointRange cpr0 = new CodePointRange();\r
87         CodePointRange cpr1 = new CodePointRange();\r
88         CodePointRange cpr;\r
89         \r
90         while(it.nextRange()) {\r
91             if (it.codepoint == UnicodeSetIterator.IS_STRING) {\r
92                 item = it.string;\r
93             } else {\r
94                 cpr = last == cpr0 ? cpr1 : cpr0;   // make sure we don't override last\r
95                 cpr.codepoint = it.codepoint;\r
96                 cpr.codepointEnd = it.codepointEnd;\r
97                 item = cpr;\r
98             }           \r
99             if (!first) {\r
100                 doBefore(c, item);\r
101                 first = true;\r
102             } else {\r
103                 doBetween(c, last, item);\r
104             }\r
105             doAt(last = item);\r
106         }\r
107         doAfter(c, last);\r
108     }\r
109     \r
110     protected void doAt (Object[] c) {\r
111         doBefore(c, c.length == 0 ? null : c[0]);\r
112         Object last = null;\r
113         for (int i = 0; i < c.length; ++i) {\r
114             if (i != 0) doBetween(c, last, c[i]);\r
115             doAt(last = c[i]);\r
116         }\r
117         doAfter(c, last);\r
118     }\r
119     \r
120     public static class CodePointRange{\r
121         public int codepoint, codepointEnd;\r
122     }\r
123     \r
124     // ===== MUST BE OVERRIDEN =====\r
125     \r
126     abstract protected void doBefore(Object container, Object item);\r
127     abstract protected void doBetween(Object container, Object lastItem, Object nextItem);\r
128     abstract protected void doAfter(Object container, Object item);   \r
129     abstract protected void doSimpleAt(Object o);\r
130     \r
131 }