/** \file
 * \brief Defines the interface for a common token.
 *
 * All token streams should provide their tokens using an instance
 * of this common token. A custom pointer is provided, wher you may attach
 * a further structure to enhance the common token if you feel the need
 * to do so. The C runtime will assume that a token provides implementations
 * of the interface functions, but all of them may be rplaced by your own
 * implementation if you require it.
 */
#ifndef	_ANTLR3_COMMON_TOKEN_HPP
#define	_ANTLR3_COMMON_TOKEN_HPP

// [The "BSD licence"]
// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB

//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. The name of the author may not be used to endorse or promote products
//    derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include    <stdlib.h>

#include    "antlr3defs.hpp"

ANTLR_BEGIN_NAMESPACE()

/** The definition of an ANTLR3 common token structure, which all implementations
 * of a token stream should provide, installing any further structures in the
 * custom pointer element of this structure.
 *
 * \remark
 * Token streams are in essence provided by lexers or other programs that serve
 * as lexers.
 */

template<class ImplTraits>
class CommonToken : public ImplTraits::AllocPolicyType
{
public:
	/* Base token types, which all lexer/parser tokens come after in sequence.
	*/
	enum TOKEN_TYPE
	{
		/** Indicator of an invalid token
		 */
		TOKEN_INVALID =	0
		, EOR_TOKEN_TYPE	
		/** Imaginary token type to cause a traversal of child nodes in a tree parser
		 */
		, TOKEN_DOWN		
		/** Imaginary token type to signal the end of a stream of child nodes.
		 */
		, TOKEN_UP	
		/** First token that can be used by users/generated code
		 */
		, MIN_TOKEN_TYPE =	TOKEN_UP + 1

		/** End of file token
		 */
		, TOKEN_EOF =	(ANTLR_CHARSTREAM_EOF & 0xFFFFFFFF)
	};

	typedef typename ImplTraits::TokenIntStreamType TokenIntStreamType;
	typedef typename ImplTraits::StringType StringType;
	typedef typename ImplTraits::InputStreamType InputStreamType;
	typedef typename ImplTraits::StreamDataType StreamDataType;

private:
    /** The actual type of this token
     */
    ANTLR_UINT32   m_type;

	/** The virtual channel that this token exists in.
     */
    ANTLR_UINT32	m_channel;
	
	mutable StringType		m_tokText;

    /** The offset into the input stream that the line in which this
     *  token resides starts.
     */
	const StreamDataType*	m_lineStart;

	/** The line number in the input stream where this token was derived from
     */
    ANTLR_UINT32	m_line;

    /** The character position in the line that this token was derived from
     */
    ANTLR_INT32		m_charPositionInLine;

    /** Pointer to the input stream that this token originated in.
     */
    InputStreamType*    m_input;

    /** What the index of this token is, 0, 1, .., n-2, n-1 tokens
     */
    ANTLR_MARKER		m_index;

    /** The character offset in the input stream where the text for this token
     *  starts.
     */
    ANTLR_MARKER		m_startIndex;

    /** The character offset in the input stream where the text for this token
     *  stops.
     */
    ANTLR_MARKER		m_stopIndex;

public:
	CommonToken();
	CommonToken(ANTLR_UINT32 type);
	CommonToken(TOKEN_TYPE type);
	CommonToken( const CommonToken& ctoken );

	CommonToken& operator=( const CommonToken& ctoken );
	bool operator==( const CommonToken& ctoken ) const;
	bool operator<( const CommonToken& ctoken ) const;

	InputStreamType* get_input() const;
	ANTLR_MARKER get_index() const;
	void set_index( ANTLR_MARKER index );
	void set_input( InputStreamType* input );

    /* ==============================
     * API 
     */

    /** Function that returns the text pointer of a token, use
     *  toString() if you want a pANTLR3_STRING version of the token.
     */
    StringType  getText() const;
	
    /** Pointer to a function that 'might' be able to set the text associated
     *  with a token. Imaginary tokens such as an ANTLR3_CLASSIC_TOKEN may actually
     *  do this, however many tokens such as ANTLR3_COMMON_TOKEN do not actaully have
     *  strings associated with them but just point into the current input stream. These
     *  tokens will implement this function with a function that errors out (probably
     *  drastically.
     */
    void set_tokText( const StringType& text );

    /** Pointer to a function that 'might' be able to set the text associated
     *  with a token. Imaginary tokens such as an ANTLR3_CLASSIC_TOKEN may actually
     *  do this, however many tokens such as ANTLR3_COMMON_TOKEN do not actully have
     *  strings associated with them but just point into the current input stream. These
     *  tokens will implement this function with a function that errors out (probably
     *  drastically.
     */
    void	setText(ANTLR_UINT8* text);
	void	setText(const char* text);

    /** Pointer to a function that returns the token type of this token
     */
    ANTLR_UINT32  get_type() const;
	ANTLR_UINT32  getType() const;

    /** Pointer to a function that sets the type of this token
     */
    void	set_type(ANTLR_UINT32 ttype);

    /** Pointer to a function that gets the 'line' number where this token resides
     */
    ANTLR_UINT32   get_line() const;

    /** Pointer to a function that sets the 'line' number where this token reside
     */
    void set_line(ANTLR_UINT32 line);

    /** Pointer to a function that gets the offset in the line where this token exists
     */ 
    ANTLR_INT32  get_charPositionInLine() const;
	ANTLR_INT32  getCharPositionInLine() const;

    /** Pointer to a function that sets the offset in the line where this token exists
     */
    void	set_charPositionInLine(ANTLR_INT32 pos);

    /** Pointer to a function that gets the channel that this token was placed in (parsers
     *  can 'tune' to these channels.
     */
    ANTLR_UINT32   get_channel() const;

    /** Pointer to a function that sets the channel that this token should belong to
     */
    void set_channel(ANTLR_UINT32 channel);

    /** Pointer to a function that returns an index 0...n-1 of the token in the token
     *  input stream.
     */
    ANTLR_MARKER  get_tokenIndex() const;

    /** Pointer to a function that can set the token index of this token in the token
     *  input stream.
     */
    void	set_tokenIndex(ANTLR_MARKER tokenIndex);

    /** Pointer to a function that gets the start index in the input stream for this token.
     */
    ANTLR_MARKER   get_startIndex() const;

    /** Pointer to a function that sets the start index in the input stream for this token.
     */
    void	set_startIndex(ANTLR_MARKER index);
    
    /** Pointer to a function that gets the stop index in the input stream for this token.
     */
    ANTLR_MARKER  get_stopIndex() const;

    /** Pointer to a function that sets the stop index in the input stream for this token.
     */
    void	set_stopIndex(ANTLR_MARKER index);
	const StreamDataType* get_lineStart() const;
	void	set_lineStart( const StreamDataType* lineStart );

    /** Pointer to a function that returns this token as a text representation that can be 
     *  printed with embedded control codes such as \n replaced with the printable sequence "\\n"
     *  This also yields a string structure that can be used more easily than the pointer to 
     *  the input stream in certain situations.
     */
    StringType  toString() const;

};

ANTLR_END_NAMESPACE()

#include "antlr3commontoken.inl"

#endif
