#pragma once

#include <osmocom/core/defs.h>

/*! \file counter.h
 *  Common routines regarding counter handling */

/*! Structure representing a single counter */
struct osmo_counter {
	struct llist_head list;		/*!< internal list head */
	const char *name;		/*!< human-readable name */
	const char *description;	/*!< humn-readable description */
	unsigned long value;		/*!< current value */
	unsigned long previous;		/*!< previous value */
};

/*! Decrement given counter by one
 *  \param[in] ctr Counter that's to be decremented */
OSMO_DEPRECATED("Implement as osmo_stat_item instead")
static inline void osmo_counter_dec(struct osmo_counter *ctr)
{
	ctr->value--;
}

/*! Increment counter by one.
 *  \param[in] Counter that's to be incremented */
OSMO_DEPRECATED("Implement as osmo_stat_item instead")
static inline void osmo_counter_inc(struct osmo_counter *ctr)
{
	ctr->value++;
}

/*! Get current value of counter */
OSMO_DEPRECATED("Implement as osmo_stat_item instead")
static inline unsigned long osmo_counter_get(struct osmo_counter *ctr)
{
	return ctr->value;
}

/*! Reset current value of counter to 0 */
OSMO_DEPRECATED("Implement as osmo_stat_item instead")
static inline void osmo_counter_reset(struct osmo_counter *ctr)
{
	ctr->value = 0;
}

struct osmo_counter *osmo_counter_alloc(const char *name)
	OSMO_DEPRECATED("Implement as osmo_stat_item instead");

void osmo_counter_free(struct osmo_counter *ctr)
	OSMO_DEPRECATED("Implement as osmo_stat_item instead");

int osmo_counters_for_each(int (*handle_counter)(struct osmo_counter *, void *), void *data);

int osmo_counters_count();

struct osmo_counter *osmo_counter_get_by_name(const char *name);

int osmo_counter_difference(struct osmo_counter *ctr);
