text: /* 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 "RuleContext.h"
  #include "atn/LexerAction.h"
  
  namespace antlr4 {
  namespace atn {
  
    /// <summary>
    /// This implementation of <seealso cref="LexerAction"/> is used for tracking input offsets
    /// for position-dependent actions within a <seealso cref="LexerActionExecutor"/>.
    ///
    /// <para>This action is not serialized as part of the ATN, and is only required for
    /// position-dependent lexer actions which appear at a location other than the
    /// end of a rule. For more information about DFA optimizations employed for
    /// lexer actions, see <seealso cref="LexerActionExecutor#append"/> and
    /// <seealso cref="LexerActionExecutor#fixOffsetBeforeMatch"/>.</para>
    ///
    /// @author Sam Harwell
    /// @since 4.2
    /// </summary>
    class ANTLR4CPP_PUBLIC LexerIndexedCustomAction final : public LexerAction {
    public:
      /// <summary>
      /// Constructs a new indexed custom action by associating a character offset
      /// with a <seealso cref="LexerAction"/>.
      ///
      /// <para>Note: This class is only required for lexer actions for which
      /// <seealso cref="LexerAction#isPositionDependent"/> returns {@code true}.</para>
      /// </summary>
      /// <param name="offset"> The offset into the input <seealso cref="CharStream"/>, relative to
      /// the token start index, at which the specified lexer action should be
      /// executed. </param>
      /// <param name="action"> The lexer action to execute at a particular offset in the
      /// input <seealso cref="CharStream"/>. </param>
      LexerIndexedCustomAction(int offset, Ref<LexerAction> const& action);
  
      /// <summary>
      /// Gets the location in the input <seealso cref="CharStream"/> at which the lexer
      /// action should be executed. The value is interpreted as an offset relative
      /// to the token start index.
      /// </summary>
      /// <returns> The location in the input <seealso cref="CharStream"/> at which the lexer
      /// action should be executed. </returns>
      int getOffset() const;
  
      /// <summary>
      /// Gets the lexer action to execute.
      /// </summary>
      /// <returns> A <seealso cref="LexerAction"/> object which executes the lexer action. </returns>
      Ref<LexerAction> getAction() const;
  
      /// <summary>
      /// {@inheritDoc}
      /// </summary>
      /// <returns> This method returns the result of calling <seealso cref="#getActionType"/>
      /// on the <seealso cref="LexerAction"/> returned by <seealso cref="#getAction"/>. </returns>
      virtual LexerActionType getActionType() const override;
  
      /// <summary>
      /// {@inheritDoc} </summary>
      /// <returns> This method returns {@code true}. </returns>
      virtual bool isPositionDependent() const override;
  
      virtual void execute(Lexer *lexer) override;
      virtual size_t hashCode() const override;
      virtual bool operator == (const LexerAction &obj) const override;
      virtual std::string toString() const override;
  
    private:
      const int _offset;
      const Ref<LexerAction> _action;
    };
  
  } // namespace atn
  } // namespace antlr4
  
  