/*
 * Copyright (c) 2013 QNX Software Systems 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
 */
package org.eclipse.cdt.qt.core.index;

import java.util.Collection;

/**
 * Represents expansions of the Q_ENUMS macro within a class declaration.
 * <pre>
 * class B : public QObject
 * {
 * Q_OBJECT
 * enum E { enumerator };
 * Q_ENUMS( E )
 * };
 *
 * class Q : public QObject
 * {
 * Q_OBJECT
 * Q_ENUMS( B::E E0 )
 * Q_ENUMS( E1 )
 * enum E0 { e0a, e0b = 2 };
 * enum E1 { e1 };
 * }
 * </pre>
 * NOTE: http://qt-project.org/doc/qt-4.8/qobject.html#Q_ENUMS
 * <blockquote>
 * If you want to register an enum that is declared in another class, the enum must be fully qualified
 * with the name of the class defining it. In addition, the class defining the enum has to inherit
 * QObject as well as declare the enum using Q_ENUMS().
 * </blockquote>
 * So, the lookup for the C++ enum only needs to look in the same class spec when the name is not
 * qualified.  When it is qualified, then it needs to find the QObject and then look at its Q_ENUMS.
 */
public interface IQEnum {
	/**
	 * Returns the name of the enumerator as referenced in parameter in the Q_ENUMS
	 * macro expansion.  In the sample code in the class declaration, this would return
	 * "B::E", "E0", or "E1".
	 */
	public String getName();

	/**
	 * Returns true if this enumeration was introduced to the Qt meta-object system with
	 * a Q_FLAGS expansion and false if it was introduced with Q_ENUMS.
	 */
	public boolean isFlag();

	/**
	 * Returns an unsorted collection of the enumerators contained in the enum references
	 * in the Q_ENUMS macro expansion.
	 * <p>
	 * NOTE: It would be nice if the textual order of the enumerators was preserved by the
	 * underlying CDT index, but it is not.  The {@link Enumerator#getOrdinal()} method can
	 * be used to recover some ordering information.
	 */
	public Collection<Enumerator> getEnumerators();

	/**
	 * A small wrapper class for the enumerators that are declared within the enum that is
	 * referenced by the parameter of the Q_ENUMS macro expansion.
	 */
	public interface Enumerator {
		/**
		 * Returns the name of the enumerator.
		 */
		public String getName();

		/**
		 * Returns the ordinal (either explicitly or implicitly) assigned to the enumerator.
		 */
		public Long getOrdinal();
	}
}
