//
// Copyright (C) 2016 Google, Inc.
// Copyright (C) 2016 LunarG, Inc.
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
//    Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
//
//    Redistributions in binary form must reproduce the above
//    copyright notice, this list of conditions and the following
//    disclaimer in the documentation and/or other materials provided
//    with the distribution.
//
//    Neither the name of Google, Inc., nor the names of its
//    contributors may be used to endorse or promote products derived
//    from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//

#ifndef EHLSLTOKENS_H_
#define EHLSLTOKENS_H_

namespace glslang {

enum EHlslTokenClass {
    EHTokNone = 0,

    // qualifiers
    EHTokStatic,
    EHTokConst,
    EHTokSNorm,
    EHTokUnorm,
    EHTokExtern,
    EHTokUniform,
    EHTokVolatile,
    EHTokPrecise,
    EHTokShared,
    EHTokGroupShared,
    EHTokLinear,
    EHTokCentroid,
    EHTokNointerpolation,
    EHTokNoperspective,
    EHTokSample,
    EHTokRowMajor,
    EHTokColumnMajor,
    EHTokPackOffset,
    EHTokIn,
    EHTokOut,
    EHTokInOut,
    EHTokLayout,
    EHTokGloballyCoherent,
    EHTokInline,

    // primitive types
    EHTokPoint,
    EHTokLine,
    EHTokTriangle,
    EHTokLineAdj,
    EHTokTriangleAdj,

    // stream out types
    EHTokPointStream,
    EHTokLineStream,
    EHTokTriangleStream,

    // Tessellation patches
    EHTokInputPatch,
    EHTokOutputPatch,

    // template types
    EHTokBuffer,
    EHTokVector,
    EHTokMatrix,

    // scalar types
    EHTokVoid,
    EHTokString,
    EHTokBool,
    EHTokInt,
    EHTokUint,
    EHTokUint64,
    EHTokDword,
    EHTokHalf,
    EHTokFloat,
    EHTokDouble,
    EHTokMin16float,
    EHTokMin10float,
    EHTokMin16int,
    EHTokMin12int,
    EHTokMin16uint,

    // vector types
    EHTokBool1,
    EHTokBool2,
    EHTokBool3,
    EHTokBool4,
    EHTokFloat1,
    EHTokFloat2,
    EHTokFloat3,
    EHTokFloat4,
    EHTokInt1,
    EHTokInt2,
    EHTokInt3,
    EHTokInt4,
    EHTokDouble1,
    EHTokDouble2,
    EHTokDouble3,
    EHTokDouble4,
    EHTokUint1,
    EHTokUint2,
    EHTokUint3,
    EHTokUint4,
    EHTokHalf1,
    EHTokHalf2,
    EHTokHalf3,
    EHTokHalf4,
    EHTokMin16float1,
    EHTokMin16float2,
    EHTokMin16float3,
    EHTokMin16float4,
    EHTokMin10float1,
    EHTokMin10float2,
    EHTokMin10float3,
    EHTokMin10float4,
    EHTokMin16int1,
    EHTokMin16int2,
    EHTokMin16int3,
    EHTokMin16int4,
    EHTokMin12int1,
    EHTokMin12int2,
    EHTokMin12int3,
    EHTokMin12int4,
    EHTokMin16uint1,
    EHTokMin16uint2,
    EHTokMin16uint3,
    EHTokMin16uint4,

    // matrix types
    EHTokInt1x1,
    EHTokInt1x2,
    EHTokInt1x3,
    EHTokInt1x4,
    EHTokInt2x1,
    EHTokInt2x2,
    EHTokInt2x3,
    EHTokInt2x4,
    EHTokInt3x1,
    EHTokInt3x2,
    EHTokInt3x3,
    EHTokInt3x4,
    EHTokInt4x1,
    EHTokInt4x2,
    EHTokInt4x3,
    EHTokInt4x4,
    EHTokUint1x1,
    EHTokUint1x2,
    EHTokUint1x3,
    EHTokUint1x4,
    EHTokUint2x1,
    EHTokUint2x2,
    EHTokUint2x3,
    EHTokUint2x4,
    EHTokUint3x1,
    EHTokUint3x2,
    EHTokUint3x3,
    EHTokUint3x4,
    EHTokUint4x1,
    EHTokUint4x2,
    EHTokUint4x3,
    EHTokUint4x4,
    EHTokBool1x1,
    EHTokBool1x2,
    EHTokBool1x3,
    EHTokBool1x4,
    EHTokBool2x1,
    EHTokBool2x2,
    EHTokBool2x3,
    EHTokBool2x4,
    EHTokBool3x1,
    EHTokBool3x2,
    EHTokBool3x3,
    EHTokBool3x4,
    EHTokBool4x1,
    EHTokBool4x2,
    EHTokBool4x3,
    EHTokBool4x4,
    EHTokFloat1x1,
    EHTokFloat1x2,
    EHTokFloat1x3,
    EHTokFloat1x4,
    EHTokFloat2x1,
    EHTokFloat2x2,
    EHTokFloat2x3,
    EHTokFloat2x4,
    EHTokFloat3x1,
    EHTokFloat3x2,
    EHTokFloat3x3,
    EHTokFloat3x4,
    EHTokFloat4x1,
    EHTokFloat4x2,
    EHTokFloat4x3,
    EHTokFloat4x4,
    EHTokHalf1x1,
    EHTokHalf1x2,
    EHTokHalf1x3,
    EHTokHalf1x4,
    EHTokHalf2x1,
    EHTokHalf2x2,
    EHTokHalf2x3,
    EHTokHalf2x4,
    EHTokHalf3x1,
    EHTokHalf3x2,
    EHTokHalf3x3,
    EHTokHalf3x4,
    EHTokHalf4x1,
    EHTokHalf4x2,
    EHTokHalf4x3,
    EHTokHalf4x4,
    EHTokDouble1x1,
    EHTokDouble1x2,
    EHTokDouble1x3,
    EHTokDouble1x4,
    EHTokDouble2x1,
    EHTokDouble2x2,
    EHTokDouble2x3,
    EHTokDouble2x4,
    EHTokDouble3x1,
    EHTokDouble3x2,
    EHTokDouble3x3,
    EHTokDouble3x4,
    EHTokDouble4x1,
    EHTokDouble4x2,
    EHTokDouble4x3,
    EHTokDouble4x4,

