C++: Optimize cc_shared_library

1. Don't pop from the front of the list being iterated on
2. Don't visit the same node_label more than once

RELNOTES:none
PiperOrigin-RevId: 307610981
Change-Id: I9b35a27a1bdabafbe290d1ff23eeb4659b07d554
diff --git a/examples/experimental_cc_shared_library.bzl b/examples/experimental_cc_shared_library.bzl
index 90b1cf5..7b62d21 100644
--- a/examples/experimental_cc_shared_library.bzl
+++ b/examples/experimental_cc_shared_library.bzl
@@ -55,18 +55,26 @@
     link_statically_labels = {}
     link_dynamically_labels = {}
 
-    # Horrible I know. Perhaps Starlark team gives me a way to prune a tree.
-    for i in range(1, 2147483647):
-        if len(all_children) == 0:
-            break
-        node = all_children.pop(0)
+    seen_labels = {}
 
+    # Horrible I know. Perhaps Starlark team gives me a way to prune a tree.
+    for i in range(2147483647):
+        if i == len(all_children):
+            break
+
+        node = all_children[i]
         node_label = str(node.label)
+
+        if node_label in seen_labels:
+            continue
+        seen_labels[node_label] = True
+
         if node_label in can_be_linked_dynamically:
             link_dynamically_labels[node_label] = True
         elif node_label not in preloaded_deps_direct_labels:
             link_statically_labels[node_label] = node.linkable_more_than_once
             all_children.extend(node.children)
+
     return (link_statically_labels, link_dynamically_labels)
 
 def _create_linker_context(ctx, linker_inputs):