//=============================================================================================================================
//
// EasyAR Sense 4.2.0.8700-7bcbc8b1c
// Copyright (c) 2015-2021 VisionStar Information Technology (Shanghai) Co., Ltd. All Rights Reserved.
// EasyAR is the registered trademark or trademark of VisionStar Information Technology (Shanghai) Co., Ltd in China
// and other countries for the augmented reality technology developed by VisionStar Information Technology (Shanghai) Co., Ltd.
//
//=============================================================================================================================
#ifndef __EASYAR_CALLBACKSCHEDULER_HXX__
#define __EASYAR_CALLBACKSCHEDULER_HXX__
#include "easyar/types.hxx"
namespace easyar {
///
/// Callback scheduler.
/// There are two subclasses: `DelayedCallbackScheduler`_ and `ImmediateCallbackScheduler`_ .
/// `DelayedCallbackScheduler`_ is used to delay callback to be invoked manually, and it can be used in single-threaded environments (such as various UI environments).
/// `ImmediateCallbackScheduler`_ is used to mark callback to be invoked when event is dispatched, and it can be used in multi-threaded environments (such as server or service daemon).
///
class CallbackScheduler
{
protected:
easyar_CallbackScheduler * cdata_ ;
void init_cdata(easyar_CallbackScheduler * cdata);
virtual CallbackScheduler & operator=(const CallbackScheduler & data) { return *this; } //deleted
public:
CallbackScheduler(easyar_CallbackScheduler * cdata);
virtual ~CallbackScheduler();
CallbackScheduler(const CallbackScheduler & data);
const easyar_CallbackScheduler * get_cdata() const;
easyar_CallbackScheduler * get_cdata();
};
///
/// Delayed callback scheduler.
/// It is used to delay callback to be invoked manually, and it can be used in single-threaded environments (such as various UI environments).
/// All members of this class is thread-safe.
///
class DelayedCallbackScheduler : public CallbackScheduler
{
protected:
easyar_DelayedCallbackScheduler * cdata_ ;
void init_cdata(easyar_DelayedCallbackScheduler * cdata);
virtual DelayedCallbackScheduler & operator=(const DelayedCallbackScheduler & data) { return *this; } //deleted
public:
DelayedCallbackScheduler(easyar_DelayedCallbackScheduler * cdata);
virtual ~DelayedCallbackScheduler();
DelayedCallbackScheduler(const DelayedCallbackScheduler & data);
const easyar_DelayedCallbackScheduler * get_cdata() const;
easyar_DelayedCallbackScheduler * get_cdata();
DelayedCallbackScheduler();
///
/// Executes a callback. If there is no callback to execute, false is returned.
///
bool runOne();
static void tryCastFromCallbackScheduler(CallbackScheduler * v, /* OUT */ DelayedCallbackScheduler * * Return);
};
///
/// Immediate callback scheduler.
/// It is used to mark callback to be invoked when event is dispatched, and it can be used in multi-threaded environments (such as server or service daemon).
/// All members of this class is thread-safe.
///
class ImmediateCallbackScheduler : public CallbackScheduler
{
protected:
easyar_ImmediateCallbackScheduler * cdata_ ;
void init_cdata(easyar_ImmediateCallbackScheduler * cdata);
virtual ImmediateCallbackScheduler & operator=(const ImmediateCallbackScheduler & data) { return *this; } //deleted
public:
ImmediateCallbackScheduler(easyar_ImmediateCallbackScheduler * cdata);
virtual ~ImmediateCallbackScheduler();
ImmediateCallbackScheduler(const ImmediateCallbackScheduler & data);
const easyar_ImmediateCallbackScheduler * get_cdata() const;
easyar_ImmediateCallbackScheduler * get_cdata();
///
/// Gets a default immediate callback scheduler.
///
static void getDefault(/* OUT */ ImmediateCallbackScheduler * * Return);
static void tryCastFromCallbackScheduler(CallbackScheduler * v, /* OUT */ ImmediateCallbackScheduler * * Return);
};
}
#endif
#ifndef __IMPLEMENTATION_EASYAR_CALLBACKSCHEDULER_HXX__
#define __IMPLEMENTATION_EASYAR_CALLBACKSCHEDULER_HXX__
#include "easyar/callbackscheduler.h"
namespace easyar {
inline CallbackScheduler::CallbackScheduler(easyar_CallbackScheduler * cdata)
:
cdata_(NULL)
{
init_cdata(cdata);
}
inline CallbackScheduler::~CallbackScheduler()
{
if (cdata_) {
easyar_CallbackScheduler__dtor(cdata_);
cdata_ = NULL;
}
}
inline CallbackScheduler::CallbackScheduler(const CallbackScheduler & data)
:
cdata_(NULL)
{
easyar_CallbackScheduler * cdata = NULL;
easyar_CallbackScheduler__retain(data.cdata_, &cdata);
init_cdata(cdata);
}
inline const easyar_CallbackScheduler * CallbackScheduler::get_cdata() const
{
return cdata_;
}
inline easyar_CallbackScheduler * CallbackScheduler::get_cdata()
{
return cdata_;
}
inline void CallbackScheduler::init_cdata(easyar_CallbackScheduler * cdata)
{
cdata_ = cdata;
}
inline DelayedCallbackScheduler::DelayedCallbackScheduler(easyar_DelayedCallbackScheduler * cdata)
:
CallbackScheduler(static_cast(NULL)),
cdata_(NULL)
{
init_cdata(cdata);
}
inline DelayedCallbackScheduler::~DelayedCallbackScheduler()
{
if (cdata_) {
easyar_DelayedCallbackScheduler__dtor(cdata_);
cdata_ = NULL;
}
}
inline DelayedCallbackScheduler::DelayedCallbackScheduler(const DelayedCallbackScheduler & data)
:
CallbackScheduler(static_cast(NULL)),
cdata_(NULL)
{
easyar_DelayedCallbackScheduler * cdata = NULL;
easyar_DelayedCallbackScheduler__retain(data.cdata_, &cdata);
init_cdata(cdata);
}
inline const easyar_DelayedCallbackScheduler * DelayedCallbackScheduler::get_cdata() const
{
return cdata_;
}
inline easyar_DelayedCallbackScheduler * DelayedCallbackScheduler::get_cdata()
{
return cdata_;
}
inline void DelayedCallbackScheduler::init_cdata(easyar_DelayedCallbackScheduler * cdata)
{
cdata_ = cdata;
{
easyar_CallbackScheduler * cdata_inner = NULL;
easyar_castDelayedCallbackSchedulerToCallbackScheduler(cdata, &cdata_inner);
CallbackScheduler::init_cdata(cdata_inner);
}
}
inline DelayedCallbackScheduler::DelayedCallbackScheduler()
:
CallbackScheduler(static_cast(NULL)),
cdata_(NULL)
{
easyar_DelayedCallbackScheduler * _return_value_ = NULL;
easyar_DelayedCallbackScheduler__ctor(&_return_value_);
init_cdata(_return_value_);
}
inline bool DelayedCallbackScheduler::runOne()
{
if (cdata_ == NULL) {
return bool();
}
bool _return_value_ = easyar_DelayedCallbackScheduler_runOne(cdata_);
return _return_value_;
}
inline void DelayedCallbackScheduler::tryCastFromCallbackScheduler(CallbackScheduler * v, /* OUT */ DelayedCallbackScheduler * * Return)
{
if (v == NULL) {
*Return = NULL;
return;
}
easyar_DelayedCallbackScheduler * cdata = NULL;
easyar_tryCastCallbackSchedulerToDelayedCallbackScheduler(v->get_cdata(), &cdata);
if (cdata == NULL) {
*Return = NULL;
return;
}
*Return = new DelayedCallbackScheduler(cdata);
}
inline ImmediateCallbackScheduler::ImmediateCallbackScheduler(easyar_ImmediateCallbackScheduler * cdata)
:
CallbackScheduler(static_cast(NULL)),
cdata_(NULL)
{
init_cdata(cdata);
}
inline ImmediateCallbackScheduler::~ImmediateCallbackScheduler()
{
if (cdata_) {
easyar_ImmediateCallbackScheduler__dtor(cdata_);
cdata_ = NULL;
}
}
inline ImmediateCallbackScheduler::ImmediateCallbackScheduler(const ImmediateCallbackScheduler & data)
:
CallbackScheduler(static_cast(NULL)),
cdata_(NULL)
{
easyar_ImmediateCallbackScheduler * cdata = NULL;
easyar_ImmediateCallbackScheduler__retain(data.cdata_, &cdata);
init_cdata(cdata);
}
inline const easyar_ImmediateCallbackScheduler * ImmediateCallbackScheduler::get_cdata() const
{
return cdata_;
}
inline easyar_ImmediateCallbackScheduler * ImmediateCallbackScheduler::get_cdata()
{
return cdata_;
}
inline void ImmediateCallbackScheduler::init_cdata(easyar_ImmediateCallbackScheduler * cdata)
{
cdata_ = cdata;
{
easyar_CallbackScheduler * cdata_inner = NULL;
easyar_castImmediateCallbackSchedulerToCallbackScheduler(cdata, &cdata_inner);
CallbackScheduler::init_cdata(cdata_inner);
}
}
inline void ImmediateCallbackScheduler::getDefault(/* OUT */ ImmediateCallbackScheduler * * Return)
{
easyar_ImmediateCallbackScheduler * _return_value_ = NULL;
easyar_ImmediateCallbackScheduler_getDefault(&_return_value_);
*Return = new ImmediateCallbackScheduler(_return_value_);
}
inline void ImmediateCallbackScheduler::tryCastFromCallbackScheduler(CallbackScheduler * v, /* OUT */ ImmediateCallbackScheduler * * Return)
{
if (v == NULL) {
*Return = NULL;
return;
}
easyar_ImmediateCallbackScheduler * cdata = NULL;
easyar_tryCastCallbackSchedulerToImmediateCallbackScheduler(v->get_cdata(), &cdata);
if (cdata == NULL) {
*Return = NULL;
return;
}
*Return = new ImmediateCallbackScheduler(cdata);
}
}
#endif