include/wrenbind17/handle.hpp
  #
  Namespaces
  #
  Classes
  #
  Source code
  #
#pragma once
#include <wren.hpp>
#include <memory>
#include "exception.hpp"
namespace wrenbind17 {
    std::shared_ptr<WrenVM> getSharedVm(WrenVM* vm);
    class Handle {
    public:
        Handle() : handle(nullptr) {
        }
        Handle(const std::shared_ptr<WrenVM> vm, WrenHandle* handle) : vm(vm), handle(handle) {
        }
        ~Handle() {
            reset();
        }
        Handle(const Handle& other) = delete;
        Handle(Handle&& other) noexcept : handle(nullptr) {
            swap(other);
        }
        Handle& operator=(const Handle& other) = delete;
        Handle& operator=(Handle&& other) noexcept {
            if (this != &other) {
                swap(other);
            }
            return *this;
        }
        void swap(Handle& other) noexcept {
            std::swap(vm, other.vm);
            std::swap(handle, other.handle);
        }
        WrenHandle* getHandle() const {
            return handle;
        }
        WrenVM* getVm() const {
            if (const auto ptr = vm.lock()) {
                return ptr.get();
            } else {
                throw RuntimeError("Invalid handle");
            }
        }
        const std::weak_ptr<WrenVM>& getVmWeak() const {
            return vm;
        }
        void reset() {
            if (!vm.expired() && handle) {
                wrenReleaseHandle(vm.lock().get(), handle);
                vm.reset();
                handle = nullptr;
            }
        }
        operator bool() const {
            return !vm.expired() && handle;
        }
    private:
        std::weak_ptr<WrenVM> vm;
        WrenHandle* handle;
    };
} // namespace wrenbind17
Updated on 17 October 2023 at 12:26:25 UTC