// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Buffers;
using System.Collections.Generic;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Text;
namespace HordeCommon
{
///
/// Implements an unmarshlled view of a memory mapped file
///
unsafe class MemoryMappedFileView : IDisposable
{
sealed unsafe class MemoryWrapper : MemoryManager
{
private readonly byte* Pointer;
private readonly int Length;
public MemoryWrapper(byte* Pointer, int Length)
{
this.Pointer = Pointer;
this.Length = Length;
}
///
public override Span GetSpan() => new Span(Pointer, Length);
///
public override MemoryHandle Pin(int elementIndex) => new MemoryHandle(Pointer + elementIndex);
///
public override void Unpin() { }
///
protected override void Dispose(bool disposing) { }
}
MemoryMappedViewAccessor MemoryMappedViewAccessor;
byte* Data;
///
/// Constructor
///
///
public MemoryMappedFileView(MemoryMappedViewAccessor MemoryMappedViewAccessor)
{
this.MemoryMappedViewAccessor = MemoryMappedViewAccessor;
MemoryMappedViewAccessor.SafeMemoryMappedViewHandle.AcquirePointer(ref Data);
}
///
/// Gets a memory object for the given range
///
///
///
///
public Memory GetMemory(long Offset, int Length)
{
MemoryWrapper Wrapper = new MemoryWrapper(Data + Offset, Length);
return Wrapper.Memory;
}
///
public void Dispose()
{
if (Data != null)
{
MemoryMappedViewAccessor.SafeMemoryMappedViewHandle.ReleasePointer();
Data = null;
}
}
}
}