public void Deinitialize(nint count)
        {
            unsafe
            {
                fixed(byte *ptr = SwiftData)
                {
                    var actualPtr = Marshal.ReadIntPtr(new IntPtr(ptr));

                    NativeMethodsForUnsafeMutablePointer.Deinitialize(actualPtr, count, StructMarshal.Marshaler.Metatypeof(typeof(T)));
                }
            }
        }
        public static UnsafeMutablePointer <T> Allocate(nint capacity)
        {
            unsafe {
                var self = new UnsafeMutablePointer <T> ();
                fixed(byte *ptr = self.SwiftData)
                {
                    var actualPtr = new IntPtr(ptr);

                    NativeMethodsForUnsafeMutablePointer.Allocate(actualPtr, capacity, StructMarshal.Marshaler.Metatypeof(typeof(T)));
                }

                return(self);
            }
        }
        public void Initialize(T repeating, nint count)
        {
            unsafe
            {
                fixed(byte *ptr = SwiftData)
                {
                    var actualPtr = Marshal.ReadIntPtr(new IntPtr(ptr));
                    var valPtr    = stackalloc byte [StructMarshal.Marshaler.Strideof(typeof(T))];
                    var valIntPtr = new IntPtr(valPtr);

                    valIntPtr = StructMarshal.Marshaler.ToSwift(repeating, valIntPtr);
                    NativeMethodsForUnsafeMutablePointer.Initialize(actualPtr, valIntPtr, count, StructMarshal.Marshaler.Metatypeof(typeof(T)));
                    StructMarshal.Marshaler.ReleaseSwiftPointer(typeof(T), valIntPtr);
                }
            }
        }
Example #4
0
        // "Why," you may ask, "is it that I'm using the same P/Invokes for UnsafePointer and UnsafeMutablePointer?"
        // Because it's just pointer arithmetic. The difference between them is that UnsafeMutablePointer has set methods.
        // The actual representation is identical: a pointer
        public UnsafePointer <T> Advance(nint by)
        {
            var retval = new UnsafePointer <T> ();

            unsafe
            {
                fixed(byte *ptr = SwiftData)
                {
                    var actualPtr = Marshal.ReadIntPtr(new IntPtr(ptr));

                    fixed(byte *retvalPtr = StructMarshal.Marshaler.PrepareNominal(retval))
                    {
                        NativeMethodsForUnsafeMutablePointer.Advance(new IntPtr(retvalPtr), actualPtr, by, StructMarshal.Marshaler.Metatypeof(typeof(T)));
                    }
                }
            }
            return(retval);
        }