#ifndef SWIFT_ATOMIC_REF_H
#define SWIFT_ATOMIC_REF_H

#include <swift/stdlib.h>

#include <swift/atomic/api.h>
#include <swift/atomic/atomic.h>

typedef struct swift_ref_t swift_ref_t;

typedef void (* swift_release_ref_func_t)(swift_ref_t *ref);

struct swift_ref_t {
	swift_atomic_t count;
};

#define SWIFT_REF(...) ((swift_ref_t){__VA_ARGS__})

SWIFT_ATOMIC_API void swift_init_ref(swift_ref_t *ref);
SWIFT_ATOMIC_API void swift_acquire_ref(swift_ref_t *ref);
SWIFT_ATOMIC_API bool swift_acquire_ref_unless_zero(swift_ref_t *ref);
SWIFT_ATOMIC_API void swift_release_ref(swift_ref_t *ref,
	swift_release_ref_func_t release);

#endif /* SWIFT_ATOMIC_REF_H */

