/*******************************************************************************
 * Copyright (c) 2015, 2016 Google, Inc and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   Stefan Xenos (Google) - Initial implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.core.nd;

/**
 * This mix-in interface is implemented by database objects that require a custom
 * destruction step.
 */
public interface IDestructable {
	/**
	 * Intended to be implemented by objects which require a custom destruction step.
	 * This should normally not be invoked by clients, since custom destruction is just
	 * one step in tearing down an object. The normal way to tear down an object is
	 * {@link NdNode#delete}
	 * <p>
	 * If you are writing code that must run as part of delete (or are implementing part
	 * of the destruct method on a custom ITypeFactory)the correct steps to destructing
	 * an object are:
	 * <ul>
	 * <li>Invoke this destruct method (which serves the same purpose as the user-implemented
	 *     portion of a C++ destructor)</li>
	 * <li>Invoke ITypeFactory.destructFields to destruct its fields (which serves the same
	 *     purpose as the compiler-implemented portion of a C++ destructor)</li>
	 * <li>Invoke Database.free on its address to free up memory allocated for the object
	 *     itself. (Which serves the same purpose as the memory deallocation step in
	 *     the C++ delete operator)</li>
	 * </ul>
	 * <p>
	 * Normally, first two steps are performed together as part of ITypeFactory.destruct
	 */
	void destruct();
}
