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

package io.netty.util;

import io.netty.util.internal.RefCnt;

public abstract class AbstractReferenceCounted implements ReferenceCounted
{
    private final RefCnt refCnt;
    
    public AbstractReferenceCounted() {
        this.refCnt = new RefCnt();
    }
    
    @Override
    public int refCnt() {
        return RefCnt.refCnt(this.refCnt);
    }
    
    protected void setRefCnt(final int refCnt) {
        RefCnt.setRefCnt(this.refCnt, refCnt);
    }
    
    @Override
    public ReferenceCounted retain() {
        RefCnt.retain(this.refCnt);
        return this;
    }
    
    @Override
    public ReferenceCounted retain(final int increment) {
        RefCnt.retain(this.refCnt, increment);
        return this;
    }
    
    @Override
    public ReferenceCounted touch() {
        return this.touch(null);
    }
    
    @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();
}
