public void Append <T>(T value) { var s = UnsafeAPI.SizeOf <T>(); EnsureCapacity(Length + s); UnsafeAPI.Write <T>(this.data, Length, value); Length += s; }
/// <summary> /// Creates a new data accessor for an array of the given size /// </summary> /// <param name="size">The size of the array to create an accessor for</param> /// <returns>A new accessor</returns> public IDataAccessor <T> Create(long size) { IDataAccessor <T> result = null; if (UnsafeAPI.IsUnsafeSupported && !UnsafeAPI.DisableUnsafeAPI && !UnsafeAPI.DisableUnsafeArrays && (size * NATIVE_ELEMENT_SIZE) >= UnsafeAPI.UnsafeArraysLargerThan) { result = UnsafeAPI.CreateAccessor <T>(size); } return(result ?? new DefaultAccessor <T>(size)); }
private void ActivateFirstInst() { try { var ptr = UnsafeAPI.FindWindow(null, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name); if (ptr != IntPtr.Zero) { UnsafeAPI.SetForegroundWindow(ptr); if (UnsafeAPI.IsIconic(ptr)) { UnsafeAPI.OpenIcon(ptr); } } } catch (Exception ex) { log.Fatal(ex, "ActivateFirstInst"); } }
/// <summary> /// Helper function that performs a memcpy from unmanaged data to managed data /// </summary> /// <param name="source">The data source</param> /// <param name="target">The data target</param> /// <typeparam name="T">The type of data to copy</typeparam> public static void WriteArrayToPointer <T>(T[] source, IntPtr target) { if (!UnsafeAPI.CopyToIntPtr(source, target, source.Length)) { if (typeof(T) == typeof(NumCIL.Complex64.DataType)) { var t = (NumCIL.Complex64.DataType[])(object) target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(float)); for (var i = 0; i < source.Length; i++) { System.Runtime.InteropServices.Marshal.Copy(BitConverter.GetBytes(t[i].Real), 0, target, elsize); target += elsize; System.Runtime.InteropServices.Marshal.Copy(BitConverter.GetBytes(t[i].Imaginary), 0, target, elsize); target += elsize; } return; } else if (typeof(T) == typeof(System.Numerics.Complex)) { var t = (System.Numerics.Complex[])(object) target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(double)); for (var i = 0; i < source.Length; i++) { System.Runtime.InteropServices.Marshal.Copy(BitConverter.GetBytes(t[i].Real), 0, target, elsize); target += elsize; System.Runtime.InteropServices.Marshal.Copy(BitConverter.GetBytes(t[i].Imaginary), 0, target, elsize); target += elsize; } return; } else if (typeof(T) == typeof(byte)) { System.Runtime.InteropServices.Marshal.Copy((byte[])(object)source, 0, target, source.Length); return; } else if (typeof(T) == typeof(sbyte)) { var t = (sbyte[])(object)target; for (var i = 0; i < source.Length; i++) { System.Runtime.InteropServices.Marshal.Copy(BitConverter.GetBytes(t[i]), 0, target, 1); target += 1; } } else if (typeof(T) == typeof(short)) { System.Runtime.InteropServices.Marshal.Copy((short[])(object)source, 0, target, source.Length); return; } else if (typeof(T) == typeof(ushort)) { var t = (ushort[])(object)target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(ushort)); for (var i = 0; i < source.Length; i++) { System.Runtime.InteropServices.Marshal.Copy(BitConverter.GetBytes(t[i]), 0, target, elsize); target += elsize; } return; } else if (typeof(T) == typeof(int)) { System.Runtime.InteropServices.Marshal.Copy((int[])(object)source, 0, target, source.Length); return; } else if (typeof(T) == typeof(uint)) { var t = (uint[])(object)target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(uint)); for (var i = 0; i < source.Length; i++) { System.Runtime.InteropServices.Marshal.Copy(BitConverter.GetBytes(t[i]), 0, target, elsize); target += elsize; } return; } else if (typeof(T) == typeof(long)) { System.Runtime.InteropServices.Marshal.Copy((long[])(object)source, 0, target, source.Length); return; } else if (typeof(T) == typeof(ulong)) { var t = (ulong[])(object)target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(ulong)); for (var i = 0; i < source.Length; i++) { System.Runtime.InteropServices.Marshal.Copy(BitConverter.GetBytes(t[i]), 0, target, elsize); target += elsize; } return; } else if (typeof(T) == typeof(float)) { System.Runtime.InteropServices.Marshal.Copy((float[])(object)source, 0, target, source.Length); return; } else if (typeof(T) == typeof(double)) { System.Runtime.InteropServices.Marshal.Copy((double[])(object)source, 0, target, source.Length); return; } else if (typeof(T) == typeof(bool)) { var t = (bool[])(object)target; for (var i = 0; i < source.Length; i++) { System.Runtime.InteropServices.Marshal.WriteByte(target, t[i] ? (byte)1 : (byte)0); target += 1; } return; } throw new Exception("No copy performed"); } }
/// <summary> /// Helper function that performs a memcpy from unmanaged data to managed data /// </summary> /// <param name="source">The data source</param> /// <param name="target">The data target</param> /// <typeparam name="T">The type of data to copy</typeparam> public static void WritePointerToArray <T>(IntPtr source, T[] target) { if (!UnsafeAPI.CopyFromIntPtr(source, target, target.Length)) { if (typeof(T) == typeof(NumCIL.Complex64.DataType)) { var t = (NumCIL.Complex64.DataType[])(object) target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(float)); var b = new byte[1000]; var rem = target.Length; var offset = 0; while (rem > 0) { var items = Math.Min(rem, 1000); System.Runtime.InteropServices.Marshal.Copy(source, b, 0, items * elsize * 2); var io = 0; for (var i = 0; i < items; i++) { t[offset++] = new NumCIL.Complex64.DataType( BitConverter.ToSingle(b, io), BitConverter.ToSingle(b, io + elsize) ); io += (elsize * 2); } source += items; rem -= items; } return; } else if (typeof(T) == typeof(System.Numerics.Complex)) { var t = (System.Numerics.Complex[])(object) target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(double)); var b = new byte[1000]; var rem = target.Length; var offset = 0; while (rem > 0) { var items = Math.Min(rem, 1000); System.Runtime.InteropServices.Marshal.Copy(source, b, 0, items * elsize * 2); var io = 0; for (var i = 0; i < items; i++) { t[offset++] = new System.Numerics.Complex( BitConverter.ToDouble(b, io), BitConverter.ToDouble(b, io + elsize) ); io += (elsize * 2); } source += items; rem -= items; } return; } else if (typeof(T) == typeof(byte)) { System.Runtime.InteropServices.Marshal.Copy(source, (byte[])(object)target, 0, target.Length); return; } else if (typeof(T) == typeof(sbyte)) { var t = (sbyte[])(object)target; var b = new byte[1000]; var rem = target.Length; var offset = 0; while (rem > 0) { var items = Math.Min(rem, 1000); System.Runtime.InteropServices.Marshal.Copy(source, b, 0, items); for (var i = 0; i < items; i++) { t[offset++] = (sbyte)b[i]; } source += items; rem -= items; } return; } else if (typeof(T) == typeof(short)) { System.Runtime.InteropServices.Marshal.Copy(source, (short[])(object)target, 0, target.Length); return; } else if (typeof(T) == typeof(ushort)) { var t = (ushort[])(object)target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(ushort)); var b = new byte[1000 * elsize]; var rem = target.Length; var offset = 0; while (rem > 0) { var items = Math.Min(rem, 1000); System.Runtime.InteropServices.Marshal.Copy(source, b, 0, items * elsize); for (var i = 0; i < items; i++) { t[offset++] = BitConverter.ToUInt16(b, i * elsize); } source += (items * elsize); rem -= items; } return; } else if (typeof(T) == typeof(int)) { System.Runtime.InteropServices.Marshal.Copy(source, (int[])(object)target, 0, target.Length); return; } else if (typeof(T) == typeof(uint)) { var t = (uint[])(object)target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(uint)); var b = new byte[1000 * elsize]; var rem = target.Length; var offset = 0; while (rem > 0) { var items = Math.Min(rem, 1000); System.Runtime.InteropServices.Marshal.Copy(source, b, 0, items * elsize); for (var i = 0; i < items; i++) { t[offset++] = BitConverter.ToUInt32(b, i * elsize); } source += (items * elsize); rem -= items; } return; } else if (typeof(T) == typeof(long)) { System.Runtime.InteropServices.Marshal.Copy(source, (long[])(object)target, 0, target.Length); return; } else if (typeof(T) == typeof(ulong)) { var t = (ulong[])(object)target; var elsize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(ulong)); var b = new byte[1000 * elsize]; var rem = target.Length; var offset = 0; while (rem > 0) { var items = Math.Min(rem, 1000); System.Runtime.InteropServices.Marshal.Copy(source, b, 0, items * elsize); for (var i = 0; i < items; i++) { t[offset++] = BitConverter.ToUInt64(b, i * elsize); } source += (items * elsize); rem -= items; } return; } else if (typeof(T) == typeof(float)) { System.Runtime.InteropServices.Marshal.Copy(source, (float[])(object)target, 0, target.Length); return; } else if (typeof(T) == typeof(double)) { System.Runtime.InteropServices.Marshal.Copy(source, (double[])(object)target, 0, target.Length); return; } else if (typeof(T) == typeof(bool)) { var t = (bool[])(object)target; var b = new byte[1000]; var rem = target.Length; var offset = 0; while (rem > 0) { var items = Math.Min(rem, 1000); System.Runtime.InteropServices.Marshal.Copy(source, b, 0, items); for (var i = 0; i < items; i++) { t[offset++] = b[i] != 0; } source += items; rem -= items; } return; } throw new Exception("No copy performed"); } }
public T Read <T>(int offset) { return(UnsafeAPI.Read <T>(this.data, offset)); }