X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2FUtil.java;fp=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2FUtil.java;h=6f1b93ff92fb4087bb16c8692eeb7e8052bf714f;hb=a4c5cfb856026771dfcf31eb22434b8b6ff20ad4;hp=0000000000000000000000000000000000000000;hpb=7199371e42ba04d2daab9f8512fdf25bd5f5ff92;p=Mograsim.git diff --git a/era.mi/src/era/mi/logic/Util.java b/era.mi/src/era/mi/logic/Util.java new file mode 100644 index 00000000..6f1b93ff --- /dev/null +++ b/era.mi/src/era/mi/logic/Util.java @@ -0,0 +1,92 @@ +package era.mi.logic; + +import java.util.Arrays; + +public final class Util +{ + + @SuppressWarnings("unchecked") + public static T[] concat(T[]... arrays) + { + if(arrays.length == 0) + throw new IllegalArgumentException("Cannot concatenate 0 arrays."); + + int length = 0; + 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++) + { + System.arraycopy(arrays[i], 0, newArray, appendIndex, arrays[i].length); + appendIndex += arrays[i].length; + } + + return newArray; + } + +// @SuppressWarnings("unchecked") +// public static T[][] split(T[] array, int... lengths) +// { +// //TODO: implement array split again; This version contains an illegal cast +// int totalLength = 0; +// for(int length : lengths) +// totalLength += length; +// +// if(totalLength != array.length) +// throw new IllegalArgumentException(); //TODO: add proper error message +// +// Object[][] newArray = new Object[lengths.length][]; +// int splitIndex = 0; +// for(int i = 0; i < lengths.length; i++) +// { +// System.arraycopy(array, splitIndex, newArray, 0, lengths[i]); +// splitIndex += lengths[i]; +// } +// +// return (T[][]) newArray; +// } + + public static Bit[] and(Bit[] a, Bit[] b) + { + return binBitOp(a, b, (bA, bB) -> Bit.and(bA, bB)); + } + + public static Bit[] or(Bit[] a, Bit[] b) + { + return binBitOp(a, b, (bA, bB) -> Bit.or(bA, bB)); + } + + public static Bit[] xor(Bit[] a, Bit[] b) + { + return binBitOp(a, b, (bA, bB) -> Bit.xor(bA, bB)); + } + + private static Bit[] binBitOp(Bit[] a, Bit[] b, BitOp op) + { + 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++) + { + 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++) + { + out[i] = a[i].not(); + } + return out; + } + + interface BitOp + { + Bit execute(Bit a, Bit b); + } +}