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

package io.netty.buffer;

import io.netty.util.ReferenceCounted;
import io.netty.util.internal.RefCnt;

public abstract class AbstractReferenceCountedByteBuf extends AbstractByteBuf
{
    private final RefCnt refCnt;
    
    protected AbstractReferenceCountedByteBuf(final int maxCapacity) {
        super(maxCapacity);
        this.refCnt = new RefCnt();
    }
    
    @Override
    boolean isAccessible() {
        return RefCnt.isLiveNonVolatile(this.refCnt);
    }
    
    @Override
    public int refCnt() {
        return RefCnt.refCnt(this.refCnt);
    }
    
    protected final void setRefCnt(final int count) {
        RefCnt.setRefCnt(this.refCnt, count);
    }
    
    protected final void resetRefCnt() {
        RefCnt.resetRefCnt(this.refCnt);
    }
    
    @Override
    public ByteBuf retain() {
        RefCnt.retain(this.refCnt);
        return this;
    }
    
    @Override
    public ByteBuf retain(final int increment) {
        RefCnt.retain(this.refCnt, increment);
        return this;
    }
    
    @Override
    public ByteBuf touch() {
        return this;
    }
    
    @Override
    public ByteBuf touch(final Object hint) {
        return this;
    }
    
    @Override
    public boolean release() {
        return this.handleRelease(RefCnt.release(this.refCnt));
    }
    
    @Override
    public boolean release(final int decrement) {
        return this.handleRelease(RefCnt.release(this.refCnt, decrement));
    }
    
    private boolean handleRelease(final boolean result) {
        if (result) {
            this.deallocate();
        }
        return result;
    }
    
    protected abstract void deallocate();
}
