Пример #1
0
        public void Append <T>(T value)
        {
            var s = UnsafeAPI.SizeOf <T>();

            EnsureCapacity(Length + s);
            UnsafeAPI.Write <T>(this.data, Length, value);
            Length += s;
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
 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");
     }
 }
Пример #4
0
        /// <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");
            }
        }
Пример #5
0
        /// <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");
            }
        }
Пример #6
0
 public T Read <T>(int offset)
 {
     return(UnsafeAPI.Read <T>(this.data, offset));
 }