#pragma once
#include "Backend.h"
#include <panda/unievent/Loop.h>

namespace xs { namespace unievent {

struct DLoopSP : xs::nn<panda::unievent::LoopSP> {
    using LoopSP = panda::unievent::LoopSP;
    using Loop   = panda::unievent::Loop;
    using Super  = typename xs::nn<LoopSP>;
    using Super::Super;

    LoopSP& operator-> () {
        if (!val) val = Loop::default_loop();
        return val;
    }

    Loop& operator* () { return *operator->(); }
    operator LoopSP () { return operator->(); }
    operator Loop*  () { return operator->(); }
};

}}

namespace xs {

template <class TYPE> struct Typemap<panda::unievent::Loop*, TYPE> : TypemapObject<panda::unievent::Loop*, TYPE, ObjectTypeRefcntPtr, ObjectStorageMGBackref, DynamicCast> {
    static panda::string package () { return "UniEvent::Loop"; }
};

template <> struct Typemap<xs::unievent::DLoopSP> : TypemapBase<xs::unievent::DLoopSP> {
    static xs::unievent::DLoopSP in (const Sv& arg) {
        auto val = xs::in<panda::unievent::LoopSP>(arg);
        return xs::unievent::DLoopSP(val ? val : panda::unievent::Loop::default_loop());
    }
};

}