package graphdriver

import "sync"

// RefCounter is a generic counter for use by graphdriver Get/Put calls
type RefCounter struct {
	counts map[string]int
	mu     sync.Mutex
}

// NewRefCounter returns a new RefCounter
func NewRefCounter() *RefCounter {
	return &RefCounter{counts: make(map[string]int)}
}

// Increment increaes the ref count for the given id and returns the current count
func (c *RefCounter) Increment(id string) int {
	c.mu.Lock()
	c.counts[id]++
	count := c.counts[id]
	c.mu.Unlock()
	return count
}

// Decrement decreases the ref count for the given id and returns the current count
func (c *RefCounter) Decrement(id string) int {
	c.mu.Lock()
	c.counts[id]--
	count := c.counts[id]
	c.mu.Unlock()
	return count
}