/*******************************************************************************
 * Copyright (c) 2009, 2010, 2011 Nokia and others.
 * 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:
 * Nokia - Initial API and implementation
 * Broadcom - Refactored ForwardTypeReference to separate top-level class
 *******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;

import java.util.Collections;
import java.util.Map;

import org.eclipse.cdt.debug.edc.internal.symbols.IForwardTypeReference;
import org.eclipse.cdt.debug.edc.symbols.IScope;
import org.eclipse.cdt.debug.edc.symbols.IType;

/**
 * This represents a forward type reference, which is a type
 * that resolves itself when referenced.
 */
public class ForwardTypeReference implements IType, IForwardTypeReference {

	static public final IType NULL_TYPE_ENTRY = new IType() {

		public int getByteSize() {
			return 0;
		}

		public String getName() {
			return DwarfMessages.DwarfDebugInfoProvider_UnhandledType;
		}

		public Map<Object, Object> getProperties() {
			return Collections.emptyMap();
		}

		public IScope getScope() {
			return null;
		}

		public IType getType() {
			return null;
		}

		public void setType(IType type) {
			throw new IllegalStateException();
		}

		public void dispose() {
		}
	};

	private DwarfDebugInfoProvider provider;
	private IType type = null;

	protected final long offset;

	public ForwardTypeReference(DwarfDebugInfoProvider provider, long offset) {
		this.provider = provider;
		this.offset = offset;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.dwarf.IForwardTypeReference#getReferencedType()
	 */
	public IType getReferencedType() {
		if (type == null) {
			synchronized (this){// Instances are globally visible and so can be accessed from multiple threads
				if (type == null) {
					// to prevent recursion
					IType newType = NULL_TYPE_ENTRY;
					newType = provider.resolveTypeReference(this);
					if (newType == null) {
						// FIXME
						newType = NULL_TYPE_ENTRY;
					}
					type = newType;
				}
			}
		}
		return type;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getByteSize()
	 */
	public int getByteSize() {
		return getReferencedType().getByteSize();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getName()
	 */
	public String getName() {
		return getReferencedType().getName();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getProperties()
	 */
	public Map<Object, Object> getProperties() {
		return getReferencedType().getProperties();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getScope()
	 */
	public IScope getScope() {
		return getReferencedType().getScope();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getType()
	 */
	public IType getType() {
		return getReferencedType().getType();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#setType(org.eclipse.cdt.debug.edc.internal.symbols.IType)
	 */
	public void setType(IType type_) {
		getReferencedType().setType(type_);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#dispose()
	 */
	public void dispose() {
		type = null;
		provider = null;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (int) (offset ^ (offset >>> 32));
		result = prime * result + ((provider == null) ? 0 : provider.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ForwardTypeReference other = (ForwardTypeReference) obj;
		if (offset != other.offset)
			return false;
		if (provider == null) {
			if (other.provider != null)
				return false;
		} else if (!provider.equals(other.provider))
			return false;
		return true;
	}
}
