﻿/* 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 "BufferedTokenStream.h"

namespace antlr4 {

  /**
   * This class extends {@link BufferedTokenStream} with functionality to filter
   * token streams to tokens on a particular channel (tokens where
   * {@link Token#getChannel} returns a particular value).
   *
   * <p>
   * This token stream provides access to all tokens by index or when calling
   * methods like {@link #getText}. The channel filtering is only used for code
   * accessing tokens via the lookahead methods {@link #LA}, {@link #LT}, and
   * {@link #LB}.</p>
   *
   * <p>
   * By default, tokens are placed on the default channel
   * ({@link Token#DEFAULT_CHANNEL}), but may be reassigned by using the
   * {@code ->channel(HIDDEN)} lexer command, or by using an embedded action to
   * call {@link Lexer#setChannel}.
   * </p>
   *
   * <p>
   * Note: lexer rules which use the {@code ->skip} lexer command or call
   * {@link Lexer#skip} do not produce tokens at all, so input text matched by
   * such a rule will not be available as part of the token stream, regardless of
   * channel.</p>
   */
  class ANTLR4CPP_PUBLIC CommonTokenStream : public BufferedTokenStream {
  public:
    /**
     * Constructs a new {@link CommonTokenStream} using the specified token
     * source and the default token channel ({@link Token#DEFAULT_CHANNEL}).
     *
     * @param tokenSource The token source.
     */
    CommonTokenStream(TokenSource *tokenSource);

    /**
     * Constructs a new {@link CommonTokenStream} using the specified token
     * source and filtering tokens to the specified channel. Only tokens whose
     * {@link Token#getChannel} matches {@code channel} or have the
     * {@link Token#getType} equal to {@link Token#EOF} will be returned by the
     * token stream lookahead methods.
     *
     * @param tokenSource The token source.
     * @param channel The channel to use for filtering tokens.
     */
    CommonTokenStream(TokenSource *tokenSource, size_t channel);

    virtual Token* LT(ssize_t k) override;

    /// Count EOF just once.
    virtual int getNumberOfOnChannelTokens();
    
  protected:
    /**
     * Specifies the channel to use for filtering tokens.
     *
     * <p>
     * The default value is {@link Token#DEFAULT_CHANNEL}, which matches the
     * default channel assigned to tokens created by the lexer.</p>
     */
    size_t channel;

    virtual ssize_t adjustSeekIndex(size_t i) override;

    virtual Token* LB(size_t k) override;

  };

} // namespace antlr4
