/* * Copyright (c) 2011-2013 The original author or authors * ------------------------------------------------------ * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.test.fakecluster; import io.vertx.core.impl.ConcurrentHashSet; import io.vertx.core.spi.cluster.ChoosableIterable; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Set; /** * * @author <a href="http://tfox.org">Tim Fox</a> */ class ChoosableSet<T> implements ChoosableIterable<T> { private final Set<T> ids; private volatile Iterator<T> iter; public ChoosableSet(int initialSize) { ids = new ConcurrentHashSet<>(initialSize); } public int size() { return ids.size(); } public void add(T elem) { ids.add(elem); } public boolean remove(T elem) { return ids.remove(elem); } public void merge(ChoosableSet<T> toMerge) { ids.addAll(toMerge.ids); } public boolean isEmpty() { return ids.isEmpty(); } @Override public Iterator<T> iterator() { return ids.iterator(); } public synchronized T choose() { if (!ids.isEmpty()) { if (iter == null || !iter.hasNext()) { iter = ids.iterator(); } try { return iter.next(); } catch (NoSuchElementException e) { return null; } } else { return null; } } }