コード例 #1
0
ファイル: Unsafe.cs プロジェクト: BeauPrime/BeauUtil
        /// <summary>
        /// Returns the number of free bytes in the given arena.
        /// </summary>
        /// <param name="inArena"></param>
        /// <returns></returns>
        static public int ArenaFreeBytes(ArenaHandle inArena)
        {
            ArenaHeader *header = (ArenaHeader *)inArena.HeaderStart;

            if (header != null)
            {
                return((int)header->SizeRemaining);
            }
            return(0);
        }
コード例 #2
0
ファイル: Unsafe.cs プロジェクト: BeauPrime/BeauUtil
        /// <summary>
        /// Resets the given allocation arena.
        /// </summary>
        static public void ResetArena(ArenaHandle inArena)
        {
            ArenaHeader *header = (ArenaHeader *)inArena.HeaderStart;

            if (header != null)
            {
                header->SizeRemaining = header->Size;
                header->CurrentPtr    = header->StartPtr;
            }
        }
コード例 #3
0
ファイル: Unsafe.cs プロジェクト: BeauPrime/BeauUtil
        /// <summary>
        /// Returns the size of the given arena.
        /// </summary>
        static public int ArenaSize(ArenaHandle inArena)
        {
            ArenaHeader *header = (ArenaHeader *)inArena.HeaderStart;

            if (header != null)
            {
                return((int)header->Size);
            }
            return(0);
        }
コード例 #4
0
ファイル: Unsafe.cs プロジェクト: BeauPrime/BeauUtil
        /// <summary>
        /// Creates a linear allocation arena.
        /// </summary>
        static public ArenaHandle CreateArena(int inSize, StringHash32 inName = default)
        {
            uint arenaSize = AlignUp32((uint)inSize);
            int  totalSize = (int)(ArenaHeader.HeaderSize + arenaSize);

            void *       block       = Alloc(totalSize);
            ArenaHeader *blockHeader = (ArenaHeader *)block;
            byte *       dataStart   = (byte *)block + ArenaHeader.HeaderSize;

            ArenaHeader header;

            header.Name     = inName;
            header.StartPtr = header.CurrentPtr = dataStart;
            header.Size     = header.SizeRemaining = arenaSize;

            *blockHeader = header;

            return(new ArenaHandle(blockHeader));
        }
コード例 #5
0
ファイル: Unsafe.cs プロジェクト: BeauPrime/BeauUtil
        /// <summary>
        /// Allocates from the given arena.
        /// </summary>
        static public void *Alloc(ArenaHandle inArena, int inLength)
        {
            ArenaHeader *header = (ArenaHeader *)inArena.HeaderStart;

            if (header == null)
            {
                return(null);
            }

            if (header->SizeRemaining < inLength)
            {
                Log.Warn("[Unsafe] Unable to allocate region of size {0} in arena {1} (size remaining {2})", inLength, header->Name, header->SizeRemaining);
                return(null);
            }

            void *addr = header->CurrentPtr;

            header->CurrentPtr    += inLength;
            header->SizeRemaining -= (uint)inLength;
            return(addr);
        }
コード例 #6
0
ファイル: Unsafe.cs プロジェクト: BeauPrime/BeauUtil
        /// <summary>
        /// Allocates from the given arena with the given alignment.
        /// </summary>
        static public void *AllocAligned(ArenaHandle inArena, int inLength, uint inAlignment)
        {
            ArenaHeader *header = (ArenaHeader *)inArena.HeaderStart;

            if (header == null)
            {
                return(null);
            }

            byte *aligned = (byte *)AlignUpN((ulong)header->CurrentPtr, inAlignment);
            uint  padding = (uint)(aligned - header->CurrentPtr);

            if (header->SizeRemaining < padding + inLength)
            {
                Log.Warn("[Unsafe] Unable to allocate region of size {0} and alignment {1} in arena {2} (size remaining {3})", inLength, inAlignment, header->Name, header->SizeRemaining);
                return(null);
            }

            header->CurrentPtr    += inLength + padding;
            header->SizeRemaining -= (uint)inLength + padding;
            return(aligned);
        }
コード例 #7
0
ファイル: Unsafe.cs プロジェクト: BeauPrime/BeauUtil
 internal ArenaHandle(ArenaHeader *inHeader)
 {
     HeaderStart = inHeader;
 }