// Copyright 2020 The Tint Authors.
//
// Licensed 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.

#ifndef SRC_READER_WGSL_TOKEN_H_
#define SRC_READER_WGSL_TOKEN_H_

#include <stddef.h>

#include <ostream>
#include <string>

#include "src/source.h"

namespace tint {
namespace reader {
namespace wgsl {

/// Stores tokens generated by the Lexer
class Token {
 public:
  /// The type of the parsed token
  enum class Type {
    /// Error result
    kError = -2,
    /// Reserved keyword
    kReservedKeyword = -1,
    /// Uninitialized token
    kUninitialized = 0,
    /// End of input string reached
    kEOF,

    /// An identifier
    kIdentifier,
    /// A string value
    kStringLiteral,
    /// A float value
    kFloatLiteral,
    /// An signed int value
    kSintLiteral,
    /// A unsigned int value
    kUintLiteral,

    /// A '&'
    kAnd,
    /// A '&&'
    kAndAnd,
    /// A '->'
    kArrow,
    /// A '[['
    kAttrLeft,
    /// A ']]'
    kAttrRight,
    /// A '/'
    kForwardSlash,
    /// A '!'
    kBang,
    /// A '['
    kBracketLeft,
    /// A ']'
    kBracketRight,
    /// A '{'
    kBraceLeft,
    /// A '}'
    kBraceRight,
    /// A ':'
    kColon,
    /// A ','
    kComma,
    /// A '='
    kEqual,
    /// A '=='
    kEqualEqual,
    /// A '>'
    kGreaterThan,
    /// A '>='
    kGreaterThanEqual,
    /// A '<'
    kLessThan,
    /// A '<='
    kLessThanEqual,
    /// A '%'
    kMod,
    /// A '-'
    kMinus,
    /// A '!='
    kNotEqual,
    /// A '.'
    kPeriod,
    /// A '+'
    kPlus,
    /// A '|'
    kOr,
    /// A '||'
    kOrOr,
    /// A '('
    kParenLeft,
    /// A ')'
    kParenRight,
    /// A ';'
    kSemicolon,
    /// A '*'
    kStar,
    /// A '^'
    kXor,

