diff options
Diffstat (limited to 'src/sksl/ir/SkSLProgram.h')
-rw-r--r-- | src/sksl/ir/SkSLProgram.h | 129 |
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 |