#pragma once
#include <xs.h>
#include <panda/unievent/SslContext.h>

extern "C" {
    int SSL_CTX_up_ref(SSL_CTX *ctx);
    void SSL_CTX_free(SSL_CTX *ctx);
}

namespace xs {

template<>
struct Typemap<SSL_CTX*>: TypemapBase<SSL_CTX*> {
    static SSL_CTX* in(SV* arg) {
        if (!SvOK(arg)) return nullptr;
        return reinterpret_cast<SSL_CTX*>(SvIV(arg));
    }
    static Sv out (const SSL_CTX* ctx, const Sv&) {
        if (!ctx) return Simple::undef;
        return Simple(reinterpret_cast<ptrdiff_t>(ctx));
    }
};

template <>
struct Typemap<panda::unievent::SslContext> : TypemapBase<panda::unievent::SslContext> {
    using SslContext = panda::unievent::SslContext;
    using RawTypeMap = Typemap<SSL_CTX*>;

    static SslContext in(SV* arg) {
        return RawTypeMap::in(arg);
    }

    static Sv out (SslContext& context, const Sv& sv = Sv()) {
        return RawTypeMap::out(context, sv);
    }
};

}