    /// A 'array'
    kArray,
    /// A 'bitcast'
    kBitcast,
    /// A 'bool'
    kBool,
    /// A 'break'
    kBreak,
    /// A 'case'
    kCase,
    /// A 'const'
    kConst,
    /// A 'continue'
    kContinue,
    /// A 'continuing'
    kContinuing,
    /// A 'discard'
    kDiscard,
    /// A 'default'
    kDefault,
    /// A 'else'
    kElse,
    /// A 'elseif'
    kElseIf,
    /// A 'f32'
    kF32,
    /// A 'fallthrough'
    kFallthrough,
    /// A 'false'
    kFalse,
    /// A 'fn'
    kFn,
    // A 'for'
    kFor,
    // A 'Bgra8Unorm' format
    kFormatBgra8Unorm,
    // A 'Bgra8UnormSrgb' format
    kFormatBgra8UnormSrgb,
    // A 'R16Float' format
    kFormatR16Float,
    // A 'R16Sint' format
    kFormatR16Sint,
    // A 'R16Uint' format
    kFormatR16Uint,
    // A 'R32Float' format
    kFormatR32Float,
    // A 'R32Sint' format
    kFormatR32Sint,
    // A 'R32Uint' format
    kFormatR32Uint,
    // A 'R8Sint' format
    kFormatR8Sint,
    // A 'R8Snorm' format
    kFormatR8Snorm,
    // A 'R8Uint' format
    kFormatR8Uint,
    // A 'R8Unorm' format
    kFormatR8Unorm,
    // A 'Rg11B10Float' format
    kFormatRg11B10Float,
    // A 'Rg16Float' format
    kFormatRg16Float,
    // A 'Rg16Sint' format
    kFormatRg16Sint,
    // A 'Rg16Uint' format
    kFormatRg16Uint,
    // A 'Rg32Float' format
    kFormatRg32Float,
    // A 'Rg32Sint' format
    kFormatRg32Sint,
    // A 'Rg32Uint' format
    kFormatRg32Uint,
    // A 'Rg8Sint' format
    kFormatRg8Sint,
    // A 'Rg8Snorm' format
    kFormatRg8Snorm,
    // A 'Rg8Uint' format
    kFormatRg8Uint,
    // A 'Rg8Unorm' format
    kFormatRg8Unorm,
    // A 'Rgb10A2Unorm' format
    kFormatRgb10A2Unorm,
    // A 'Rgba16Float' format
    kFormatRgba16Float,
    // A 'Rgba16Sint' format
    kFormatRgba16Sint,
    // A 'Rgba16Uint' format
    kFormatRgba16Uint,
    // A 'Rgba32Float' format
    kFormatRgba32Float,
    // A 'Rgba32Sint' format
    kFormatRgba32Sint,
    // A 'Rgba32Uint' format
    kFormatRgba32Uint,
    // A 'Rgba8Sint' format
    kFormatRgba8Sint,
    // A 'Rgba8Snorm' format
    kFormatRgba8Snorm,
    // A 'Rgba8Uint' format
    kFormatRgba8Uint,
    // A 'Rgba8Unorm' format
    kFormatRgba8Unorm,
    // A 'Rgba8UnormSrgb' format
    kFormatRgba8UnormSrgb,
    /// A 'function'
    kFunction,
    /// A 'i32'
    kI32,
    /// A 'if'
    kIf,
    /// A 'image'
    kImage,
    /// A 'import'
    kImport,
    /// A 'in'
    kIn,
    /// A 'loop'
    kLoop,
    /// A 'mat2x2'
    kMat2x2,
    /// A 'mat2x3'
    kMat2x3,
    /// A 'mat2x4'
    kMat2x4,
    /// A 'mat3x2'
    kMat3x2,
    /// A 'mat3x3'
    kMat3x3,
    /// A 'mat3x4'
    kMat3x4,
    /// A 'mat4x2'
    kMat4x2,
    /// A 'mat4x3'
    kMat4x3,
    /// A 'mat4x4'
    kMat4x4,
    /// A 'out'
    kOut,
    /// A 'private'
    kPrivate,
    /// A 'ptr'
    kPtr,
    /// A 'return'
    kReturn,
    /// A 'sampler'
    kSampler,
    /// A 'sampler_comparison'
    kComparisonSampler,
    /// A 'storage_buffer'
    kStorageBuffer,
    /// A 'struct'
    kStruct,
    /// A 'switch'
    kSwitch,
    /// A 'texture_depth_2d'
    kTextureDepth2d,
    /// A 'texture_depth_2d_array'
    kTextureDepth2dArray,
    /// A 'texture_depth_cube'
    kTextureDepthCube,
    /// A 'texture_depth_cube_array'
    kTextureDepthCubeArray,
    /// A 'texture_multisampled_2d'
    kTextureMultisampled2d,
    /// A 'texture_storage_ro_1d'
    kTextureStorageReadonly1d,
    /// A 'texture_storage_ro_2d_array'
    kTextureStorageReadonly1dArray,
    /// A 'texture_storage_ro_2d'
    kTextureStorageReadonly2d,
    /// A 'texture_storage_ro_2d_array'
    kTextureStorageReadonly2dArray,
    /// A 'texture_storage_ro_3d'
    kTextureStorageReadonly3d,
    /// A 'texture_1d'
    kTextureSampled1d,
    /// A 'texture_1d_array'
    kTextureSampled1dArray,
    /// A 'texture_2d'
    kTextureSampled2d,
    /// A 'texture_2d_array'
    kTextureSampled2dArray,
    /// A 'texture_3d'
    kTextureSampled3d,
    /// A 'texture_cube'
    kTextureSampledCube,
    /// A 'texture_cube_array'
    kTextureSampledCubeArray,
    /// A 'texture_wo_1d'
    kTextureStorageWriteonly1d,
    /// A 'texture_wo_2d_array'
    kTextureStorageWriteonly1dArray,
    /// A 'texture_wo_2d'
    kTextureStorageWriteonly2d,
    /// A 'texture_wo_2d_array'
    kTextureStorageWriteonly2dArray,
    /// A 'texture_wo_3d'
    kTextureStorageWriteonly3d,
    /// A 'true'
    kTrue,
    /// A 'type'
    kType,
    /// A 'u32'
    kU32,
    /// A 'uniform'
    kUniform,
    /// A 'uniform_constant'
    kUniformConstant,
    /// A 'var'
    kVar,
    /// A 'vec2'
    kVec2,
    /// A 'vec3'
    kVec3,
    /// A 'vec4'
    kVec4,
    /// A 'void'
    kVoid,
    /// A 'workgroup'
    kWorkgroup,
  };