    // texturing types
    EHTokSampler,
    EHTokSampler1d,
    EHTokSampler2d,
    EHTokSampler3d,
    EHTokSamplerCube,
    EHTokSamplerState,
    EHTokSamplerComparisonState,
    EHTokTexture,
    EHTokTexture1d,
    EHTokTexture1darray,
    EHTokTexture2d,
    EHTokTexture2darray,
    EHTokTexture3d,
    EHTokTextureCube,
    EHTokTextureCubearray,
    EHTokTexture2DMS,
    EHTokTexture2DMSarray,
    EHTokRWTexture1d,
    EHTokRWTexture1darray,
    EHTokRWTexture2d,
    EHTokRWTexture2darray,
    EHTokRWTexture3d,
    EHTokRWBuffer,
    EHTokSubpassInput,
    EHTokSubpassInputMS,

    // Structure buffer variants
    EHTokAppendStructuredBuffer,
    EHTokByteAddressBuffer,
    EHTokConsumeStructuredBuffer,
    EHTokRWByteAddressBuffer,
    EHTokRWStructuredBuffer,
    EHTokStructuredBuffer,
    EHTokTextureBuffer,

    // variable, user type, ...
    EHTokIdentifier,
    EHTokClass,
    EHTokStruct,
    EHTokCBuffer,
    EHTokTBuffer,
    EHTokTypedef,
    EHTokThis,
    EHTokNamespace,
    EHTokConstantBuffer,

    // constant
    EHTokFloat16Constant,
    EHTokFloatConstant,
    EHTokDoubleConstant,
    EHTokIntConstant,
    EHTokUintConstant,
    EHTokBoolConstant,
    EHTokStringConstant,

    // control flow
    EHTokFor,
    EHTokDo,
    EHTokWhile,
    EHTokBreak,
    EHTokContinue,
    EHTokIf,
    EHTokElse,
    EHTokDiscard,
    EHTokReturn,
    EHTokSwitch,
    EHTokCase,
    EHTokDefault,

    // expressions
    EHTokLeftOp,
    EHTokRightOp,
    EHTokIncOp,
    EHTokDecOp,
    EHTokLeOp,
    EHTokGeOp,
    EHTokEqOp,
    EHTokNeOp,
    EHTokAndOp,
    EHTokOrOp,
    EHTokXorOp,
    EHTokAssign,
    EHTokMulAssign,
    EHTokDivAssign,
    EHTokAddAssign,
    EHTokModAssign,
    EHTokLeftAssign,
    EHTokRightAssign,
    EHTokAndAssign,
    EHTokXorAssign,
    EHTokOrAssign,
    EHTokSubAssign,
    EHTokLeftParen,
    EHTokRightParen,
    EHTokLeftBracket,
    EHTokRightBracket,
    EHTokLeftBrace,
    EHTokRightBrace,
    EHTokDot,
    EHTokComma,
    EHTokColon,
    EHTokColonColon,
    EHTokSemicolon,
    EHTokBang,
    EHTokDash,
    EHTokTilde,
    EHTokPlus,
    EHTokStar,
    EHTokSlash,
    EHTokPercent,
    EHTokLeftAngle,
    EHTokRightAngle,
    EHTokVerticalBar,
    EHTokCaret,
    EHTokAmpersand,
    EHTokQuestion,
};

} // end namespace glslang

#endif // EHLSLTOKENS_H_
