mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-25 01:01:34 +11:00
Introduce methods for increasing and decreasing the reference
This commit is contained in:
parent
2a04ebd884
commit
5793d6b6ab
|
@ -58,6 +58,26 @@ enum VRamState {
|
||||||
Free(u16),
|
Free(u16),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl VRamState {
|
||||||
|
fn increase_reference(&mut self) -> u16 {
|
||||||
|
if let VRamState::ReferenceCounted(count, _) = self {
|
||||||
|
*count += 1;
|
||||||
|
*count
|
||||||
|
} else {
|
||||||
|
panic!("Corrupted vram state");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn decrease_reference(&mut self) -> (u16, (u16, u16)) {
|
||||||
|
if let VRamState::ReferenceCounted(count, tile_ref) = self {
|
||||||
|
*count -= 1;
|
||||||
|
(*count, *tile_ref)
|
||||||
|
} else {
|
||||||
|
panic!("Corrupted vram state");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum ArenaStorageItem<T> {
|
enum ArenaStorageItem<T> {
|
||||||
EndOfFreeList,
|
EndOfFreeList,
|
||||||
NextFree(usize),
|
NextFree(usize),
|
||||||
|
@ -141,15 +161,7 @@ impl<'a> VRamManager<'a> {
|
||||||
fn add_tile(&mut self, tile_set_ref: TileSetReference, tile: u16) -> TileIndex {
|
fn add_tile(&mut self, tile_set_ref: TileSetReference, tile: u16) -> TileIndex {
|
||||||
let tile_ref = (tile_set_ref.id, tile);
|
let tile_ref = (tile_set_ref.id, tile);
|
||||||
if let Some(&reference) = self.tile_set_to_vram.get(&tile_ref) {
|
if let Some(&reference) = self.tile_set_to_vram.get(&tile_ref) {
|
||||||
if let VRamState::ReferenceCounted(count, tile_ref) =
|
self.references[reference as usize].increase_reference();
|
||||||
self.references[reference as usize]
|
|
||||||
{
|
|
||||||
self.references[reference as usize] =
|
|
||||||
VRamState::ReferenceCounted(count + 1, tile_ref);
|
|
||||||
} else {
|
|
||||||
panic!("Corrupted tile reference state");
|
|
||||||
}
|
|
||||||
|
|
||||||
return TileIndex(reference as u16);
|
return TileIndex(reference as u16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,13 +212,7 @@ impl<'a> VRamManager<'a> {
|
||||||
fn remove_tile(&mut self, tile_index: TileIndex) {
|
fn remove_tile(&mut self, tile_index: TileIndex) {
|
||||||
let index = tile_index.0 as usize;
|
let index = tile_index.0 as usize;
|
||||||
|
|
||||||
let (new_count, tile_ref) = match self.references[index] {
|
let (new_count, tile_ref) = self.references[index].decrease_reference();
|
||||||
VRamState::ReferenceCounted(count, tile_ref) => {
|
|
||||||
self.references[index] = VRamState::ReferenceCounted(count - 1, tile_ref);
|
|
||||||
(count - 1, tile_ref)
|
|
||||||
}
|
|
||||||
_ => panic!("Corrupted tile reference state"),
|
|
||||||
};
|
|
||||||
|
|
||||||
if new_count != 0 {
|
if new_count != 0 {
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in a new issue