https://github.com/shader-slang/slang
Tip revision: 259a015feb9d4ab65e8fbba32f6c777e92780cc7 authored by Yong He on 23 March 2023, 04:16:35 UTC
Type legalization and autodiff bug fixes. (#2722)
Type legalization and autodiff bug fixes. (#2722)
Tip revision: 259a015
slang-token.h
// slang-token.h
#ifndef SLANG_TOKEN_H_INCLUDED
#define SLANG_TOKEN_H_INCLUDED
#include "../core/slang-basic.h"
#include "slang-source-loc.h"
#include "slang-name.h"
namespace Slang {
class Name;
enum class TokenType : uint8_t
{
#define TOKEN(NAME, DESC) NAME,
#include "slang-token-defs.h"
};
char const* TokenTypeToString(TokenType type);
typedef uint8_t TokenFlags;
struct TokenFlag
{
enum Enum : TokenFlags
{
AtStartOfLine = 1 << 0,
AfterWhitespace = 1 << 1,
ScrubbingNeeded = 1 << 2,
Name = 1 << 3, ///< Determines if 'name' is set or 'chars' in the charsNameUnion
};
};
class Token
{
public:
TokenType type = TokenType::Unknown;
TokenFlags flags = 0;
SourceLoc loc;
uint32_t charsCount = 0; ///< Amount of characters. Is set if name or not.
union CharsNameUnion
{
const char* chars;
Name* name;
};
CharsNameUnion charsNameUnion;
bool hasContent() const { return charsCount > 0; }
Index getContentLength() const { return charsCount; }
UnownedStringSlice getContent() const;
/// Set content
void setContent(const UnownedStringSlice& content);
Name* getName() const;
Name* getNameOrNull() const;
SourceLoc getLoc() const { return loc; }
/// Set the name
SLANG_FORCE_INLINE void setName(Name* inName);
Token()
{
charsNameUnion.chars = nullptr;
}
Token(
TokenType inType,
const UnownedStringSlice& inContent,
SourceLoc inLoc,
TokenFlags inFlags = 0)
: flags(inFlags)
{
SLANG_ASSERT((inFlags & TokenFlag::Name) == 0);
type = inType;
charsNameUnion.chars = inContent.begin();
charsCount = uint32_t(inContent.getLength());
loc = inLoc;
}
Token(
TokenType inType,
Name* name,
SourceLoc inLoc,
TokenFlags inFlags = 0)
{
SLANG_ASSERT(name);
type = inType;
flags = inFlags | TokenFlag::Name;
charsNameUnion.name = name;
charsCount = uint32_t(name->text.getLength());
loc = inLoc;
}
};
// ---------------------------------------------------------------------------
SLANG_FORCE_INLINE UnownedStringSlice Token::getContent() const
{
return (flags & TokenFlag::Name) ? charsNameUnion.name->text.getUnownedSlice() : UnownedStringSlice(charsNameUnion.chars, charsCount);
}
// ---------------------------------------------------------------------------
SLANG_FORCE_INLINE Name* Token::getName() const
{
return getNameOrNull();
}
// ---------------------------------------------------------------------------
SLANG_FORCE_INLINE Name* Token::getNameOrNull() const
{
return (flags & TokenFlag::Name) ? charsNameUnion.name : nullptr;
}
// ---------------------------------------------------------------------------
SLANG_FORCE_INLINE void Token::setContent(const UnownedStringSlice& content)
{
flags &= ~TokenFlag::Name;
charsNameUnion.chars = content.begin();
charsCount = uint32_t(content.getLength());
}
// ---------------------------------------------------------------------------
SLANG_FORCE_INLINE void Token::setName(Name* inName)
{
SLANG_ASSERT(inName);
flags |= TokenFlag::Name;
charsNameUnion.name = inName;
charsCount = uint32_t(inName->text.getLength());
}
} // namespace Slang
#endif