/*
         * public static void Array16LoadBigEndian64(out Array16<ulong> output, byte[] input, int inputOffset)
         * {
         *  output.x0 = LoadBigEndian64(input, inputOffset + 0);
         *  output.x1 = LoadBigEndian64(input, inputOffset + 8);
         *  output.x2 = LoadBigEndian64(input, inputOffset + 16);
         *  output.x3 = LoadBigEndian64(input, inputOffset + 24);
         *  output.x4 = LoadBigEndian64(input, inputOffset + 32);
         *  output.x5 = LoadBigEndian64(input, inputOffset + 40);
         *  output.x6 = LoadBigEndian64(input, inputOffset + 48);
         *  output.x7 = LoadBigEndian64(input, inputOffset + 56);
         *  output.x8 = LoadBigEndian64(input, inputOffset + 64);
         *  output.x9 = LoadBigEndian64(input, inputOffset + 72);
         *  output.x10 = LoadBigEndian64(input, inputOffset + 80);
         *  output.x11 = LoadBigEndian64(input, inputOffset + 88);
         *  output.x12 = LoadBigEndian64(input, inputOffset + 96);
         *  output.x13 = LoadBigEndian64(input, inputOffset + 104);
         *  output.x14 = LoadBigEndian64(input, inputOffset + 112);
         *  output.x15 = LoadBigEndian64(input, inputOffset + 120);
         * }
         */

        /*
         * public static void Array16LoadLittleEndian32(out Array16<uint> output, byte[] input, int inputOffset)
         * {
         *  output.x0 = LoadLittleEndian32(input, inputOffset + 0);
         *  output.x1 = LoadLittleEndian32(input, inputOffset + 4);
         *  output.x2 = LoadLittleEndian32(input, inputOffset + 8);
         *  output.x3 = LoadLittleEndian32(input, inputOffset + 12);
         *  output.x4 = LoadLittleEndian32(input, inputOffset + 16);
         *  output.x5 = LoadLittleEndian32(input, inputOffset + 20);
         *  output.x6 = LoadLittleEndian32(input, inputOffset + 24);
         *  output.x7 = LoadLittleEndian32(input, inputOffset + 28);
         *  output.x8 = LoadLittleEndian32(input, inputOffset + 32);
         *  output.x9 = LoadLittleEndian32(input, inputOffset + 36);
         *  output.x10 = LoadLittleEndian32(input, inputOffset + 40);
         *  output.x11 = LoadLittleEndian32(input, inputOffset + 44);
         *  output.x12 = LoadLittleEndian32(input, inputOffset + 48);
         *  output.x13 = LoadLittleEndian32(input, inputOffset + 52);
         *  output.x14 = LoadLittleEndian32(input, inputOffset + 56);
         *  output.x15 = LoadLittleEndian32(input, inputOffset + 60);
         * }
         *
         * public static void Array16StoreLittleEndian32(byte[] output, int outputOffset, ref Array16<uint> input)
         * {
         *  StoreLittleEndian32(output, outputOffset + 0, input.x0);
         *  StoreLittleEndian32(output, outputOffset + 4, input.x1);
         *  StoreLittleEndian32(output, outputOffset + 8, input.x2);
         *  StoreLittleEndian32(output, outputOffset + 12, input.x3);
         *  StoreLittleEndian32(output, outputOffset + 16, input.x4);
         *  StoreLittleEndian32(output, outputOffset + 20, input.x5);
         *  StoreLittleEndian32(output, outputOffset + 24, input.x6);
         *  StoreLittleEndian32(output, outputOffset + 28, input.x7);
         *  StoreLittleEndian32(output, outputOffset + 32, input.x8);
         *  StoreLittleEndian32(output, outputOffset + 36, input.x9);
         *  StoreLittleEndian32(output, outputOffset + 40, input.x10);
         *  StoreLittleEndian32(output, outputOffset + 44, input.x11);
         *  StoreLittleEndian32(output, outputOffset + 48, input.x12);
         *  StoreLittleEndian32(output, outputOffset + 52, input.x13);
         *  StoreLittleEndian32(output, outputOffset + 56, input.x14);
         *  StoreLittleEndian32(output, outputOffset + 60, input.x15);
         * }
         */

        public static void WriteLittleEndian32(Span <byte> output, int outputOffset, ref Array16 <uint> input)
        {
            StoreLittleEndian32(output, outputOffset + 0, input.x0);
            StoreLittleEndian32(output, outputOffset + 4, input.x1);
            StoreLittleEndian32(output, outputOffset + 8, input.x2);
            StoreLittleEndian32(output, outputOffset + 12, input.x3);
            StoreLittleEndian32(output, outputOffset + 16, input.x4);
            StoreLittleEndian32(output, outputOffset + 20, input.x5);
            StoreLittleEndian32(output, outputOffset + 24, input.x6);
            StoreLittleEndian32(output, outputOffset + 28, input.x7);
            StoreLittleEndian32(output, outputOffset + 32, input.x8);
            StoreLittleEndian32(output, outputOffset + 36, input.x9);
            StoreLittleEndian32(output, outputOffset + 40, input.x10);
            StoreLittleEndian32(output, outputOffset + 44, input.x11);
            StoreLittleEndian32(output, outputOffset + 48, input.x12);
            StoreLittleEndian32(output, outputOffset + 52, input.x13);
            StoreLittleEndian32(output, outputOffset + 56, input.x14);
            StoreLittleEndian32(output, outputOffset + 60, input.x15);
        }
        /*
         * public static void Array16Copy(out Array16<uint> output, Array16<uint> input)
         * {
         *  output.x0 = input.x0;
         *  output.x1 = input.x1;
         *  output.x2 = input.x2;
         *  output.x3 = input.x3;
         *  output.x4 = input.x4;
         *  output.x5 = input.x5;
         *  output.x6 = input.x6;
         *  output.x7 = input.x7;
         *  output.x8 = input.x8;
         *  output.x9 = input.x9;
         *  output.x10 = input.x10;
         *  output.x11 = input.x11;
         *  output.x12 = input.x12;
         *  output.x13 = input.x13;
         *  output.x14 = input.x14;
         *  output.x15 = input.x15;
         * }
         */

        public static T[] Array16ToArray <T>(Array16 <T> input)
        {
            var output = new T[16];

            output[0]  = input.x0;
            output[1]  = input.x1;
            output[2]  = input.x2;
            output[3]  = input.x3;
            output[4]  = input.x4;
            output[5]  = input.x5;
            output[6]  = input.x6;
            output[7]  = input.x7;
            output[8]  = input.x8;
            output[9]  = input.x9;
            output[10] = input.x10;
            output[11] = input.x11;
            output[12] = input.x12;
            output[13] = input.x13;
            output[14] = input.x14;
            output[15] = input.x15;
            return(output);
        }
        /*
         * public static ulong LoadBigEndian64(byte[] buf, int offset)
         * {
         *  return
         *      (ulong)(buf[offset + 7])
         | (((ulong)(buf[offset + 6])) << 8)
         | (((ulong)(buf[offset + 5])) << 16)
         | (((ulong)(buf[offset + 4])) << 24)
         | (((ulong)(buf[offset + 3])) << 32)
         | (((ulong)(buf[offset + 2])) << 40)
         | (((ulong)(buf[offset + 1])) << 48)
         | (((ulong)(buf[offset + 0])) << 56);
         | }
         |
         | public static void StoreBigEndian64(byte[] buf, int offset, ulong value)
         | {
         |  buf[offset + 7] = unchecked((byte)value);
         |  buf[offset + 6] = unchecked((byte)(value >> 8));
         |  buf[offset + 5] = unchecked((byte)(value >> 16));
         |  buf[offset + 4] = unchecked((byte)(value >> 24));
         |  buf[offset + 3] = unchecked((byte)(value >> 32));
         |  buf[offset + 2] = unchecked((byte)(value >> 40));
         |  buf[offset + 1] = unchecked((byte)(value >> 48));
         |  buf[offset + 0] = unchecked((byte)(value >> 56));
         | }
         */

        /*public static void XorLittleEndian32(byte[] buf, int offset, uint value)
         * {
         *  buf[offset + 0] ^= (byte)value;
         *  buf[offset + 1] ^= (byte)(value >> 8);
         *  buf[offset + 2] ^= (byte)(value >> 16);
         *  buf[offset + 3] ^= (byte)(value >> 24);
         * }*/

        /*public static void XorLittleEndian32(byte[] output, int outputOffset, byte[] input, int inputOffset, uint value)
         * {
         *  output[outputOffset + 0] = (byte)(input[inputOffset + 0] ^ value);
         *  output[outputOffset + 1] = (byte)(input[inputOffset + 1] ^ (value >> 8));
         *  output[outputOffset + 2] = (byte)(input[inputOffset + 2] ^ (value >> 16));
         *  output[outputOffset + 3] = (byte)(input[inputOffset + 3] ^ (value >> 24));
         * }*/

        #endregion

        #region Array8

        /*
         * public static void Array8LoadLittleEndian32(out Array8<uint> output, byte[] input, int inputOffset)
         * {
         *  output.x0 = LoadLittleEndian32(input, inputOffset + 0);
         *  output.x1 = LoadLittleEndian32(input, inputOffset + 4);
         *  output.x2 = LoadLittleEndian32(input, inputOffset + 8);
         *  output.x3 = LoadLittleEndian32(input, inputOffset + 12);
         *  output.x4 = LoadLittleEndian32(input, inputOffset + 16);
         *  output.x5 = LoadLittleEndian32(input, inputOffset + 20);
         *  output.x6 = LoadLittleEndian32(input, inputOffset + 24);
         *  output.x7 = LoadLittleEndian32(input, inputOffset + 28);
         * }
         *
         * public static void Array8StoreLittleEndian32(byte[] output, int outputOffset, ref Array8<uint> input)
         * {
         *  StoreLittleEndian32(output, outputOffset + 0, input.x0);
         *  StoreLittleEndian32(output, outputOffset + 4, input.x1);
         *  StoreLittleEndian32(output, outputOffset + 8, input.x2);
         *  StoreLittleEndian32(output, outputOffset + 12, input.x3);
         *  StoreLittleEndian32(output, outputOffset + 16, input.x4);
         *  StoreLittleEndian32(output, outputOffset + 20, input.x5);
         *  StoreLittleEndian32(output, outputOffset + 24, input.x6);
         *  StoreLittleEndian32(output, outputOffset + 28, input.x7);
         * }
         */

        public static void Array8StoreLittleEndian32(byte[] output, int outputOffset, ref Array16 <uint> input)
        {
            StoreLittleEndian32(output, outputOffset + 0, input.x0);
            StoreLittleEndian32(output, outputOffset + 4, input.x1);
            StoreLittleEndian32(output, outputOffset + 8, input.x2);
            StoreLittleEndian32(output, outputOffset + 12, input.x3);
            StoreLittleEndian32(output, outputOffset + 16, input.x4);
            StoreLittleEndian32(output, outputOffset + 20, input.x5);
            StoreLittleEndian32(output, outputOffset + 24, input.x6);
            StoreLittleEndian32(output, outputOffset + 28, input.x7);
        }