Esempio n. 1
0
        public static unsafe int WriteAsPtr <T>(this MemoryStream stream, T value)
        {
            var size = TypeHelper <T> .Size;

            if (size <= 0)
            {
                throw new InvalidOperationException("This method should only be used for writing fixed-size types to a stream");
            }
            // NB do not use a buffer pool here but instead use a thread-static buffer
            // that will grow to maximum size of a type. Fixed-size types are usually small.
            // Take/return is more expensive than the work we do with the pool here.
            using (var wrapper = RecyclableMemoryManager.GetBuffer(size))
            {
                var threadStaticBuffer = wrapper.Buffer;
                fixed(byte *ptr = &threadStaticBuffer[0])
                {
                    var buffer = new DirectBuffer(threadStaticBuffer.Length, (IntPtr)ptr);

                    TypeHelper <T> .Write(value, ref buffer);
                }

                stream.Write(threadStaticBuffer, 0, size);
            }
            // NB this is not needed as long as converter.Write guarantees overwriting all Size bytes.
            // //Array.Clear(_buffer, 0, size);
            return(size);
        }