blob: 12e395f383d8d9fb11bb8e101762a2293335c757 [file] [log] [blame]
#pragma once
#include <functional>
#include <sdeventplus/internal/sdevent.hpp>
#include <type_traits>
namespace sdeventplus
{
namespace internal
{
template <typename T>
class SdRef
{
public:
using Func = std::function<T*(const SdEvent*, T*)>;
SdRef(T* ref, Func take_ref, Func release_ref,
const SdEvent* sdevent = &sdevent_impl);
SdRef(T* ref, Func take_ref, Func release_ref, std::false_type,
const SdEvent* sdevent = &sdevent_impl);
virtual ~SdRef();
SdRef(const SdRef& other);
SdRef& operator=(const SdRef& other);
SdRef(SdRef&& other);
SdRef& operator=(SdRef&& other);
explicit operator bool() const;
T* get() const;
private:
const SdEvent* sdevent;
Func take_ref;
Func release_ref;
T* ref;
};
} // namespace internal
} // namespace sdeventplus