/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SKSL_PROGRAMELEMENT #define SKSL_PROGRAMELEMENT #include "include/private/SkSLIRNode.h" #include namespace SkSL { /** * Represents a top-level element (e.g. function or global variable) in a program. */ class ProgramElement : public IRNode { public: enum class Kind { kExtension = 0, kFunction, kFunctionPrototype, kGlobalVar, kInterfaceBlock, kModifiers, kStructDefinition, kFirst = kExtension, kLast = kStructDefinition }; ProgramElement(Position pos, Kind kind) : INHERITED(pos, (int) kind) { SkASSERT(kind >= Kind::kFirst && kind <= Kind::kLast); } Kind kind() const { return (Kind) fKind; } /** * Use is to check the type of a program element. * e.g. replace `el.kind() == ProgramElement::Kind::kExtension` with `el.is()`. */ template bool is() const { return this->kind() == T::kProgramElementKind; } /** * Use as to downcast program elements. e.g. replace `(Extension&) el` with * `el.as()`. */ template const T& as() const { SkASSERT(this->is()); return static_cast(*this); } template T& as() { SkASSERT(this->is()); return static_cast(*this); } virtual std::unique_ptr clone() const = 0; private: using INHERITED = IRNode; }; } // namespace SkSL #endif