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