Revision control
++ // Copyright (C) 2021 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++
++ #ifndef QSSG_GLSLTYPES_H
++ #define QSSG_GLSLTYPES_H
++
++ //
++ // W A R N I N G
++ // -------------
++ //
++ // This file is not part of the Qt API. It exists purely as an
++ // implementation detail. This header file may change from version to
++ // version without notice, or even be removed.
++ //
++ // We mean it.
++ //
++
++ #include <QtQuick3DGlslParser/private/glsltype_p.h>
++ #include <QtQuick3DGlslParser/private/glslsymbol_p.h>
++ #include <QVector>
++ #include <QHash>
++ #include <QString>
++ #include <QStringList>
++
++ QT_BEGIN_NAMESPACE
++
++ namespace GLSL {
++
++ class Q_QUICK3DGLSLPARSER_EXPORT ScalarType: public Type
++ {
++ public:
++ const ScalarType *asScalarType() const override { return this; }
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT UndefinedType: public Type
++ {
++ public:
++ QString toString() const override { return QLatin1String("undefined"); }
++ const UndefinedType *asUndefinedType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT VoidType: public Type
++ {
++ public:
++ QString toString() const override { return QLatin1String("void"); }
++ const VoidType *asVoidType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT BoolType: public ScalarType
++ {
++ public:
++ QString toString() const override { return QLatin1String("bool"); }
++ const BoolType *asBoolType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT IntType: public ScalarType
++ {
++ public:
++ QString toString() const override { return QLatin1String("int"); }
++ const IntType *asIntType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT UIntType: public ScalarType
++ {
++ public:
++ QString toString() const override { return QLatin1String("uint"); }
++ const UIntType *asUIntType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT FloatType: public ScalarType
++ {
++ public:
++ QString toString() const override { return QLatin1String("float"); }
++ const FloatType *asFloatType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT DoubleType: public ScalarType
++ {
++ public:
++ QString toString() const override { return QLatin1String("double"); }
++ const DoubleType *asDoubleType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++ };
++
++ // Type that can be indexed with the [] operator.
++ class Q_QUICK3DGLSLPARSER_EXPORT IndexType: public Type
++ {
++ public:
++ IndexType(const Type *indexElementType) : _indexElementType(indexElementType) {}
++
++ const Type *indexElementType() const { return _indexElementType; }
++
++ const IndexType *asIndexType() const override { return this; }
++
++ private:
++ const Type *_indexElementType;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT VectorType: public IndexType, public Scope
++ {
++ public:
++ VectorType(const Type *elementType, int dimension)
++ : IndexType(elementType), _dimension(dimension) {}
++
++ QString toString() const override;
++ const Type *elementType() const { return indexElementType(); }
++ int dimension() const { return _dimension; }
++
++ QList<Symbol *> members() const override { return _members.values(); }
++
++ void add(Symbol *symbol) override;
++ Symbol *find(const QString &name) const override;
++ const Type *type() const override { return this; }
++
++ const VectorType *asVectorType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++
++ private:
++ int _dimension;
++ QHash<QString, Symbol *> _members;
++
++ friend class Engine;
++
++ void populateMembers(Engine *engine);
++ void populateMembers(Engine *engine, const char *components);
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT MatrixType: public IndexType
++ {
++ public:
++ MatrixType(const Type *elementType, int columns, int rows, const Type *columnType)
++ : IndexType(columnType), _elementType(elementType), _columns(columns), _rows(rows) {}
++
++ const Type *elementType() const { return _elementType; }
++ const Type *columnType() const { return indexElementType(); }
++ int columns() const { return _columns; }
++ int rows() const { return _rows; }
++
++ QString toString() const override;
++ const MatrixType *asMatrixType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++
++ private:
++ const Type *_elementType;
++ int _columns;
++ int _rows;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT ArrayType: public IndexType
++ {
++ public:
++ explicit ArrayType(const Type *elementType)
++ : IndexType(elementType) {}
++
++ const Type *elementType() const { return indexElementType(); }
++
++ QString toString() const override;
++ const ArrayType *asArrayType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT Struct: public Type, public Scope
++ {
++ public:
++ Struct(Scope *scope = nullptr)
++ : Scope(scope) {}
++
++ QList<Symbol *> members() const override;
++ void add(Symbol *member) override;
++ Symbol *find(const QString &name) const override;
++
++ // as Type
++ QString toString() const override { return name(); }
++ const Struct *asStructType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++
++ // as Symbol
++ Struct *asStruct() override { return this; } // as Symbol
++ const Type *type() const override { return this; }
++
++ private:
++ QVector<Symbol *> _members;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT Function: public Type, public Scope
++ {
++ public:
++ Function(Scope *scope = nullptr)
++ : Scope(scope) {}
++
++ const Type *returnType() const;
++ void setReturnType(const Type *returnType);
++
++ QVector<Argument *> arguments() const;
++ void addArgument(Argument *arg);
++ int argumentCount() const;
++ Argument *argumentAt(int index) const;
++
++ // as Type
++ QString prettyPrint() const;
++ QString toString() const override;
++ const Function *asFunctionType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++
++ // as Symbol
++ Function *asFunction() override { return this; }
++ const Type *type() const override { return this; }
++
++ Symbol *find(const QString &name) const override;
++
++ QList<Symbol *> members() const override;
++ void add(Symbol *symbol) override {
++ if (! symbol)
++ return;
++ else if (Argument *arg = symbol->asArgument())
++ addArgument(arg);
++ }
++
++ private:
++ const Type *_returnType;
++ QVector<Argument *> _arguments;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT SamplerType: public Type
++ {
++ public:
++ explicit SamplerType(int kind) : _kind(kind) {}
++
++ // Kind of sampler as a token code; e.g. T_SAMPLER2D.
++ int kind() const { return _kind; }
++
++ QString toString() const override;
++ const SamplerType *asSamplerType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++
++ private:
++ int _kind;
++ };
++
++ class Q_QUICK3DGLSLPARSER_EXPORT OverloadSet: public Type, public Scope
++ {
++ public:
++ OverloadSet(Scope *enclosingScope = nullptr);
++
++ QVector<Function *> functions() const;
++ void addFunction(Function *function);
++
++ // as symbol
++ OverloadSet *asOverloadSet() override { return this; }
++ const Type *type() const override;
++ Symbol *find(const QString &name) const override;
++ void add(Symbol *symbol) override;
++
++ // as type
++ QString toString() const override { return QLatin1String("overload"); }
++ const OverloadSet *asOverloadSetType() const override { return this; }
++ bool isEqualTo(const Type *other) const override;
++ bool isLessThan(const Type *other) const override;
++
++ private:
++ QVector<Function *> _functions;
++ };
++
++ } // namespace GLSL
++
++ QT_END_NAMESPACE
++
++ #endif // QSSG_GLSLTYPES_H