// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com> // All rights reserved. // // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Package util provides utilities used throughout leveldb. package util import ( "errors" ) var ( ErrReleased = errors.New("leveldb: resource already relesed") ErrHasReleaser = errors.New("leveldb: releaser already defined") ) // Releaser is the interface that wraps the basic Release method. type Releaser interface { // Release releases associated resources. Release should always success // and can be called multiple times without causing error. Release() } // ReleaseSetter is the interface that wraps the basic SetReleaser method. type ReleaseSetter interface { // SetReleaser associates the given releaser to the resources. The // releaser will be called once coresponding resources released. // Calling SetReleaser with nil will clear the releaser. // // This will panic if a releaser already present or coresponding // resource is already released. Releaser should be cleared first // before assigned a new one. SetReleaser(releaser Releaser) } // BasicReleaser provides basic implementation of Releaser and ReleaseSetter. type BasicReleaser struct { releaser Releaser released bool } // Released returns whether Release method already called. func (r *BasicReleaser) Released() bool { return r.released } // Release implements Releaser.Release. func (r *BasicReleaser) Release() { if !r.released { if r.releaser != nil { r.releaser.Release() r.releaser = nil } r.released = true } } // SetReleaser implements ReleaseSetter.SetReleaser. func (r *BasicReleaser) SetReleaser(releaser Releaser) { if r.released { panic(ErrReleased) } if r.releaser != nil && releaser != nil { panic(ErrHasReleaser) } r.releaser = releaser } type NoopReleaser struct{} func (NoopReleaser) Release() {}