aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs
diff options
context:
space:
mode:
authorTSR Berry <20988865+TSRBerry@users.noreply.github.com>2023-04-08 01:22:00 +0200
committerMary <thog@protonmail.com>2023-04-27 23:51:14 +0200
commitcee712105850ac3385cd0091a923438167433f9f (patch)
tree4a5274b21d8b7f938c0d0ce18736d3f2993b11b1 /ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs
parentcd124bda587ef09668a971fa1cac1c3f0cfc9f21 (diff)
Move solution and projects to src
Diffstat (limited to 'ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs')
-rw-r--r--ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs96
1 files changed, 0 insertions, 96 deletions
diff --git a/ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs b/ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs
deleted file mode 100644
index 4c22de40..00000000
--- a/ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
-
-namespace ARMeilleure.Translation.Cache
-{
- class CacheMemoryAllocator
- {
- private readonly struct MemoryBlock : IComparable<MemoryBlock>
- {
- public int Offset { get; }
- public int Size { get; }
-
- public MemoryBlock(int offset, int size)
- {
- Offset = offset;
- Size = size;
- }
-
- public int CompareTo([AllowNull] MemoryBlock other)
- {
- return Offset.CompareTo(other.Offset);
- }
- }
-
- private readonly List<MemoryBlock> _blocks = new List<MemoryBlock>();
-
- public CacheMemoryAllocator(int capacity)
- {
- _blocks.Add(new MemoryBlock(0, capacity));
- }
-
- public int Allocate(int size)
- {
- for (int i = 0; i < _blocks.Count; i++)
- {
- MemoryBlock block = _blocks[i];
-
- if (block.Size > size)
- {
- _blocks[i] = new MemoryBlock(block.Offset + size, block.Size - size);
- return block.Offset;
- }
- else if (block.Size == size)
- {
- _blocks.RemoveAt(i);
- return block.Offset;
- }
- }
-
- // We don't have enough free memory to perform the allocation.
- return -1;
- }
-
- public void Free(int offset, int size)
- {
- Insert(new MemoryBlock(offset, size));
- }
-
- private void Insert(MemoryBlock block)
- {
- int index = _blocks.BinarySearch(block);
-
- if (index < 0)
- {
- index = ~index;
- }
-
- if (index < _blocks.Count)
- {
- MemoryBlock next = _blocks[index];
-
- int endOffs = block.Offset + block.Size;
-
- if (next.Offset == endOffs)
- {
- block = new MemoryBlock(block.Offset, block.Size + next.Size);
- _blocks.RemoveAt(index);
- }
- }
-
- if (index > 0)
- {
- MemoryBlock prev = _blocks[index - 1];
-
- if (prev.Offset + prev.Size == block.Offset)
- {
- block = new MemoryBlock(block.Offset - prev.Size, block.Size + prev.Size);
- _blocks.RemoveAt(--index);
- }
- }
-
- _blocks.Insert(index, block);
- }
- }
-}