  /// Converts a token type to a name
  /// @param type the type to convert
  /// @returns the token type as as string
  static std::string TypeToName(Type type);

  /// Creates an uninitialized token
  Token();
  /// Create a Token
  /// @param type the Token::Type of the token
  /// @param source the source of the token
  Token(Type type, const Source& source);

  /// Create a string Token
  /// @param type the Token::Type of the token
  /// @param source the source of the token
  /// @param val the source string for the token
  Token(Type type, const Source& source, const std::string& val);
  /// Create a unsigned integer Token
  /// @param source the source of the token
  /// @param val the source unsigned for the token
  Token(const Source& source, uint32_t val);
  /// Create a signed integer Token
  /// @param source the source of the token
  /// @param val the source integer for the token
  Token(const Source& source, int32_t val);
  /// Create a float Token
  /// @param source the source of the token
  /// @param val the source float for the token
  Token(const Source& source, float val);
  /// Move constructor
  Token(Token&&);
  /// Copy constructor
  Token(const Token&);
  ~Token();

  /// Assignment operator
  /// @param b the token to copy
  /// @return Token
  Token& operator=(const Token& b);

  /// Returns true if the token is of the given type
  /// @param t the type to check against.
  /// @returns true if the token is of type `t`
  bool Is(Type t) const { return type_ == t; }

  /// @returns true if the token is uninitialized
  bool IsUninitialized() const { return type_ == Type::kUninitialized; }
  /// @returns true if the token is reserved
  bool IsReservedKeyword() const { return type_ == Type::kReservedKeyword; }
  /// @returns true if the token is an error
  bool IsError() const { return type_ == Type::kError; }
  /// @returns true if the token is EOF
  bool IsEof() const { return type_ == Type::kEOF; }
  /// @returns true if the token is an identifier
  bool IsIdentifier() const { return type_ == Type::kIdentifier; }
  /// @returns true if the token is a string
  bool IsStringLiteral() const { return type_ == Type::kStringLiteral; }
  /// @returns true if the token is a float
  bool IsFloatLiteral() const { return type_ == Type::kFloatLiteral; }
  /// @returns true if the token is an signed int
  bool IsSintLiteral() const { return type_ == Type::kSintLiteral; }
  /// @returns true if the token is a unsigned int
  bool IsUintLiteral() const { return type_ == Type::kUintLiteral; }

