Remove custom iterators from SkSL::Program

Instead, just expose the vector directly (as elements()).

Change-Id: I9f6a3ae38cd8e6f1b0a1087a42d61452fe883924
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/324130
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/sksl/SkSLMetalCodeGenerator.cpp b/src/sksl/SkSLMetalCodeGenerator.cpp
index 63dc6c7..b4ae66c 100644
--- a/src/sksl/SkSLMetalCodeGenerator.cpp
+++ b/src/sksl/SkSLMetalCodeGenerator.cpp
@@ -953,9 +953,9 @@
             this->write(", constant Uniforms& _uniforms [[buffer(" +
                         to_string(fUniformBuffer) + ")]]");
         }
-        for (const auto& e : fProgram) {
-            if (e.is<GlobalVarDeclaration>()) {
-                const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
+        for (const auto& e : fProgram.elements()) {
+            if (e->is<GlobalVarDeclaration>()) {
+                const GlobalVarDeclaration& decls = e->as<GlobalVarDeclaration>();
                 const VarDeclaration& var = *decls.fDecl;
                 if (var.fVar->type().typeKind() == Type::TypeKind::kSampler) {
                     if (var.fVar->modifiers().fLayout.fBinding < 0) {
@@ -980,8 +980,8 @@
                     this->write(to_string(var.fVar->modifiers().fLayout.fBinding));
                     this->write(")]]");
                 }
-            } else if (e.kind() == ProgramElement::Kind::kInterfaceBlock) {
-                InterfaceBlock& intf = (InterfaceBlock&) e;
+            } else if (e->is<InterfaceBlock>()) {
+                const InterfaceBlock& intf = e->as<InterfaceBlock>();
                 if ("sk_PerVertex" == intf.fTypeName) {
                     continue;
                 }
@@ -1392,9 +1392,9 @@
 }
 
 void MetalCodeGenerator::writeUniformStruct() {
-    for (const auto& e : fProgram) {
-        if (e.is<GlobalVarDeclaration>()) {
-            const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
+    for (const auto& e : fProgram.elements()) {
+        if (e->is<GlobalVarDeclaration>()) {
+            const GlobalVarDeclaration& decls = e->as<GlobalVarDeclaration>();
             const Variable& var = *decls.fDecl->fVar;
             if (var.modifiers().fFlags & Modifiers::kUniform_Flag &&
                 var.type().typeKind() != Type::TypeKind::kSampler) {
@@ -1425,9 +1425,9 @@
 
 void MetalCodeGenerator::writeInputStruct() {
     this->write("struct Inputs {\n");
-    for (const auto& e : fProgram) {
-        if (e.is<GlobalVarDeclaration>()) {
-            const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
+    for (const auto& e : fProgram.elements()) {
+        if (e->is<GlobalVarDeclaration>()) {
+            const GlobalVarDeclaration& decls = e->as<GlobalVarDeclaration>();
             const Variable& var = *decls.fDecl->fVar;
             if (var.modifiers().fFlags & Modifiers::kIn_Flag &&
                 -1 == var.modifiers().fLayout.fBuiltin) {
@@ -1458,9 +1458,9 @@
     } else if (fProgram.fKind == Program::kFragment_Kind) {
         this->write("    float4 sk_FragColor [[color(0)]];\n");
     }
-    for (const auto& e : fProgram) {
-        if (e.is<GlobalVarDeclaration>()) {
-            const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
+    for (const auto& e : fProgram.elements()) {
+        if (e->is<GlobalVarDeclaration>()) {
+            const GlobalVarDeclaration& decls = e->as<GlobalVarDeclaration>();
             const Variable& var = *decls.fDecl->fVar;
             if (var.modifiers().fFlags & Modifiers::kOut_Flag &&
                 -1 == var.modifiers().fLayout.fBuiltin) {
@@ -1492,9 +1492,9 @@
 
 void MetalCodeGenerator::writeInterfaceBlocks() {
     bool wroteInterfaceBlock = false;
-    for (const auto& e : fProgram) {
-        if (e.kind() == ProgramElement::Kind::kInterfaceBlock) {
-            this->writeInterfaceBlock(e.as<InterfaceBlock>());
+    for (const auto& e : fProgram.elements()) {
+        if (e->is<InterfaceBlock>()) {
+            this->writeInterfaceBlock(e->as<InterfaceBlock>());
             wroteInterfaceBlock = true;
         }
     }
@@ -1510,11 +1510,11 @@
     for (const auto& [interfaceType, interfaceName] : fInterfaceBlockNameMap) {
         visitor->VisitInterfaceBlock(*interfaceType, interfaceName);
     }
-    for (const ProgramElement& element : fProgram) {
-        if (!element.is<GlobalVarDeclaration>()) {
+    for (const auto& element : fProgram.elements()) {
+        if (!element->is<GlobalVarDeclaration>()) {
             continue;
         }
-        const GlobalVarDeclaration& decls = element.as<GlobalVarDeclaration>();
+        const GlobalVarDeclaration& decls = element->as<GlobalVarDeclaration>();
         const VarDeclaration& decl = *decls.fDecl;
         const Variable& var = *decl.fVar;
         if ((!var.modifiers().fFlags && -1 == var.modifiers().fLayout.fBuiltin) ||
@@ -1809,9 +1809,9 @@
     auto found = fRequirements.find(&f);
     if (found == fRequirements.end()) {
         fRequirements[&f] = kNo_Requirements;
-        for (const auto& e : fProgram) {
-            if (e.kind() == ProgramElement::Kind::kFunction) {
-                const FunctionDefinition& def = e.as<FunctionDefinition>();
+        for (const auto& e : fProgram.elements()) {
+            if (e->is<FunctionDefinition>()) {
+                const FunctionDefinition& def = e->as<FunctionDefinition>();
                 if (&def.fDeclaration == &f) {
                     Requirements reqs = this->requirements(def.fBody.get());
                     fRequirements[&f] = reqs;
@@ -1835,8 +1835,8 @@
     this->writeGlobalStruct();
     StringStream body;
     fOut = &body;
-    for (const auto& e : fProgram) {
-        this->writeProgramElement(e);
+    for (const auto& e : fProgram.elements()) {
+        this->writeProgramElement(*e);
     }
     fOut = rawOut;