3 *******************************************************************************
\r
4 * Copyright (C) 2002-2004, International Business Machines Corporation and *
\r
5 * others. All Rights Reserved. *
\r
6 *******************************************************************************
\r
8 package com.ibm.icu.dev.test.util;
\r
11 import com.ibm.icu.text.UnicodeSet;
\r
12 import com.ibm.icu.text.UnicodeSetIterator;
\r
14 public abstract class Visitor {
\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
21 } else if (item instanceof Object[]) {
\r
22 doAt((Object[]) item);
\r
23 } else if (item instanceof UnicodeSet) {
\r
24 doAt((UnicodeSet) item);
\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
44 // the default implementation boxing
\r
46 public void doAt(int o) {
\r
47 doSimpleAt(new Integer(o));
\r
49 public void doAt(double o) {
\r
50 doSimpleAt(new Double(o));
\r
52 public void doAt(char o) {
\r
53 doSimpleAt(new Character(o));
\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
63 while (it.hasNext()) {
\r
64 Object item = it.next();
\r
69 doBetween(c, last, item);
\r
76 protected void doAt (Map c) {
\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
86 CodePointRange cpr0 = new CodePointRange();
\r
87 CodePointRange cpr1 = new CodePointRange();
\r
90 while(it.nextRange()) {
\r
91 if (it.codepoint == UnicodeSetIterator.IS_STRING) {
\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
103 doBetween(c, last, item);
\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
120 public static class CodePointRange{
\r
121 public int codepoint, codepointEnd;
\r
124 // ===== MUST BE OVERRIDEN =====
\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