  /// @returns true if token is a '&'
  bool IsAnd() const { return type_ == Type::kAnd; }
  /// @returns true if token is a '&&'
  bool IsAndAnd() const { return type_ == Type::kAndAnd; }
  /// @returns true if token is a '->'
  bool IsArrow() const { return type_ == Type::kArrow; }
  /// @returns true if token is a '[['
  bool IsAttrLeft() const { return type_ == Type::kAttrLeft; }
  /// @returns true if token is a ']]'
  bool IsAttrRight() const { return type_ == Type::kAttrRight; }
  /// @returns true if token is a '/'
  bool IsForwardSlash() const { return type_ == Type::kForwardSlash; }
  /// @returns true if token is a '!'
  bool IsBang() const { return type_ == Type::kBang; }
  /// @returns true if token is a '['
  bool IsBracketLeft() const { return type_ == Type::kBracketLeft; }
  /// @returns true if token is a ']'
  bool IsBracketRight() const { return type_ == Type::kBracketRight; }
  /// @returns true if token is a '{'
  bool IsBraceLeft() const { return type_ == Type::kBraceLeft; }
  /// @returns true if token is a '}'
  bool IsBraceRight() const { return type_ == Type::kBraceRight; }
  /// @returns true if token is a ':'
  bool IsColon() const { return type_ == Type::kColon; }
  /// @returns true if token is a ','
  bool IsComma() const { return type_ == Type::kComma; }
  /// @returns true if token is a '='
  bool IsEqual() const { return type_ == Type::kEqual; }
  /// @returns true if token is a '=='
  bool IsEqualEqual() const { return type_ == Type::kEqualEqual; }
  /// @returns true if token is a '>'
  bool IsGreaterThan() const { return type_ == Type::kGreaterThan; }
  /// @returns true if token is a '>='
  bool IsGreaterThanEqual() const { return type_ == Type::kGreaterThanEqual; }
  /// @returns true if token is a '<'
  bool IsLessThan() const { return type_ == Type::kLessThan; }
  /// @returns true if token is a '<='
  bool IsLessThanEqual() const { return type_ == Type::kLessThanEqual; }
  /// @returns true if token is a '%'
  bool IsMod() const { return type_ == Type::kMod; }
  /// @returns true if token is a '-'
  bool IsMinus() const { return type_ == Type::kMinus; }
  /// @returns true if token is a '!='
  bool IsNotEqual() const { return type_ == Type::kNotEqual; }
  /// @returns true if token is a '.'
  bool IsPeriod() const { return type_ == Type::kPeriod; }
  /// @returns true if token is a '+'
  bool IsPlus() const { return type_ == Type::kPlus; }
  /// @returns true if token is a '|'
  bool IsOr() const { return type_ == Type::kOr; }
  /// @returns true if token is a '||'
  bool IsOrOr() const { return type_ == Type::kOrOr; }
  /// @returns true if token is a '('
  bool IsParenLeft() const { return type_ == Type::kParenLeft; }
  /// @returns true if token is a ')'
  bool IsParenRight() const { return type_ == Type::kParenRight; }
  /// @returns true if token is a ';'
  bool IsSemicolon() const { return type_ == Type::kSemicolon; }
  /// @returns true if token is a '*'
  bool IsStar() const { return type_ == Type::kStar; }
  /// @returns true if token is a '^'
  bool IsXor() const { return type_ == Type::kXor; }

