1 module esstool.arrayutil; 2 3 import esstool.errors; 4 5 T[] copy(T)(T[] origin, int start, int end) 6 { 7 if (end < start) 8 throw new IllegalArgumentError("The end cannot bigger than start!"); 9 10 if (end > len(origin)) 11 throw new IllegalArgumentError("The end cannot bigger than arror origin!"); 12 13 return origin[start .. end]; 14 } 15 16 T[] copy(T)(T[] origin) 17 { 18 return copy(origin, 0, len(origin)); 19 } 20 21 void copyTo(T)(T[] origin, T[] target, int start, int end) 22 { 23 if (end < start) 24 throw new IllegalArgumentError("The end cannot bigger than start!"); 25 26 if (end > len(origin)) 27 throw new IllegalArgumentError("The end cannot bigger than arror origin!"); 28 29 target[0 .. end - start] = origin[start .. end]; 30 } 31 32 void copyTo(T)(T[] origin, T[] target) 33 { 34 copyTo(origin, target, 0, len(origin)); 35 } 36 37 T[] expandAndInsert(T)(T[] arr, T obj, int index, T empty = null) 38 { 39 if (len(arr) <= index) 40 { 41 int count = index - (len(arr) - 1); 42 for (int i = 0; i < count; i++) 43 { 44 arr ~= empty; 45 } 46 } 47 48 arr[index] = obj; 49 50 return arr; 51 } 52 53 T[] expandAndFill(T)(T[] arr, T obj, int index) 54 { 55 return expandAndInsert(arr = arr, obj = obj, index = index, empty = obj); 56 } 57 58 bool contains(T)(T[] array, T obj) 59 { 60 foreach (T o; array) 61 { 62 if (o == obj) 63 { 64 return true; 65 } 66 } 67 68 return false; 69 } 70 71 int len(T)(T[] obj) 72 { 73 import std.conv : to; 74 75 return to!int(obj.length); 76 } 77 78 int count(T)(T[] obj) 79 { 80 import std.typecons; 81 82 int counter = 0; 83 foreach (T o; obj) 84 { 85 auto j = o.nullable; 86 if (!j.isNull) 87 { 88 counter++; 89 } 90 } 91 92 return counter; 93 }