/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.lucene.queryparser.charstream;

/**
 * This interface describes a character stream that maintains line and column number positions of
 * the characters. It also has the capability to backup the stream to some extent. An implementation
 * of this interface is used in the TokenManager implementation generated by JavaCCParser.
 *
 * <p>All the methods except backup can be implemented in any fashion. backup needs to be
 * implemented correctly for the correct operation of the lexer. Rest of the methods are all used to
 * get information like line number, column number and the String that constitutes a token and are
 * not used by the lexer. Hence their implementation won't affect the generated lexer's operation.
 */
public interface CharStream {

  /**
   * Returns the next character from the selected input. The method of selecting the input is the
   * responsibility of the class implementing this interface. Can throw any java.io.IOException.
   */
  char readChar() throws java.io.IOException;

  /**
   * Returns the column number of the last character for current token (being matched after the last
   * call to BeginTOken).
   */
  int getEndColumn();

  /**
   * Returns the line number of the last character for current token (being matched after the last
   * call to BeginTOken).
   */
  int getEndLine();

  /**
   * Returns the column number of the first character for current token (being matched after the
   * last call to BeginTOken).
   */
  int getBeginColumn();

  /**
   * Returns the line number of the first character for current token (being matched after the last
   * call to BeginTOken).
   */
  int getBeginLine();

  /**
   * Backs up the input stream by amount steps. Lexer calls this method if it had already read some
   * characters, but could not use them to match a (longer) token. So, they will be used again as
   * the prefix of the next token and it is the implementation's responsibility to do this right.
   */
  void backup(int amount);

  /**
   * Returns the next character that marks the beginning of the next token. All characters must
   * remain in the buffer between two successive calls to this method to implement backup correctly.
   */
  char BeginToken() throws java.io.IOException;

  /**
   * Returns a string made up of characters from the marked token beginning to the current buffer
   * position. Implementations have the choice of returning anything that they want to. For example,
   * for efficiency, one might decide to just return null, which is a valid implementation.
   */
  String GetImage();

  /**
   * Returns an array of characters that make up the suffix of length 'len' for the currently
   * matched token. This is used to build up the matched string for use in actions in the case of
   * MORE. A simple and inefficient implementation of this is as follows :
   *
   * <p>{ String t = GetImage(); return t.substring(t.length() - len, t.length()).toCharArray(); }
   */
  char[] GetSuffix(int len);

  /**
   * The lexer calls this function to indicate that it is done with the stream and hence
   * implementations can free any resources held by this class. Again, the body of this function can
   * be just empty and it will not affect the lexer's operation.
   */
  void Done();
}
