// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.worldgen.loader.prefab;

import com.hypixel.hytale.server.worldgen.util.ResolvedBlockArray;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import java.util.HashMap;
import javax.annotation.Nonnull;
import java.util.Map;
import com.hypixel.hytale.server.worldgen.util.condition.BlockMaskCondition;
import com.hypixel.hytale.server.worldgen.loader.util.FileMaskCache;

public class BlockPlacementMaskRegistry extends FileMaskCache<BlockMaskCondition>
{
    @Nonnull
    private final Map<BlockMaskCondition, BlockMaskCondition> masks;
    @Nonnull
    private final Map<BlockMaskCondition.MaskEntry, BlockMaskCondition.MaskEntry> entries;
    private BlockMaskCondition tempMask;
    private BlockMaskCondition.MaskEntry tempEntry;
    
    public BlockPlacementMaskRegistry() {
        this.masks = new HashMap<BlockMaskCondition, BlockMaskCondition>();
        this.entries = new HashMap<BlockMaskCondition.MaskEntry, BlockMaskCondition.MaskEntry>();
        this.tempMask = new BlockMaskCondition();
        this.tempEntry = new BlockMaskCondition.MaskEntry();
    }
    
    @Nonnull
    public BlockMaskCondition retainOrAllocateMask(@Nonnull final BlockMaskCondition.Mask defaultMask, @Nonnull final Long2ObjectMap<BlockMaskCondition.Mask> specificMasks) {
        final BlockMaskCondition mask = this.tempMask;
        mask.set(defaultMask, specificMasks);
        final BlockMaskCondition old = this.masks.putIfAbsent(mask, mask);
        if (old != null) {
            return old;
        }
        this.tempMask = new BlockMaskCondition();
        return mask;
    }
    
    @Nonnull
    public BlockMaskCondition.MaskEntry retainOrAllocateEntry(@Nonnull final ResolvedBlockArray blocks, final boolean replace) {
        final BlockMaskCondition.MaskEntry entry = this.tempEntry;
        entry.set(blocks, replace);
        final BlockMaskCondition.MaskEntry old = this.entries.putIfAbsent(entry, entry);
        if (old != null) {
            return old;
        }
        this.tempEntry = new BlockMaskCondition.MaskEntry();
        return entry;
    }
}
