/*******************************************************************************
 * Copyright (c) 2006, 2008 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.cpp;

import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;

import static org.eclipse.cdt.core.parser.IToken.*;
import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.*;

/**
 * Maps tokens types returned by CPreprocessor to token types
 * expected by the C++ parser.
 * 
 * TODO: Make token maps composable.
 * 
 * The idea would be to combine a DOM->C99 map with a C99->UPC map 
 * to get a DOM->UPC map.
 * 
 * @author Mike Kucera
 *
 */
public class DOMToISOCPPTokenMap implements ITokenMap {

	
	public static final DOMToISOCPPTokenMap DEFAULT_MAP = new DOMToISOCPPTokenMap();
	
	private DOMToISOCPPTokenMap() {	
		// just a private constructor
	}
	
	public int mapKind(int kind) {
		
		switch(kind) {
			case tIDENTIFIER   : return TK_identifier;
			case tINTEGER      : return TK_integer;
			case tCOLONCOLON   : return TK_ColonColon;
			case tCOLON        : return TK_Colon;
			case tSEMI         : return TK_SemiColon;
			case tCOMMA        : return TK_Comma;
			case tQUESTION     : return TK_Question;
			case tLPAREN       : return TK_LeftParen;
			case tRPAREN       : return TK_RightParen;
			case tLBRACKET     : return TK_LeftBracket;
			case tRBRACKET     : return TK_RightBracket;
			case tLBRACE       : return TK_LeftBrace;
			case tRBRACE       : return TK_RightBrace;
			case tPLUSASSIGN   : return TK_PlusAssign;
			case tINCR         : return TK_PlusPlus;
			case tPLUS         : return TK_Plus;
			case tMINUSASSIGN  : return TK_MinusAssign;
			case tDECR         : return TK_MinusMinus;
			case tARROWSTAR    : return TK_ArrowStar;
			case tARROW        : return TK_Arrow;
			case tMINUS        : return TK_Minus;
			case tSTARASSIGN   : return TK_StarAssign;
			case tSTAR         : return TK_Star;
			case tMODASSIGN    : return TK_PercentAssign;
			case tMOD          : return TK_Percent;
			case tXORASSIGN    : return TK_CaretAssign;
			case tXOR          : return TK_Caret;
			case tAMPERASSIGN  : return TK_AndAssign;
			case tAND          : return TK_AndAnd;
			case tAMPER        : return TK_And;
			case tBITORASSIGN  : return TK_OrAssign;
			case tOR           : return TK_OrOr;
			case tBITOR        : return TK_Or;
			case tBITCOMPLEMENT: return TK_Tilde;
			case tNOTEQUAL     : return TK_NE;
			case tNOT          : return TK_Bang;
			case tEQUAL        : return TK_EQ;
			case tASSIGN       : return TK_Assign;
			case tUNKNOWN_CHAR : return TK_Invalid;
			case tSHIFTL       : return TK_LeftShift;
			case tLTEQUAL      : return TK_LE;
			case tLT           : return TK_LT;
			case tSHIFTRASSIGN : return TK_RightShiftAssign;
			case tSHIFTR       : return TK_RightShift;
			case tGTEQUAL      : return TK_GE;
			case tGT           : return TK_GT;
			case tSHIFTLASSIGN : return TK_LeftShiftAssign;
			case tELLIPSIS     : return TK_DotDotDot;
			case tDOTSTAR      : return TK_DotStar;
			case tDOT          : return TK_Dot;
			case tDIVASSIGN    : return TK_SlashAssign;
			case tDIV          : return TK_Slash;
			
			case t_asm         : return TK_asm;
			case t_auto        : return TK_auto;
			case t_bool        : return TK_bool;
			case t_break       : return TK_break;
			case t_case        : return TK_case;
			case t_catch       : return TK_catch;
			case t_char        : return TK_char; 
			case t_class       : return TK_class;
			case t_const       : return TK_const;
			case t_const_cast  : return TK_const_cast;
			case t_continue    : return TK_continue;
			case t_default     : return TK_default;
			case t_delete      : return TK_delete;
			case t_do          : return TK_do;
			case t_double      : return TK_double;
			case t_dynamic_cast: return TK_dynamic_cast;
			case t_else        : return TK_else;
			case t_enum        : return TK_enum;
			case t_explicit    : return TK_explicit;
			case t_export      : return TK_export;
			case t_extern      : return TK_extern;
			case t_false       : return TK_false;
			case t_float       : return TK_float;
			case t_for         : return TK_for;
			case t_friend      : return TK_friend;
			case t_goto        : return TK_goto;
			case t_if          : return TK_if;
			case t_inline      : return TK_inline;
			case t_int         : return TK_int;
			case t_long        : return TK_long;
			case t_mutable     : return TK_mutable;
			case t_namespace   : return TK_namespace;
			case t_new         : return TK_new;
			case t_operator    : return TK_operator;
			case t_private     : return TK_private;
			case t_protected   : return TK_protected;
			case t_public      : return TK_public;
			case t_register    : return TK_register;
			case t_return      : return TK_return;
			case t_short       : return TK_short;
			case t_sizeof      : return TK_sizeof;
			case t_static      : return TK_static;
			case t_static_cast : return TK_static_cast;
			case t_signed      : return TK_signed;
			case t_struct      : return TK_struct;
			case t_switch      : return TK_switch;
			case t_template    : return TK_template;
			case t_this        : return TK_this;
			case t_throw       : return TK_throw;
			case t_true        : return TK_true;
			case t_try         : return TK_try;
			case t_typedef     : return TK_typedef;
			case t_typeid      : return TK_typeid;
			case t_typename    : return TK_typename;
			case t_union       : return TK_union;
			case t_unsigned    : return TK_unsigned;
			case t_using       : return TK_using;
			case t_virtual     : return TK_virtual;
			case t_void        : return TK_void;
			case t_volatile    : return TK_volatile;
			case t_wchar_t     : return TK_wchar_t;
			case t_while       : return TK_while;
			
			case tFLOATINGPT   : return TK_floating;
			case tSTRING       : return TK_stringlit;
			case tLSTRING      : return TK_stringlit;
			case tCHAR         : return TK_charconst;
			case tLCHAR        : return TK_charconst;
			case tCOMPLETION   : return TK_Completion;
			case tEOC          : return TK_EndOfCompletion;
			case tEND_OF_INPUT : return TK_EOF_TOKEN;

			default:
				assert false : "token not recognized by the ISO CPP parser: " + kind; //$NON-NLS-1$
				return TK_Invalid;
		}
	}

}
