소스 검색

Remove the struct-based iterator for RepeatedField.

We don't use it in the runtime or generated code anywhere now, so the extra small performance boost isn't as critical, and it has some undesirable consequences.

The tests have needed to change as iterator block enumerators don't throw when we might expect them to.
Jon Skeet 10 년 전
부모
커밋
78b452b7ac
2개의 변경된 파일6개의 추가작업 그리고 63개의 파일을 삭제
  1. 0 6
      csharp/src/ProtocolBuffers.Test/Collections/RepeatedFieldTest.cs
  2. 6 57
      csharp/src/ProtocolBuffers/Collections/RepeatedField.cs

+ 0 - 6
csharp/src/ProtocolBuffers.Test/Collections/RepeatedFieldTest.cs

@@ -241,18 +241,12 @@ namespace Google.Protobuf.Collections
             var list = new RepeatedField<string> { "first", "second" };
             using (var enumerator = list.GetEnumerator())
             {
-                Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
                 Assert.IsTrue(enumerator.MoveNext());
                 Assert.AreEqual("first", enumerator.Current);
                 Assert.IsTrue(enumerator.MoveNext());
                 Assert.AreEqual("second", enumerator.Current);
                 Assert.IsFalse(enumerator.MoveNext());
-                Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
                 Assert.IsFalse(enumerator.MoveNext());
-                enumerator.Reset();
-                Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
-                Assert.IsTrue(enumerator.MoveNext());
-                Assert.AreEqual("first", enumerator.Current);
             }
         }
 

+ 6 - 57
csharp/src/ProtocolBuffers/Collections/RepeatedField.cs

@@ -288,14 +288,12 @@ namespace Google.Protobuf.Collections
             }
         }
 
-        public RepeatedField<T>.Enumerator GetEnumerator()
+        public IEnumerator<T> GetEnumerator()
         {
-            return new Enumerator(this);
-        }
-
-        IEnumerator<T> IEnumerable<T>.GetEnumerator()
-        {
-            return GetEnumerator();
+            for (int i = 0; i < count; i++)
+            {
+                yield return array[i];
+            }
         }
 
         public override bool Equals(object obj)
@@ -467,55 +465,6 @@ namespace Google.Protobuf.Collections
             }
             Remove((T)value);
         }
-        #endregion
-
-        public struct Enumerator : IEnumerator<T>
-        {
-            private int index;
-            private readonly RepeatedField<T> field;
-
-            public Enumerator(RepeatedField<T> field)
-            {
-                this.field = field;
-                this.index = -1;
-            }
-
-            public bool MoveNext()
-            {
-                if (index + 1 >= field.Count)
-                {
-                    index = field.Count;
-                    return false;
-                }
-                index++;
-                return true;
-            }
-
-            public void Reset()
-            {
-                index = -1;
-            }
-
-            public T Current
-            {
-                get
-                {
-                    if (index == -1 || index >= field.count)
-                    {
-                        throw new InvalidOperationException();
-                    }
-                    return field.array[index];
-                }
-            }
-
-            object IEnumerator.Current
-            {
-                get { return Current; }
-            }
-
-            public void Dispose()
-            {
-            }
-        }
+        #endregion        
     }
 }