bigpoint_dyntype.c 1.67 KB
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <json/json.h>

#include "bigpoint_dyntype.h"


static
void
__construct(struct BIGPOINT_DYNTYPE * _this, va_list * params)
{
    _this->type = va_arg(* params, enum BIGPOINT_DYNTYPE_TYPES);
    _this->size = va_arg(* params, size_t);

    switch(_this->type) {
        case BIGPOINT_DYNTYPE_INT:
            (_this->data)._int = va_arg(* params, long);
            break;

        default:
            (_this->data)._object = NULL;
    }
}

static
void
__jsonConst(struct BIGPOINT_DYNTYPE * _this, struct json_object * json)
{
    switch (json_object_get_type(json)) {
        case json_type_int:
            _this->type = BIGPOINT_DYNTYPE_INT;
            _this->size = sizeof(long);
            (_this->data)._int = (long)json_object_get_int(json);
            break;

        default:
            _this->type = BIGPOINT_DYNTYPE_NULL;
            _this->size = 0;
            (_this->data)._object = NULL;
    }
}

static
void
__destruct(struct BIGPOINT_DYNTYPE * _this)
{
    if (_this && BIGPOINT_DYNTYPE_OBJECT == _this->type && (_this->data)._object) {
        free((_this->data)._object);
    }
}

static
struct json_object *
__toJson(struct BIGPOINT_DYNTYPE * _this)
{
    struct json_object * json = NULL;

    /**
     * @TODO: make a smart implementation here base on the type of the
     * actual object.
     */
    return json;
}

static const
struct BIGPOINT_CCLASS _bigpoint_dyntype = {
    sizeof(struct BIGPOINT_DYNTYPE),
    (ctor)__construct,
    (jCtor)__jsonConst,
    (dtor)__destruct,
    (jTo)__toJson
};

const struct BIGPOINT_CCLASS * const BIGPOINT_DYNTYPE = &_bigpoint_dyntype;

// vim: set et ts=4 sw=4: