github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/syndtr/goleveldb/leveldb/util/util.go (about)

     1  // Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>
     2  // All rights reserved.
     3  //
     4  // Use of this source code is governed by a BSD-style license that can be
     5  // found in the LICENSE file.
     6  
     7  // Package util provides utilities used throughout leveldb.
     8  package util
     9  
    10  import (
    11  	"errors"
    12  )
    13  
    14  var (
    15  	ErrReleased    = errors.New("leveldb: resource already relesed")
    16  	ErrHasReleaser = errors.New("leveldb: releaser already defined")
    17  )
    18  
    19  // Releaser is the interface that wraps the basic Release method.
    20  type Releaser interface {
    21  	// Release releases associated resources. Release should always success
    22  	// and can be called multipe times without causing error.
    23  	Release()
    24  }
    25  
    26  // ReleaseSetter is the interface that wraps the basic SetReleaser method.
    27  type ReleaseSetter interface {
    28  	// SetReleaser associates the given releaser to the resources. The
    29  	// releaser will be called once coresponding resources released.
    30  	// Calling SetReleaser with nil will clear the releaser.
    31  	//
    32  	// This will panic if a releaser already present or coresponding
    33  	// resource is already released. Releaser should be cleared first
    34  	// before assigned a new one.
    35  	SetReleaser(releaser Releaser)
    36  }
    37  
    38  // BasicReleaser provides basic implementation of Releaser and ReleaseSetter.
    39  type BasicReleaser struct {
    40  	releaser Releaser
    41  	released bool
    42  }
    43  
    44  // Released returns whether Release method already called.
    45  func (r *BasicReleaser) Released() bool {
    46  	return r.released
    47  }
    48  
    49  // Release implements Releaser.Release.
    50  func (r *BasicReleaser) Release() {
    51  	if !r.released {
    52  		if r.releaser != nil {
    53  			r.releaser.Release()
    54  			r.releaser = nil
    55  		}
    56  		r.released = true
    57  	}
    58  }
    59  
    60  // SetReleaser implements ReleaseSetter.SetReleaser.
    61  func (r *BasicReleaser) SetReleaser(releaser Releaser) {
    62  	if r.released {
    63  		panic(ErrReleased)
    64  	}
    65  	if r.releaser != nil && releaser != nil {
    66  		panic(ErrHasReleaser)
    67  	}
    68  	r.releaser = releaser
    69  }
    70  
    71  type NoopReleaser struct{}
    72  
    73  func (NoopReleaser) Release() {}