/*
 * Copyright 2017 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
/*****************************************************************************************
 ******************** This file was generated by sksllex. Do not edit. *******************
 *****************************************************************************************/
#ifndef SKSL_Lexer
#define SKSL_Lexer
#include <cstdint>
#include <string_view>
namespace SkSL {

struct Token {
    enum class Kind {
        TK_END_OF_FILE,
        TK_FLOAT_LITERAL,
        TK_INT_LITERAL,
        TK_BAD_OCTAL,
        TK_TRUE_LITERAL,
        TK_FALSE_LITERAL,
        TK_IF,
        TK_ELSE,
        TK_FOR,
        TK_WHILE,
        TK_DO,
        TK_SWITCH,
        TK_CASE,
        TK_DEFAULT,
        TK_BREAK,
        TK_CONTINUE,
        TK_DISCARD,
        TK_RETURN,
        TK_IN,
        TK_OUT,
        TK_INOUT,
        TK_UNIFORM,
        TK_CONST,
        TK_FLAT,
        TK_NOPERSPECTIVE,
        TK_INLINE,
        TK_NOINLINE,
        TK_PURE,
        TK_READONLY,
        TK_WRITEONLY,
        TK_BUFFER,
        TK_STRUCT,
        TK_LAYOUT,
        TK_HIGHP,
        TK_MEDIUMP,
        TK_LOWP,
        TK_ES3,
        TK_EXPORT,
        TK_WORKGROUP,
        TK_PIXELLOCAL,
        TK_RESERVED,
        TK_PRIVATE_IDENTIFIER,
        TK_IDENTIFIER,
        TK_DIRECTIVE,
        TK_LPAREN,
        TK_RPAREN,
        TK_LBRACE,
        TK_RBRACE,
        TK_LBRACKET,
        TK_RBRACKET,
        TK_DOT,
        TK_COMMA,
        TK_PLUSPLUS,
        TK_MINUSMINUS,
        TK_PLUS,
        TK_MINUS,
        TK_STAR,
        TK_SLASH,
        TK_PERCENT,
        TK_SHL,
        TK_SHR,
        TK_BITWISEOR,
        TK_BITWISEXOR,
        TK_BITWISEAND,
        TK_BITWISENOT,
        TK_LOGICALOR,
        TK_LOGICALXOR,
        TK_LOGICALAND,
        TK_LOGICALNOT,
        TK_QUESTION,
        TK_COLON,
        TK_EQ,
        TK_EQEQ,
        TK_NEQ,
        TK_GT,
        TK_LT,
        TK_GTEQ,
        TK_LTEQ,
        TK_PLUSEQ,
        TK_MINUSEQ,
        TK_STAREQ,
        TK_SLASHEQ,
        TK_PERCENTEQ,
        TK_SHLEQ,
        TK_SHREQ,
        TK_BITWISEOREQ,
        TK_BITWISEXOREQ,
        TK_BITWISEANDEQ,
        TK_SEMICOLON,
        TK_WHITESPACE,
        TK_LINE_COMMENT,
        TK_BLOCK_COMMENT,
        TK_INVALID,
        TK_NONE,
    };

    Token() {}
    Token(Kind kind, int32_t offset, int32_t length)
            : fKind(kind), fOffset(offset), fLength(length) {}

    Kind fKind = Kind::TK_NONE;
    int32_t fOffset = -1;
    int32_t fLength = -1;
};

class Lexer {
public:
    void start(std::string_view text) {
        fText = text;
        fOffset = 0;
    }

    Token next();

    struct Checkpoint {
        int32_t fOffset;
    };

    Checkpoint getCheckpoint() const { return {fOffset}; }

    void rewindToCheckpoint(Checkpoint checkpoint) { fOffset = checkpoint.fOffset; }

private:
    std::string_view fText;
    int32_t fOffset;
};

}  // namespace SkSL
#endif
