/* * @(#)CircularIdentityList.java 1.5 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.sun.java.swing.plaf.gtk; import java.util.*; /** * An circular linked list like data structure that uses identity for equality * testing. * * @version 1.5, 12/19/03 * @author Scott Violet */ class CircularIdentityList implements Cloneable { private Property property; /** * Sets a particular value. */ public synchronized void set(Object key, Object value) { if (property == null) { property = new Property(key, value, null); } else { Property p = property; Property last = p; do { if (p.key == key) { p.value = value; property = p; return; } last = p; p = p.next; } while (p != property && p != null); // not defined if (value != null) { if (p == null) { // Only one element p = property; } property = new Property(key, value, p); last.next = property; } } } /** * Returns the value currently being referenced. */ public synchronized Object get() { if (property == null) { return null; } return property.value; } /** * Returns the value for a specific key. */ public synchronized Object get(Object key) { if (property == null) { return null; } Property p = property; do { if (p.key == key) { return p.value; } p = p.next; } while (p != property && p != null); return null; } /** * Advanced the list returning the next key. This will only return * null if the list is empty. */ public synchronized Object next() { if (property == null) { return null; } if (property.next == null) { return property.key; } property = property.next; return property.key; } public synchronized Object clone() { try { CircularIdentityList list = (CircularIdentityList)super.clone(); if (property != null) { list.property = (Property)property.clone(); Property last = list.property; while (last.next != null && last.next != property) { last.next = (Property)last.next.clone(); last = last.next; } last.next = list.property; } return list; } catch (CloneNotSupportedException cnse) { } return null; } static class Property implements Cloneable { Object key; Object value; Property next; Property(Object key, Object value, Property next) { this.key = key; this.value = value; this.next = next; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException cnse) { } return null; } } }