/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.common.util;

import java.util.Iterator;

/**
 * イテレータを扱うユーティリティ
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class IteratorUtils {
	/**
	 * コンストラクタ
	 */
	private IteratorUtils() {
	}
	/**
	 * 要素の取得が同期化されたイテレータを返す
	 * @param i 元になるイテレータ
	 * @return 同期化されたイテレータ
	 */
	public static final Iterator synchronizedIterator(Iterator i) {
		return new IteratorUtils().new SynchronizedIteratorWrapper(i);
	}

	private class SynchronizedIteratorWrapper implements Iterator {
		/** 元のイテレータ */
		private Iterator org;

		/**
		 * コンストラクタ
		 * @param src 元のイテレータ
		 */
		private SynchronizedIteratorWrapper(Iterator src) {
			org = src;
		}
		/**
		 * 要素を削除する
		 */
		public void remove() {
			synchronized(org) {
				org.remove();
			}
		}
		/**
		 * 次の要素があるかどうかを検査する
		 * @return true:ある / false:ない
		 */
		public boolean hasNext() {
			synchronized(org) {
				return org.hasNext();
			}
		}
		/**
		 * 次の要素を返す
		 * @return 次の要素
		 */
		public Object next() {
			synchronized(org) {
				return org.next();
			}
		}
	}
}
