X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2FUtil.java;h=d621a44c69de41eeb9c3a9eceb8f4a615b2998f0;hb=dcbba0b189fd37135adc4487f1b8b645e7045bc4;hp=6f1b93ff92fb4087bb16c8692eeb7e8052bf714f;hpb=a4c5cfb856026771dfcf31eb22434b8b6ff20ad4;p=Mograsim.git diff --git a/era.mi/src/era/mi/logic/Util.java b/era.mi/src/era/mi/logic/Util.java index 6f1b93ff..d621a44c 100644 --- a/era.mi/src/era/mi/logic/Util.java +++ b/era.mi/src/era/mi/logic/Util.java @@ -2,27 +2,29 @@ package era.mi.logic; import java.util.Arrays; +import era.mi.logic.types.Bit; + public final class Util { - + @SuppressWarnings("unchecked") public static T[] concat(T[]... arrays) { - if(arrays.length == 0) + if (arrays.length == 0) throw new IllegalArgumentException("Cannot concatenate 0 arrays."); - + int length = 0; - for(T[] array : arrays) + for (T[] array : arrays) length += array.length; - + T[] newArray = Arrays.copyOf(arrays[0], length); int appendIndex = arrays[0].length; - for(int i = 1; i < arrays.length; i++) + for (int i = 1; i < arrays.length; i++) { System.arraycopy(arrays[i], 0, newArray, appendIndex, arrays[i].length); appendIndex += arrays[i].length; } - + return newArray; } @@ -47,44 +49,60 @@ public final class Util // // return (T[][]) newArray; // } - + public static Bit[] and(Bit[] a, Bit[] b) { - return binBitOp(a, b, (bA, bB) -> Bit.and(bA, bB)); + return binBitOp(a, b, Bit::and); } - + public static Bit[] or(Bit[] a, Bit[] b) { - return binBitOp(a, b, (bA, bB) -> Bit.or(bA, bB)); + return binBitOp(a, b, Bit::or); } - + public static Bit[] xor(Bit[] a, Bit[] b) { - return binBitOp(a, b, (bA, bB) -> Bit.xor(bA, bB)); + return binBitOp(a, b, Bit::xor); } - + private static Bit[] binBitOp(Bit[] a, Bit[] b, BitOp op) { - if(a.length != b.length) + if (a.length != b.length) throw new IllegalArgumentException("Bit Arrays were not of equal length."); Bit[] out = new Bit[a.length]; - for(int i = 0; i < a.length; i++) + for (int i = 0; i < a.length; i++) { out[i] = op.execute(a[i], b[i]); } return out; } - + public static Bit[] not(Bit[] a) { Bit[] out = new Bit[a.length]; - for(int i = 0; i < a.length; i++) + for (int i = 0; i < a.length; i++) { out[i] = a[i].not(); } return out; } - + + /** + * uses the {@link Bit#combineWith(Bit)} method, does not create a new array, the result is stored in the first array. + * + * @author Christian Femers + */ + public static Bit[] combineInto(Bit[] dest, Bit[] addition) + { + if (dest.length != addition.length) + throw new IllegalArgumentException("Bit Arrays were not of equal length."); + for (int i = 0; i < addition.length; i++) + { + dest[i] = dest[i].join(addition[i]); + } + return dest; + } + interface BitOp { Bit execute(Bit a, Bit b);