/*******************************************************************************
 * Copyright (c) 2013, 2015 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.common.utility.internal.reference;

import org.eclipse.jpt.common.utility.internal.ObjectTools;
import org.eclipse.jpt.common.utility.reference.ModifiableObjectReference;

/**
 * Implement some of the methods in {@link ModifiableObjectReference} that can
 * be defined in terms of the other methods.
 * Subclasses need only implement<ul>
 * <li>{@link #getValue()}
 * <li>{@link #setValue(Object)}
 * </ul>
 * 
 * @param <V> the type of the reference's value
 */
public abstract class AbstractModifiableObjectReference<V>
	extends AbstractObjectReference<V>
	implements ModifiableObjectReference<V>
{
	protected AbstractModifiableObjectReference() {
		super();
	}

	public V setNull() {
		return this.setValue(null);
	}

	public boolean commit(V newValue, V expectedValue) {
		if (ObjectTools.equals(this.getValue(), expectedValue)) {
			this.setValue(newValue);
			return true;
		}
		return false;
	}

	public V swap(ModifiableObjectReference<V> other) {
		if (other == this) {
			return this.getValue();
		}
		V otherValue = other.getValue();
		if (ObjectTools.equals(this.getValue(), otherValue)) {
			return this.getValue();
		}
		other.setValue(this.getValue());
		this.setValue(otherValue);
		return otherValue;
	}
}
