aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sksl/ir/SkSLProgram.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/sksl/ir/SkSLProgram.h')
-rw-r--r--src/sksl/ir/SkSLProgram.h129
1 files changed, 126 insertions, 3 deletions
diff --git a/src/sksl/ir/SkSLProgram.h b/src/sksl/ir/SkSLProgram.h
index 03a94fa03f..1ad9fff78d 100644
--- a/src/sksl/ir/SkSLProgram.h
+++ b/src/sksl/ir/SkSLProgram.h
@@ -101,6 +101,92 @@ struct Program {
}
};
+ class iterator {
+ public:
+ ProgramElement& operator*() {
+ if (fIter1 != fEnd1) {
+ return **fIter1;
+ }
+ return **fIter2;
+ }
+
+ iterator& operator++() {
+ if (fIter1 != fEnd1) {
+ ++fIter1;
+ return *this;
+ }
+ ++fIter2;
+ return *this;
+ }
+
+ bool operator==(const iterator& other) const {
+ return fIter1 == other.fIter1 && fIter2 == other.fIter2;
+ }
+
+ bool operator!=(const iterator& other) const {
+ return !(*this == other);
+ }
+
+ private:
+ using inner = std::vector<std::unique_ptr<ProgramElement>>::iterator;
+
+ iterator(inner begin1, inner end1, inner begin2, inner end2)
+ : fIter1(begin1)
+ , fEnd1(end1)
+ , fIter2(begin2)
+ , fEnd2(end2) {}
+
+ inner fIter1;
+ inner fEnd1;
+ inner fIter2;
+ inner fEnd2;
+
+ friend struct Program;
+ };
+
+ class const_iterator {
+ public:
+ const ProgramElement& operator*() {
+ if (fIter1 != fEnd1) {
+ return **fIter1;
+ }
+ return **fIter2;
+ }
+
+ const_iterator& operator++() {
+ if (fIter1 != fEnd1) {
+ ++fIter1;
+ return *this;
+ }
+ ++fIter2;
+ return *this;
+ }
+
+ bool operator==(const const_iterator& other) const {
+ return fIter1 == other.fIter1 && fIter2 == other.fIter2;
+ }
+
+ bool operator!=(const const_iterator& other) const {
+ return !(*this == other);
+ }
+
+ private:
+ using inner = std::vector<std::unique_ptr<ProgramElement>>::const_iterator;
+
+ const_iterator(inner begin1, inner end1, inner begin2, inner end2)
+ : fIter1(begin1)
+ , fEnd1(end1)
+ , fIter2(begin2)
+ , fEnd2(end2) {}
+
+ inner fIter1;
+ inner fEnd1;
+ inner fIter2;
+ inner fEnd2;
+
+ friend struct Program;
+ };
+
enum Kind {
kFragment_Kind,
kVertex_Kind,
@@ -113,6 +199,7 @@ struct Program {
std::unique_ptr<String> source,
Settings settings,
std::shared_ptr<Context> context,
+ std::vector<std::unique_ptr<ProgramElement>>* inheritedElements,
std::vector<std::unique_ptr<ProgramElement>> elements,
std::shared_ptr<SymbolTable> symbols,
Inputs inputs)
@@ -121,8 +208,41 @@ struct Program {
, fSettings(settings)
, fContext(context)
, fSymbols(symbols)
- , fElements(std::move(elements))
- , fInputs(inputs) {}
+ , fInputs(inputs)
+ , fInheritedElements(inheritedElements)
+ , fElements(std::move(elements)) {}
+
+ iterator begin() {
+ if (fInheritedElements) {
+ return iterator(fInheritedElements->begin(), fInheritedElements->end(),
+ fElements.begin(), fElements.end());
+ }
+ return iterator(fElements.begin(), fElements.end(), fElements.end(), fElements.end());
+ }
+
+ iterator end() {
+ if (fInheritedElements) {
+ return iterator(fInheritedElements->end(), fInheritedElements->end(),
+ fElements.end(), fElements.end());
+ }
+ return iterator(fElements.end(), fElements.end(), fElements.end(), fElements.end());
+ }
+
+ const_iterator begin() const {
+ if (fInheritedElements) {
+ return const_iterator(fInheritedElements->begin(), fInheritedElements->end(),
+ fElements.begin(), fElements.end());
+ }
+ return const_iterator(fElements.begin(), fElements.end(), fElements.end(), fElements.end());
+ }
+
+ const_iterator end() const {
+ if (fInheritedElements) {
+ return const_iterator(fInheritedElements->end(), fInheritedElements->end(),
+ fElements.end(), fElements.end());
+ }
+ return const_iterator(fElements.end(), fElements.end(), fElements.end(), fElements.end());
+ }
Kind fKind;
std::unique_ptr<String> fSource;
@@ -131,8 +251,11 @@ struct Program {
// it's important to keep fElements defined after (and thus destroyed before) fSymbols,
// because destroying elements can modify reference counts in symbols
std::shared_ptr<SymbolTable> fSymbols;
- std::vector<std::unique_ptr<ProgramElement>> fElements;
Inputs fInputs;
+
+private:
+ std::vector<std::unique_ptr<ProgramElement>>* fInheritedElements;
+ std::vector<std::unique_ptr<ProgramElement>> fElements;
};
} // namespace