2 *******************************************************************************
\r
3 * Copyright (C) 2002-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.util;
\r
9 import java.util.Collection;
\r
10 import java.util.Iterator;
\r
11 import java.util.Map;
\r
13 import com.ibm.icu.text.UnicodeSet;
\r
14 import com.ibm.icu.text.UnicodeSetIterator;
\r
16 public abstract class Visitor {
\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
23 } else if (item instanceof Object[]) {
\r
24 doAt((Object[]) item);
\r
25 } else if (item instanceof UnicodeSet) {
\r
26 doAt((UnicodeSet) item);
\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
46 // the default implementation boxing
\r
48 public void doAt(int o) {
\r
49 doSimpleAt(new Integer(o));
\r
51 public void doAt(double o) {
\r
52 doSimpleAt(new Double(o));
\r
54 public void doAt(char o) {
\r
55 doSimpleAt(new Character(o));
\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
65 while (it.hasNext()) {
\r
66 Object item = it.next();
\r
71 doBetween(c, last, item);
\r
78 protected void doAt (Map c) {
\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
88 CodePointRange cpr0 = new CodePointRange();
\r
89 CodePointRange cpr1 = new CodePointRange();
\r
92 while(it.nextRange()) {
\r
93 if (it.codepoint == UnicodeSetIterator.IS_STRING) {
\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
105 doBetween(c, last, item);
\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
122 public static class CodePointRange{
\r
123 public int codepoint, codepointEnd;
\r
126 // ===== MUST BE OVERRIDEN =====
\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