﻿/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
 * Use of this file is governed by the BSD 3-clause license that
 * can be found in the LICENSE.txt file in the project root.
 */

#pragma once

#include "WritableToken.h"

namespace antlr4 {

  class ANTLR4CPP_PUBLIC CommonToken : public WritableToken {
  protected:
    /**
     * An empty {@link Pair} which is used as the default value of
     * {@link #source} for tokens that do not have a source.
     */
    static const std::pair<TokenSource *, CharStream *> EMPTY_SOURCE;

    /**
     * This is the backing field for {@link #getType} and {@link #setType}.
     */
    size_t _type;

    /**
     * This is the backing field for {@link #getLine} and {@link #setLine}.
     */
    size_t _line;

    /**
     * This is the backing field for {@link #getCharPositionInLine} and
     * {@link #setCharPositionInLine}.
     */
    size_t _charPositionInLine; // set to invalid position

    /**
     * This is the backing field for {@link #getChannel} and
     * {@link #setChannel}.
     */
    size_t _channel;

    /**
     * This is the backing field for {@link #getTokenSource} and
     * {@link #getInputStream}.
     *
     * <p>
     * These properties share a field to reduce the memory footprint of
     * {@link CommonToken}. Tokens created by a {@link CommonTokenFactory} from
     * the same source and input stream share a reference to the same
     * {@link Pair} containing these values.</p>
     */

    std::pair<TokenSource *, CharStream *> _source; // ml: pure references, usually from statically allocated classes.

    /**
     * This is the backing field for {@link #getText} when the token text is
     * explicitly set in the constructor or via {@link #setText}.
     *
     * @see #getText()
     */
    std::string _text;

    /**
     * This is the backing field for {@link #getTokenIndex} and
     * {@link #setTokenIndex}.
     */
    size_t _index;

    /**
     * This is the backing field for {@link #getStartIndex} and
     * {@link #setStartIndex}.
     */
    size_t _start;

    /**
     * This is the backing field for {@link #getStopIndex} and
     * {@link #setStopIndex}.
     */
    size_t _stop;

  public:
    /**
     * Constructs a new {@link CommonToken} with the specified token type.
     *
     * @param type The token type.
     */
    CommonToken(size_t type);
    CommonToken(std::pair<TokenSource*, CharStream*> source, size_t type, size_t channel, size_t start, size_t stop);

    /**
     * Constructs a new {@link CommonToken} with the specified token type and
     * text.
     *
     * @param type The token type.
     * @param text The text of the token.
     */
    CommonToken(size_t type, const std::string &text);

    /**
     * Constructs a new {@link CommonToken} as a copy of another {@link Token}.
     *
     * <p>
     * If {@code oldToken} is also a {@link CommonToken} instance, the newly
     * constructed token will share a reference to the {@link #text} field and
     * the {@link Pair} stored in {@link #source}. Otherwise, {@link #text} will
     * be assigned the result of calling {@link #getText}, and {@link #source}
     * will be constructed from the result of {@link Token#getTokenSource} and
     * {@link Token#getInputStream}.</p>
     *
     * @param oldToken The token to copy.
     */
    CommonToken(Token *oldToken);

    virtual size_t getType() const override;

    /**
     * Explicitly set the text for this token. If {code text} is not
     * {@code null}, then {@link #getText} will return this value rather than
     * extracting the text from the input.
     *
     * @param text The explicit text of the token, or {@code null} if the text
     * should be obtained from the input along with the start and stop indexes
     * of the token.
     */
    virtual void setText(const std::string &text) override;
    virtual std::string getText() const override;

    virtual void setLine(size_t line) override;
    virtual size_t getLine() const override;

    virtual size_t getCharPositionInLine() const override;
    virtual void setCharPositionInLine(size_t charPositionInLine) override;

    virtual size_t getChannel() const override;
    virtual void setChannel(size_t channel) override;

    virtual void setType(size_t type) override;

    virtual size_t getStartIndex() const override;
    virtual void setStartIndex(size_t start);

    virtual size_t getStopIndex() const override;
    virtual void setStopIndex(size_t stop);

    virtual size_t getTokenIndex() const override;
    virtual void setTokenIndex(size_t index) override;

    virtual TokenSource *getTokenSource() const override;
    virtual CharStream *getInputStream() const override;

    virtual std::string toString() const override;

    virtual std::string toString(Recognizer *r) const;
  private:
    void InitializeInstanceFields();
  };

} // namespace antlr4
