2 *******************************************************************************
3 * Copyright (C) 2002-2012, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
7 package com.ibm.icu.dev.util;
9 import java.util.Collection;
10 import java.util.Iterator;
13 import com.ibm.icu.text.UnicodeSet;
14 import com.ibm.icu.text.UnicodeSetIterator;
16 public abstract class Visitor {
18 public void doAt(Object item) {
19 if (item instanceof Collection) {
20 doAt((Collection) item);
21 } else if (item instanceof Map) {
23 } else if (item instanceof Object[]) {
24 doAt((Object[]) item);
25 } else if (item instanceof UnicodeSet) {
26 doAt((UnicodeSet) item);
32 public int count(Object item) {
33 if (item instanceof Collection) {
34 return ((Collection) item).size();
35 } else if (item instanceof Map) {
36 return ((Map) item).size();
37 } else if (item instanceof Object[]) {
38 return ((Object[]) item).length;
39 } else if (item instanceof UnicodeSet) {
40 return ((UnicodeSet) item).size();
46 // the default implementation boxing
48 public void doAt(int o) {
49 doSimpleAt(new Integer(o));
51 public void doAt(double o) {
52 doSimpleAt(new Double(o));
54 public void doAt(char o) {
55 doSimpleAt(new Character(o));
60 protected void doAt (Collection c) {
61 if (c.size() == 0) doBefore(c, null);
62 Iterator it = c.iterator();
65 while (it.hasNext()) {
66 Object item = it.next();
71 doBetween(c, last, item);
78 protected void doAt (Map c) {
82 protected void doAt (UnicodeSet c) {
83 if (c.size() == 0) doBefore(c, null);
84 UnicodeSetIterator it = new UnicodeSetIterator(c);
88 CodePointRange cpr0 = new CodePointRange();
89 CodePointRange cpr1 = new CodePointRange();
92 while(it.nextRange()) {
93 if (it.codepoint == UnicodeSetIterator.IS_STRING) {
96 cpr = last == cpr0 ? cpr1 : cpr0; // make sure we don't override last
97 cpr.codepoint = it.codepoint;
98 cpr.codepointEnd = it.codepointEnd;
105 doBetween(c, last, item);
112 protected void doAt (Object[] c) {
113 doBefore(c, c.length == 0 ? null : c[0]);
115 for (int i = 0; i < c.length; ++i) {
116 if (i != 0) doBetween(c, last, c[i]);
122 public static class CodePointRange{
123 public int codepoint, codepointEnd;
126 // ===== MUST BE OVERRIDEN =====
128 abstract protected void doBefore(Object container, Object item);
129 abstract protected void doBetween(Object container, Object lastItem, Object nextItem);
130 abstract protected void doAfter(Object container, Object item);
131 abstract protected void doSimpleAt(Object o);