  /// @returns true if token is a 'array'
  bool IsArray() const { return type_ == Type::kArray; }
  /// @returns true if token is a 'bitcast'
  bool IsBitcast() const { return type_ == Type::kBitcast; }
  /// @returns true if token is a 'bool'
  bool IsBool() const { return type_ == Type::kBool; }
  /// @returns true if token is a 'break'
  bool IsBreak() const { return type_ == Type::kBreak; }
  /// @returns true if token is a 'case'
  bool IsCase() const { return type_ == Type::kCase; }
  /// @returns true if token is a 'sampler_comparison'
  bool IsComparisonSampler() const { return type_ == Type::kComparisonSampler; }
  /// @returns true if token is a 'const'
  bool IsConst() const { return type_ == Type::kConst; }
  /// @returns true if token is a 'continue'
  bool IsContinue() const { return type_ == Type::kContinue; }
  /// @returns true if token is a 'continuing'
  bool IsContinuing() const { return type_ == Type::kContinuing; }
  /// @returns true if token is a 'discard'
  bool IsDiscard() const { return type_ == Type::kDiscard; }
  /// @returns true if token is a 'default'
  bool IsDefault() const { return type_ == Type::kDefault; }
  /// @returns true if token is a 'else'
  bool IsElse() const { return type_ == Type::kElse; }
  /// @returns true if token is a 'elseif'
  bool IsElseIf() const { return type_ == Type::kElseIf; }
  /// @returns true if token is a 'f32'
  bool IsF32() const { return type_ == Type::kF32; }
  /// @returns true if token is a 'fallthrough'
  bool IsFallthrough() const { return type_ == Type::kFallthrough; }
  /// @returns true if token is a 'false'
  bool IsFalse() const { return type_ == Type::kFalse; }
  /// @returns true if token is a 'fn'
  bool IsFn() const { return type_ == Type::kFn; }
  /// @returns true if token is a 'for'
  bool IsFor() const { return type_ == Type::kFor; }
  /// @returns true if token is a 'Bgra8Unorm' format
  bool IsFormatBgra8Unorm() const { return type_ == Type::kFormatBgra8Unorm; }
  /// @returns true if token is a 'Bgra8UnormSrgb' format
  bool IsFormatBgra8UnormSrgb() const {
    return type_ == Type::kFormatBgra8UnormSrgb;
  }
  /// @returns true if token is a 'R16Float' format
  bool IsFormatR16Float() const { return type_ == Type::kFormatR16Float; }
  /// @returns true if token is a 'R16Sint' format
  bool IsFormatR16Sint() const { return type_ == Type::kFormatR16Sint; }
  /// @returns true if token is a 'R16Uint' format
  bool IsFormatR16Uint() const { return type_ == Type::kFormatR16Uint; }
  /// @returns true if token is a 'R32Float' format
  bool IsFormatR32Float() const { return type_ == Type::kFormatR32Float; }
  /// @returns true if token is a 'R32Sint' format
  bool IsFormatR32Sint() const { return type_ == Type::kFormatR32Sint; }
  /// @returns true if token is a 'R32Uint' format
  bool IsFormatR32Uint() const { return type_ == Type::kFormatR32Uint; }
  /// @returns true if token is a 'R8Sint' format
  bool IsFormatR8Sint() const { return type_ == Type::kFormatR8Sint; }
  /// @returns true if token is a 'R8Snorm' format
  bool IsFormatR8Snorm() const { return type_ == Type::kFormatR8Snorm; }
  /// @returns true if token is a 'R8Uint' format
  bool IsFormatR8Uint() const { return type_ == Type::kFormatR8Uint; }
  /// @returns true if token is a 'R8Unorm' format
  bool IsFormatR8Unorm() const { return type_ == Type::kFormatR8Unorm; }
  /// @returns true if token is a 'Rg11B10Float' format
  bool IsFormatRg11B10Float() const {
    return type_ == Type::kFormatRg11B10Float;
  }
  /// @returns true if token is a 'Rg16Float' format
  bool IsFormatRg16Float() const { return type_ == Type::kFormatRg16Float; }
  /// @returns true if token is a 'Rg16Sint' format
  bool IsFormatRg16Sint() const { return type_ == Type::kFormatRg16Sint; }
  /// @returns true if token is a 'Rg16Uint' format
  bool IsFormatRg16Uint() const { return type_ == Type::kFormatRg16Uint; }
  /// @returns true if token is a 'Rg32Float' format
  bool IsFormatRg32Float() const { return type_ == Type::kFormatRg32Float; }
  /// @returns true if token is a 'Rg32Sint' format
  bool IsFormatRg32Sint() const { return type_ == Type::kFormatRg32Sint; }
  /// @returns true if token is a 'Rg32Uint' format
  bool IsFormatRg32Uint() const { return type_ == Type::kFormatRg32Uint; }
  /// @returns true if token is a 'Rg8Sint' format
  bool IsFormatRg8Sint() const { return type_ == Type::kFormatRg8Sint; }
  /// @returns true if token is a 'Rg8Snorm' format
  bool IsFormatRg8Snorm() const { return type_ == Type::kFormatRg8Snorm; }
  /// @returns true if token is a 'Rg8Uint' format
  bool IsFormatRg8Uint() const { return type_ == Type::kFormatRg8Uint; }
  /// @returns true if token is a 'Rg8Unorm' format
  bool IsFormatRg8Unorm() const { return type_ == Type::kFormatRg8Unorm; }
  /// @returns true if token is a 'Rgb10A2Unorm' format
  bool IsFormatRgb10A2Unorm() const {
    return type_ == Type::kFormatRgb10A2Unorm;
  }
  /// @returns true if token is a 'Rgba16Float' format
  bool IsFormatRgba16Float() const { return type_ == Type::kFormatRgba16Float; }
  /// @returns true if token is a 'Rgba16Sint' format
  bool IsFormatRgba16Sint() const { return type_ == Type::kFormatRgba16Sint; }
  /// @returns true if token is a 'Rgba16Uint' format
  bool IsFormatRgba16Uint() const { return type_ == Type::kFormatRgba16Uint; }
  /// @returns true if token is a 'Rgba32Float' format
  bool IsFormatRgba32Float() const { return type_ == Type::kFormatRgba32Float; }
  /// @returns true if token is a 'Rgba32Sint' format
  bool IsFormatRgba32Sint() const { return type_ == Type::kFormatRgba32Sint; }
  /// @returns true if token is a 'Rgba32Uint' format
  bool IsFormatRgba32Uint() const { return type_ == Type::kFormatRgba32Uint; }
  /// @returns true if token is a 'Rgba8Sint' format
  bool IsFormatRgba8Sint() const { return type_ == Type::kFormatRgba8Sint; }
  /// @returns true if token is a 'Rgba8Snorm' format
  bool IsFormatRgba8Snorm() const { return type_ == Type::kFormatRgba8Snorm; }
  /// @returns true if token is a 'Rgba8Uint' format
  bool IsFormatRgba8Uint() const { return type_ == Type::kFormatRgba8Uint; }
  /// @returns true if token is a 'Rgba8Unorm' format
  bool IsFormatRgba8Unorm() const { return type_ == Type::kFormatRgba8Unorm; }
  /// @returns true if token is a 'Rgba8UnormSrgb' format
  bool IsFormatRgba8UnormSrgb() const {
    return type_ == Type::kFormatRgba8UnormSrgb;
  }
  /// @returns true if token is a 'function'
  bool IsFunction() const { return type_ == Type::kFunction; }
  /// @returns true if token is a 'i32'
  bool IsI32() const { return type_ == Type::kI32; }
  /// @returns true if token is a 'if'
  bool IsIf() const { return type_ == Type::kIf; }
  /// @returns true if token is a 'image'
  bool IsImage() const { return type_ == Type::kImage; }
  /// @returns true if token is a 'import'
  bool IsImport() const { return type_ == Type::kImport; }
  /// @returns true if token is a 'in'
  bool IsIn() const { return type_ == Type::kIn; }
  /// @returns true if token is a 'loop'
  bool IsLoop() const { return type_ == Type::kLoop; }
  /// @returns true if token is a 'mat2x2'
  bool IsMat2x2() const { return type_ == Type::kMat2x2; }
  /// @returns true if token is a 'mat2x3'
  bool IsMat2x3() const { return type_ == Type::kMat2x3; }
  /// @returns true if token is a 'mat2x4'
  bool IsMat2x4() const { return type_ == Type::kMat2x4; }
  /// @returns true if token is a 'mat3x2'
  bool IsMat3x2() const { return type_ == Type::kMat3x2; }
  /// @returns true if token is a 'mat3x3'
  bool IsMat3x3() const { return type_ == Type::kMat3x3; }
  /// @returns true if token is a 'mat3x4'
  bool IsMat3x4() const { return type_ == Type::kMat3x4; }
  /// @returns true if token is a 'mat4x2'
  bool IsMat4x2() const { return type_ == Type::kMat4x2; }
  /// @returns true if token is a 'mat4x3'
  bool IsMat4x3() const { return type_ == Type::kMat4x3; }
  /// @returns true if token is a 'mat4x4'
  bool IsMat4x4() const { return type_ == Type::kMat4x4; }
  /// @returns true if token is a 'out'
  bool IsOut() const { return type_ == Type::kOut; }
  /// @returns true if token is a 'private'
  bool IsPrivate() const { return type_ == Type::kPrivate; }
  /// @returns true if token is a 'ptr'
  bool IsPtr() const { return type_ == Type::kPtr; }
  /// @returns true if token is a 'return'
  bool IsReturn() const { return type_ == Type::kReturn; }
  /// @returns true if token is a 'sampler'
  bool IsSampler() const { return type_ == Type::kSampler; }
  /// @returns true if token is a 'storage_buffer'
  bool IsStorageBuffer() const { return type_ == Type::kStorageBuffer; }
  /// @returns true if token is a 'struct'
  bool IsStruct() const { return type_ == Type::kStruct; }
  /// @returns true if token is a 'switch'
  bool IsSwitch() const { return type_ == Type::kSwitch; }
  /// @returns true if token is a 'texture_depth_2d'
  bool IsTextureDepth2d() const { return type_ == Type::kTextureDepth2d; }
  /// @returns true if token is a 'texture_depth_2d_array'
  bool IsTextureDepth2dArray() const {
    return type_ == Type::kTextureDepth2dArray;
  }
  /// @returns true if token is a 'texture_depth_cube'
  bool IsTextureDepthCube() const { return type_ == Type::kTextureDepthCube; }
  /// @returns true if token is a 'texture_depth_cube_array'
  bool IsTextureDepthCubeArray() const {
    return type_ == Type::kTextureDepthCubeArray;
  }
  /// @returns true if the token is a 'texture_multisample_2d'
  bool IsTextureMultisampled2d() const {
    return type_ == Type::kTextureMultisampled2d;
  }
  /// @returns true if token is a 'texture_storage_ro_1d'
  bool IsTextureStorageReadonly1d() const {
    return type_ == Type::kTextureStorageReadonly1d;
  }
  /// @returns true if token is a 'texture_storage_ro_1d_array'
  bool IsTextureStorageReadonly1dArray() const {
    return type_ == Type::kTextureStorageReadonly1dArray;
  }
  /// @returns true if token is a 'texture_storage_ro_2d'
  bool IsTextureStorageReadonly2d() const {
    return type_ == Type::kTextureStorageReadonly2d;
  }
  /// @returns true if token is a 'texture_storage_ro_2d_array'
  bool IsTextureStorageReadonly2dArray() const {
    return type_ == Type::kTextureStorageReadonly2dArray;
  }
  /// @returns true if token is a 'texture_storage_ro_3d'
  bool IsTextureStorageReadonly3d() const {
    return type_ == Type::kTextureStorageReadonly3d;
  }
  /// @returns true if token is a 'texture_1d'
  bool IsTextureSampled1d() const { return type_ == Type::kTextureSampled1d; }
  /// @returns true if token is a 'texture_1d_array'
  bool IsTextureSampled1dArray() const {
    return type_ == Type::kTextureSampled1dArray;
  }
  /// @returns true if token is a 'texture_2d'
  bool IsTextureSampled2d() const { return type_ == Type::kTextureSampled2d; }
  /// @returns true if token is a 'texture_2d_array'
  bool IsTextureSampled2dArray() const {
    return type_ == Type::kTextureSampled2dArray;
  }
  /// @returns true if token is a 'texture_3d'
  bool IsTextureSampled3d() const { return type_ == Type::kTextureSampled3d; }
  /// @returns true if token is a 'texture_cube'
  bool IsTextureSampledCube() const {
    return type_ == Type::kTextureSampledCube;
  }
  /// @returns true if token is a 'texture_cube_array'
  bool IsTextureSampledCubeArray() const {
    return type_ == Type::kTextureSampledCubeArray;
  }
  /// @returns true if token is a 'texture_storage_wo_1d'
  bool IsTextureStorageWriteonly1d() const {
    return type_ == Type::kTextureStorageWriteonly1d;
  }
  /// @returns true if token is a 'texture_storage_wo_1d_array'
  bool IsTextureStorageWriteonly1dArray() const {
    return type_ == Type::kTextureStorageWriteonly1dArray;
  }
  /// @returns true if token is a 'texture_storage_wo_2d'
  bool IsTextureStorageWriteonly2d() const {
    return type_ == Type::kTextureStorageWriteonly2d;
  }
  /// @returns true if token is a 'texture_storage_wo_2d_array'
  bool IsTextureStorageWriteonly2dArray() const {
    return type_ == Type::kTextureStorageWriteonly2dArray;
  }
  /// @returns true if token is a 'texture_storage_wo_3d'
  bool IsTextureStorageWriteonly3d() const {
    return type_ == Type::kTextureStorageWriteonly3d;
  }
  /// @returns true if token is a 'true'
  bool IsTrue() const { return type_ == Type::kTrue; }
  /// @returns true if token is a 'type'
  bool IsType() const { return type_ == Type::kType; }
  /// @returns true if token is a 'u32'
  bool IsU32() const { return type_ == Type::kU32; }
  /// @returns true if token is a 'uniform'
  bool IsUniform() const { return type_ == Type::kUniform; }
  /// @returns true if token is a 'uniform_constant'
  bool IsUniformConstant() const { return type_ == Type::kUniformConstant; }
  /// @returns true if token is a 'var'
  bool IsVar() const { return type_ == Type::kVar; }
  /// @returns true if token is a 'vec2'
  bool IsVec2() const { return type_ == Type::kVec2; }
  /// @returns true if token is a 'vec3'
  bool IsVec3() const { return type_ == Type::kVec3; }
  /// @returns true if token is a 'vec4'
  bool IsVec4() const { return type_ == Type::kVec4; }
  /// @returns true if token is a 'void'
  bool IsVoid() const { return type_ == Type::kVoid; }
  /// @returns true if token is a 'workgroup'
  bool IsWorkgroup() const { return type_ == Type::kWorkgroup; }

