skia2/include/private/SkSLProgramElement.h
Ethan Nicholas c9e9131f44 Switched SkSL positions from int to Position
This CL switches almost all instances of line tracking over to track
Positions instead. This does not yet add full range support - only the
start offsets will be correct currently. Followup CLs will extend the
ranges to fully cover their nodes.

Change-Id: Ie49aee02f35dcb30a3adb8a35f3e4914ba6939d2
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/518137
Reviewed-by: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
2022-03-14 17:06:17 +00:00

78 lines
1.6 KiB
C++

/*
* 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 <memory>
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<T> to check the type of a program element.
* e.g. replace `el.kind() == ProgramElement::Kind::kExtension` with `el.is<Extension>()`.
*/
template <typename T>
bool is() const {
return this->kind() == T::kProgramElementKind;
}
/**
* Use as<T> to downcast program elements. e.g. replace `(Extension&) el` with
* `el.as<Extension>()`.
*/
template <typename T>
const T& as() const {
SkASSERT(this->is<T>());
return static_cast<const T&>(*this);
}
template <typename T>
T& as() {
SkASSERT(this->is<T>());
return static_cast<T&>(*this);
}
virtual std::unique_ptr<ProgramElement> clone() const = 0;
private:
using INHERITED = IRNode;
};
} // namespace SkSL
#endif