/*
 * QBool Module
 *
 * Copyright IBM, Corp. 2009
 *
 * Authors:
 *  Anthony Liguori   <aliguori@us.ibm.com>
 *
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
 * See the COPYING.LIB file in the top-level directory.
 *
 */

#include "qapi/qmp/qbool.h"
#include "qapi/qmp/qobject.h"
#include "qemu-common.h"

static void qbool_destroy_obj(QObject *obj);

static const QType qbool_type = {
    .code = QTYPE_QBOOL,
    .destroy = qbool_destroy_obj,
};

/**
 * qbool_from_bool(): Create a new QBool from a bool
 *
 * Return strong reference.
 */
QBool *qbool_from_bool(bool value)
{
    QBool *qb;

    qb = g_malloc(sizeof(*qb));
    qb->value = value;
    QOBJECT_INIT(qb, &qbool_type);

    return qb;
}

/**
 * qbool_get_bool(): Get the stored bool
 */
bool qbool_get_bool(const QBool *qb)
{
    return qb->value;
}

/**
 * qobject_to_qbool(): Convert a QObject into a QBool
 */
QBool *qobject_to_qbool(const QObject *obj)
{
    if (!obj || qobject_type(obj) != QTYPE_QBOOL) {
        return NULL;
    }
    return container_of(obj, QBool, base);
}

/**
 * qbool_destroy_obj(): Free all memory allocated by a
 * QBool object
 */
static void qbool_destroy_obj(QObject *obj)
{
    assert(obj != NULL);
    g_free(qobject_to_qbool(obj));
}
