Pārlūkot izejas kodu

Fix problem reading certian arrays into an enumerable using Convert.ate

Billy Barrow 1 gadu atpakaļ
vecāks
revīzija
3a408ae4ae

+ 7 - 3
src/lib/Collections/BinaryData.vala

@@ -68,7 +68,7 @@ namespace Invercargill {
         }
 
         public void append_byte_array(uint8[] data) {
-            append(ate(data.copy()));
+            append(ate(data));
         }
 
         public void append_bytes(Bytes data) {
@@ -80,7 +80,7 @@ namespace Invercargill {
         }
 
         public void prepend_byte_array(uint8[] data) {
-            prepend(ate(data.copy()));
+            prepend(ate(data));
         }
 
         public void prepend_bytes(Bytes data) {
@@ -448,9 +448,13 @@ namespace Invercargill {
                 throw new BinaryDataReadError.BUFFER_OVERFLOW("Encountered more data than requested");
             }
 
-            append_bytes(data);
+            var bin = new uint8[data.length];
+            Memory.copy(bin, data.get_data(), data.length);
+            append_byte_array(bin);
             amount -= data.length;
             return amount != 0;
+
+            //328893
         }
 
         public Enumerable<uint8> wrap(Enumerable<uint8> enumerable) {

+ 4 - 11
src/lib/Concrete/ArrayEnumerable.vala

@@ -6,19 +6,12 @@ namespace Invercargill {
         private T[] array;
 
         public ArrayEnumerable(T[] input) {
-            //  assert_false (typeof(T).is_value_type ());
-            array = input;
+            array = new T[input.length];
+            for(int i = 0; i < array.length; i++) {
+                safely_assign_to_array<T> (array, i, safely_read_array<T> (input, i));
+            }
         }
 
-        //  public override bool iterate_if (Invercargill.PredicateDelegate<T> handler) {
-        //      foreach (var item in array) {
-        //          if(!handler(item)) {
-        //              break;
-        //          }
-        //      }
-        //      return true;
-        //  }
-
         public override Tracker<T> get_tracker() {
             var i = 0;
             return new LambdaTracker<T>(

+ 16 - 0
src/tests/Integration/Arrays.vala

@@ -20,4 +20,20 @@ void array_tests() {
             assert(array[i] == i);
         }
     });
+
+    Test.add_func("/invercargill/convert/from_array", () => {
+        var num = 10000000;
+        var array = range(0, num).to_array();
+
+        var enumerable = ate(array);
+        assert_true(enumerable.count() == num);
+    });
+
+    Test.add_func("/invercargill/convert/from_array_static", () => {
+        var num = 10000000;
+        var array = new uint8[num];
+
+        var enumerable = ate(array);
+        assert_true(enumerable.count() == num);
+    });
 }

+ 14 - 0
src/tests/Integration/BinaryData.vala

@@ -3,6 +3,20 @@ using Invercargill.Convert;
 
 void binary_data_tests() {
 
+    Test.add_func("/invercargill/structure/binary_data/read_in", () => {
+
+        var large_p1 = new Bytes(range(0, 500000, 1).select<uint8>(i => (uint8)i).to_array());
+        var large_p2 = new Bytes(range(0, 500000, 1).select<uint8>(i => (uint8)i).to_array());
+
+        var data = new BinaryData();
+        size_t to_read = 1000000;
+
+        assert_true(data.read_in(large_p1, ref to_read));
+        assert_true(to_read == 500000);
+        assert_false(data.read_in(large_p2, ref to_read));
+        assert_true(to_read == 0);
+    });
+
     Test.add_func("/invercargill/structure/binary_data/endian_write_test", () => {
 
         uint64 u64 = 3292849078942343;