  /// @returns the source information for this token
  Source source() const { return source_; }

  /// Returns the string value of the token
  /// @return const std::string&
  std::string to_str() const;
  /// Returns the float value of the token. 0 is returned if the token does not
  /// contain a float value.
  /// @return float
  float to_f32() const;
  /// Returns the uint32 value of the token. 0 is returned if the token does not
  /// contain a unsigned integer value.
  /// @return uint32_t
  uint32_t to_u32() const;
  /// Returns the int32 value of the token. 0 is returned if the token does not
  /// contain a signed integer value.
  /// @return int32_t
  int32_t to_i32() const;

  /// @returns the token type as string
  std::string to_name() const { return Token::TypeToName(type_); }

 private:
  /// The Token::Type of the token
  Type type_ = Type::kError;
  /// The source where the token appeared
  Source source_;
  /// The string represented by the token
  std::string val_str_;
  /// The signed integer represented by the token
  int32_t val_int_ = 0;
  /// The unsigned integer represented by the token
  uint32_t val_uint_ = 0;
  /// The float value represented by the token
  float val_float_ = 0.0;
};

#ifndef NDEBUG
inline std::ostream& operator<<(std::ostream& out, Token::Type type) {
  out << Token::TypeToName(type);
  return out;
}
#endif  // NDEBUG

}  // namespace wgsl
}  // namespace reader
}  // namespace tint

#endif  // SRC_READER_WGSL_TOKEN_H_
