/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*- */ // SPDX-License-Identifier: MIT OR LGPL-2.0-or-later // SPDX-FileCopyrightText: 2008 litl, LLC #ifndef GI_VALUE_H_ #define GI_VALUE_H_ #include #include // for move, swap #include // for vector #include #include #include "gjs/macros.h" namespace Gjs { struct AutoGValue : GValue { AutoGValue() { static_assert(sizeof(AutoGValue) == sizeof(GValue)); *static_cast(this) = G_VALUE_INIT; } explicit AutoGValue(GType gtype) : AutoGValue() { g_value_init(this, gtype); } AutoGValue(AutoGValue const& src) : AutoGValue(G_VALUE_TYPE(&src)) { g_value_copy(&src, this); } AutoGValue& operator=(AutoGValue other) { // We need to cast to GValue here not to make swap to recurse here std::swap(*static_cast(this), *static_cast(&other)); return *this; } AutoGValue(AutoGValue&& src) { switch (G_VALUE_TYPE(&src)) { case G_TYPE_NONE: case G_TYPE_CHAR: case G_TYPE_UCHAR: case G_TYPE_BOOLEAN: case G_TYPE_INT: case G_TYPE_UINT: case G_TYPE_LONG: case G_TYPE_ULONG: case G_TYPE_INT64: case G_TYPE_UINT64: case G_TYPE_FLOAT: case G_TYPE_DOUBLE: *static_cast(this) = std::move(static_cast(src)); break; default: // We can't safely move in complex cases, so let's just copy *static_cast(this) = G_VALUE_INIT; *this = src; g_value_unset(&src); } } ~AutoGValue() { g_value_unset(this); } }; } // namespace Gjs using AutoGValueVector = std::vector; GJS_JSAPI_RETURN_CONVENTION bool gjs_value_to_g_value (JSContext *context, JS::HandleValue value, GValue *gvalue); GJS_JSAPI_RETURN_CONVENTION bool gjs_value_to_g_value_no_copy (JSContext *context, JS::HandleValue value, GValue *gvalue); GJS_JSAPI_RETURN_CONVENTION bool gjs_value_from_g_value(JSContext *context, JS::MutableHandleValue value_p, const GValue *gvalue); #endif // GI_VALUE_H_