dbutils/field.c

Wed, 11 Dec 2024 21:53:31 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 11 Dec 2024 21:53:31 +0100
changeset 6
d6981b56ab30
parent 4
1908c8b1599f
child 7
c98ff52cd806
permissions
-rw-r--r--

add object cache

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2024 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the followign disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

#include "field.h"

/* -------------------- Default Initializer Functions -------------------- */

static int field_def_init_int(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(int*)(obj+f->offset) = (int)f->def.def;
    return 0;
}

static int field_def_init_uint(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(unsigned int*)(obj+f->offset) = (unsigned int)f->def.udef;
    return 0;
}

static int field_def_init_int16(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(int16_t*)(obj+f->offset) = (int16_t)f->def.def;
    return 0;
}

static int field_def_init_uint16(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(uint16_t*)(obj+f->offset) = (uint16_t)f->def.udef;
    return 0;
}

static int field_def_init_int32(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(int32_t*)(obj+f->offset) = (int32_t)f->def.def;
    return 0;
}

static int field_def_init_uint32(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(uint32_t*)(obj+f->offset) = (int32_t)f->def.udef;
    return 0;
}

static int field_def_init_int64(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(int64_t*)(obj+f->offset) = f->def.def;
    return 0;
}

static int field_def_init_uint64(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(uint64_t*)(obj+f->offset) = (uint64_t)f->def.udef;
    return 0;
}

static int field_def_init_size(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(size_t*)(obj+f->offset) = (size_t)f->def.udef;
    return 0;
}

static int field_def_init_ssize(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(ssize_t*)(obj+f->offset) = (ssize_t)f->def.def;
    return 0;
}

static int field_def_init_float(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(float*)(obj+f->offset) = (float)f->def.fdef;
    return 0;
}

static int field_def_init_double(DBUOffsetField *f, const CxAllocator *a, DBUObject obj) {
    *(double*)(obj+f->offset) = (double)f->def.ddef;
    return 0;
}


/* --------------------     Initializer Functions     -------------------- */

static int str2int(const char *str, int64_t *i) {
    if(!str || *str == 0) {
        return 0;
    }
    
    char *endptr;
    long long v = strtoll(str, &endptr, 10);
    *i = v;
    return *endptr == 0;
}

static int str2uint(const char *str, uint64_t *u) {
    if(!str || *str == 0) {
        return 0;
    }
    
    char *endptr;
    unsigned long long v = strtoull(str, &endptr, 10);
    *u = v;
    return *endptr == 0;
}

static int field_init_int(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    int64_t i;
    if(!str2int(value, &i)) {
        return 1;
    }
    if(i < INT_MIN || i > INT_MAX) {
        return 1;
    }
    *(int*)(obj+f->offset) = (int)i;
    return 0;
}

static int field_init_uint(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    uint64_t i;
    if(!str2uint(value, &i)) {
        return 1;
    }
    if(i > UINT_MAX) {
        return 1;
    }
    *(unsigned int*)(obj+f->offset) = (unsigned int)i;
    return 0;
}

static int field_init_int8(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    int64_t i;
    if(!str2int(value, &i)) {
        return 1;
    }
    if(i < INT8_MIN || i > INT8_MAX) {
        return 1;
    }
    *(int8_t*)(obj+f->offset) = (int8_t)i;
    return 0;
}

static int field_init_uint8(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    uint64_t i;
    if(!str2uint(value, &i)) {
        return 1;
    }
    if(i > UINT8_MAX) {
        return 1;
    }
    *(uint8_t*)(obj+f->offset) = (uint8_t)i;
    return 0;
}

static int field_init_int16(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    int64_t i;
    if(!str2int(value, &i)) {
        return 1;
    }
    if(i < INT16_MIN || i > INT16_MAX) {
        return 1;
    }
    *(int16_t*)(obj+f->offset) = (int16_t)i;
    return 0;
}

static int field_init_uint16(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    uint64_t i;
    if(!str2uint(value, &i)) {
        return 1;
    }
    if(i > UINT16_MAX) {
        return 1;
    }
    *(uint16_t*)(obj+f->offset) = (uint16_t)i;
    return 0;
}

static int field_init_int32(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    int64_t i;
    if(!str2int(value, &i)) {
        return 1;
    }
    if(i < INT32_MIN || i > INT32_MAX) {
        return 1;
    }
    *(int32_t*)(obj+f->offset) = (int32_t)i;
    return 0;
}

static int field_init_uint32(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    uint64_t i;
    if(!str2uint(value, &i)) {
        return 1;
    }
    if(i > UINT32_MAX) {
        return 1;
    }
    *(uint32_t*)(obj+f->offset) = (uint32_t)i;
    return 0;
}

static int field_init_int64(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    int64_t i;
    if(!str2int(value, &i)) {
        return 1;
    }
    *(int64_t*)(obj+f->offset) = i;
    return 0;
}

static int field_init_uint64(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    uint64_t i;
    if(!str2uint(value, &i)) {
        return 1;
    }
    *(uint64_t*)(obj+f->offset) = i;
    return 0;
}

static int field_init_size(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    uint64_t i;
    if(!str2uint(value, &i)) {
        return 1;
    }
    *(uint64_t*)(obj+f->offset) = i;
    return 0;
}

static int field_init_ssize(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    int64_t i;
    if(!str2int(value, &i)) {
        return 1;
    }
    *(ssize_t*)(obj+f->offset) = (ssize_t)i;
    return 0;
}

static int field_init_bool(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    bool boolvalue = 0;
    if(value) {
        char c = value[0];
        if(c == 't' || c == 'T' || c == '1') {
            boolvalue = 1;
        }
    }
    *(bool*)(obj+f->offset) = boolvalue;
    return 0;
}

static int field_init_float(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    char *endptr;
    float v = strtof(value, &endptr);
    if(!endptr || *endptr != 0) {
        return 1;
    }
    *(float*)(obj+f->offset) = v;
    return 0;
}

static int field_init_double(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    char *endptr;
    double v = strtod(value, &endptr);
    if(!endptr || *endptr != 0) {
        return 1;
    }
    *(double*)(obj+f->offset) = v;
    return 0;
}


static int field_init_str(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    cxmutstr m = cx_strdup_a(a, cx_strn(value, length));
    if(!m.ptr) {
        return 1;
    }
    *(char**)(obj+f->offset) = m.ptr;
    return 0;
}

static int field_init_cxmutstr(
        DBUOffsetField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    cxmutstr m = cx_strdup_a(a, cx_strn(value, length));
    if(!m.ptr) {
        return 1;
    }
    *(cxmutstr*)(obj+f->offset) = m;
    return 0;
}

static int field_init_str_size(
        DBUObjLenField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    cxmutstr m = cx_strdup_a(a, cx_strn(value, length));
    if(!m.ptr) {
        return 1;
    }
    *(char**)(obj+f->offset_obj) = m.ptr;
    *(size_t*)(obj+f->offset_len) = m.length;
    return 0;
}

static int field_init_str_intlen(
        DBUObjLenField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    cxmutstr m = cx_strdup_a(a, cx_strn(value, length));
    if(!m.ptr) {
        return 1;
    }
    *(char**)(obj+f->offset_obj) = m.ptr;
    *(int*)(obj+f->offset_len) = (int)m.length;
    return 0;
}

static int field_init_bytes_size(
        DBUObjLenField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    char *bytes = cxMalloc(a, length);
    if(!bytes) {
        return 1;
    }
    memcpy(bytes, value, length);
    *(char**)(obj+f->offset_obj) = bytes;
    *(size_t*)(obj+f->offset_len) = length;
    return 0;
}

static int field_init_bytes_intlen(
        DBUObjLenField *f,
        const CxAllocator *a,
        DBUObject obj,
        const char *value,
        size_t length)
{
    char *bytes = cxMalloc(a, length);
    if(!bytes) {
        return 1;
    }
    memcpy(bytes, value, length);
    *(char**)(obj+f->offset_obj) = bytes;
    *(int*)(obj+f->offset_len) = (int)length;
    return 0;
}


/* --------------------     FIELD CONSTRUCTOR      -------------------- */

static DBUField* create_offset_def_field(
        off_t offset,
        DBUFieldDefInitFunc def_init,
        DBUFieldInitFunc init,
        bool nonnull, 
        union DBUDefValue def)
{
    DBUOffsetField *field = calloc(1, sizeof(DBUOffsetField));
    field->field.initDefaultValue = def_init;
    field->field.initValue = init;
    field->field.nonnull = nonnull;
    field->field.query_length = false;
    field->offset = offset;
    field->def = def;
    return (DBUField*)field;
}

static void add_offset_def_field(
        DBUClass *cls, 
        const char *name, 
        off_t offset,
        DBUFieldDefInitFunc def_init,
        DBUFieldInitFunc init,
        bool nonnull, 
        union DBUDefValue def)
{
    dbuClassAddField(cls, name, create_offset_def_field(offset, def_init, init, nonnull, def));
}

static void add_bool(
        DBUClass *cls, 
        const char *name, 
        off_t offset,
        bool nonnull)
{
    DBUOffsetField *field = calloc(1, sizeof(DBUOffsetField));
    field->field.initDefaultValue = NULL;
    field->field.initValue = (DBUFieldInitFunc)field_init_bool;
    field->field.nonnull = nonnull;
    field->field.query_length = false;
    field->offset = offset;
    field->def.def = 0;
    dbuClassAddField(cls, name, (DBUField*)field);
}

static DBUField* create_offset_str_field(
        DBUFieldInitFunc init,
        off_t offset,
        bool nonnull)
{
    DBUOffsetField *field = calloc(1, sizeof(DBUOffsetField));
    field->field.initDefaultValue = NULL;
    field->field.initValue = (DBUFieldInitFunc)init;
    field->field.nonnull = nonnull;
    field->field.query_length = true;
    field->offset = offset;
    field->def.def = 0;
    return (DBUField*)field;
}

static void add_offset_str_field(
        DBUClass *cls, 
        const char *name,
        DBUFieldInitFunc init,
        off_t offset,
        bool nonnull)
{
    DBUOffsetField *field = calloc(1, sizeof(DBUOffsetField));
    field->field.initDefaultValue = NULL;
    field->field.initValue = (DBUFieldInitFunc)init;
    field->field.nonnull = nonnull;
    field->field.query_length = true;
    field->offset = offset;
    field->def.def = 0;
    dbuClassAddField(cls, name, create_offset_str_field(init, offset, nonnull));
}

static void add_objlen_field(
        DBUClass *cls, 
        const char *name, 
        DBUFieldInitFunc init,
        off_t offset,
        off_t size_offset,
        bool nonnull)
{
    DBUObjLenField *field = malloc(sizeof(DBUObjLenField));
    memset(field, 0, sizeof(DBUObjLenField));
    field->field.initDefaultValue = NULL;
    field->field.initValue = (DBUFieldInitFunc)init;
    field->field.nonnull = nonnull;
    field->field.query_length = true;
    field->offset_obj = offset;
    field->offset_len = size_offset;
    dbuClassAddField(cls, name, (DBUField*)field);
}




DBUField* dbuFieldCreateInt32(off_t offset) {
    return create_offset_def_field(offset, NULL, (DBUFieldInitFunc)field_init_int32, false, (union DBUDefValue){ 0 });
}

DBUField* dbuFieldCreateUInt32(off_t offset) {
    return create_offset_def_field(offset, NULL, (DBUFieldInitFunc)field_init_uint32, false, (union DBUDefValue){ 0 });
}

DBUField* dbuFieldCreateInt64(off_t offset) {
    return create_offset_def_field(offset, NULL, (DBUFieldInitFunc)field_init_int64, false, (union DBUDefValue){ 0 });
}

DBUField* dbuFieldCreateUInt64(off_t offset) {
    return create_offset_def_field(offset, NULL, (DBUFieldInitFunc)field_init_uint64, false, (union DBUDefValue){ 0 });
}

DBUField* dbuFieldCreateString(off_t offset) {
    return create_offset_str_field((DBUFieldInitFunc)field_init_str, offset, false);
}

DBUField* dbuFieldCreateCxMutStr(off_t offset) {
    return create_offset_str_field((DBUFieldInitFunc)field_init_cxmutstr, offset, false);
}

/* --------------------            PUBLIC            -------------------- */


void dbuClassAddInt(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_int,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddUInt(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_uint,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddInt8(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_int8,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddUInt8(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_uint8,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddInt16(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_int16,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddUInt16(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_uint16,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddInt32(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_int32,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddUInt32(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_uint32,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddInt64(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_int64,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddUInt64(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_uint64,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddSize(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_size,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddSSize(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_ssize,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddBool(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_bool(
            cls, 
            name, 
            offset,
            nonnull);
}

void dbuClassAddFloat(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_float,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddDouble(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_def_field(
            cls,
            name,
            offset,
            NULL,
            (DBUFieldInitFunc)field_init_double,
            nonnull,
            (union DBUDefValue){ 0 });
}

void dbuClassAddString(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_str_field(
            cls, 
            name,
            (DBUFieldInitFunc)field_init_str,
            offset,
            nonnull);
}

void dbuClassAddCXMutStr(DBUClass *cls, const char *name, off_t offset, bool nonnull) {
    add_offset_str_field(
            cls, 
            name,
            (DBUFieldInitFunc)field_init_cxmutstr,
            offset,
            nonnull);
}

void dbuClassAddStringSize(DBUClass *cls, const char *name, off_t offset, off_t size_offset, bool nonnull) {
    add_objlen_field(
            cls, 
            name, 
            (DBUFieldInitFunc)field_init_str_size,
            offset,
            size_offset,
            nonnull);
}

void dbuClassAddStringIntLen(DBUClass *cls, const char *name, off_t offset, off_t int_offset, bool nonnull) {
    add_objlen_field(
            cls, 
            name, 
            (DBUFieldInitFunc)field_init_str_intlen,
            offset,
            int_offset,
            nonnull);
}

void dbuClassAddBuf(DBUClass *cls, const char *name, off_t offset, off_t size_offset, bool nonnull) {
    add_objlen_field(
            cls, 
            name, 
            (DBUFieldInitFunc)field_init_bytes_size,
            offset,
            size_offset,
            nonnull);
}

void dbuClassAddBufIntLen(DBUClass *cls, const char *name, off_t offset, off_t int_offset, bool nonnull) {
    add_objlen_field(
            cls, 
            name, 
            (DBUFieldInitFunc)field_init_bytes_intlen,
            offset,
            int_offset,
            nonnull);
}


void dbuClassAddIntDef(DBUClass *cls, const char *name, off_t offset, int def) {
    union DBUDefValue defvalue;
    defvalue.def = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_int,
            (DBUFieldInitFunc)field_init_int,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddUIntDef(DBUClass *cls, const char *name, off_t offset, unsigned int def) {
    union DBUDefValue defvalue;
    defvalue.udef = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_uint,
            (DBUFieldInitFunc)field_init_uint,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddInt16Def(DBUClass *cls, const char *name, off_t offset, int16_t def) {
    union DBUDefValue defvalue;
    defvalue.def = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_int16,
            (DBUFieldInitFunc)field_init_int16,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddUInt16Def(DBUClass *cls, const char *name, off_t offset, uint16_t def) {
    union DBUDefValue defvalue;
    defvalue.udef = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_uint16,
            (DBUFieldInitFunc)field_init_uint16,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddInt32Def(DBUClass *cls, const char *name, off_t offset, int32_t def) {
    union DBUDefValue defvalue;
    defvalue.def = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_int32,
            (DBUFieldInitFunc)field_init_int32,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddUInt32Def(DBUClass *cls, const char *name, off_t offset, uint32_t def) {
    union DBUDefValue defvalue;
    defvalue.udef = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_uint32,
            (DBUFieldInitFunc)field_init_uint32,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddInt64Def(DBUClass *cls, const char *name, off_t offset, int64_t def) {
    union DBUDefValue defvalue;
    defvalue.def = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_int64,
            (DBUFieldInitFunc)field_init_int64,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddUInt64Def(DBUClass *cls, const char *name, off_t offset, uint64_t def) {
    union DBUDefValue defvalue;
    defvalue.def = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_uint64,
            (DBUFieldInitFunc)field_init_uint64,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddSizeDef(DBUClass *cls, const char *name, off_t offset, size_t def) {
    union DBUDefValue defvalue;
    defvalue.udef = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_size,
            (DBUFieldInitFunc)field_init_size,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddSSizeDef(DBUClass *cls, const char *name, off_t offset, ssize_t def) {
    union DBUDefValue defvalue;
    defvalue.def = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_ssize,
            (DBUFieldInitFunc)field_init_ssize,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddFloatDef(DBUClass *cls, const char *name, off_t offset, float def) {
    union DBUDefValue defvalue;
    defvalue.fdef = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_float,
            (DBUFieldInitFunc)field_init_float,
            false,
            (union DBUDefValue){ 0 });
}

void dbuClassAddDoubleDef(DBUClass *cls, const char *name, off_t offset, double def) {
    union DBUDefValue defvalue;
    defvalue.ddef = def;
    add_offset_def_field(
            cls,
            name,
            offset,
            (DBUFieldDefInitFunc)field_def_init_double,
            (DBUFieldInitFunc)field_init_double,
            false,
            (union DBUDefValue){ 0 });
}


// add complex members

static int set_obj_ptr(DBUField *f, const CxAllocator *a, DBUObject obj, void *child) {
    DBUOffsetField *field = (DBUOffsetField*)f;
    *(void**)(obj+field->offset) = child;
    return 0;
}

void dbuClassAddObj(DBUClass *cls, const char *name, off_t offset, DBUClass *foreign_cls) {
    DBUOffsetField *field = malloc(sizeof(DBUOffsetField));
    memset(field, 0, sizeof(DBUOffsetField));
    field->field.initObjValue = set_obj_ptr;
    field->offset = offset;
    field->def.def = 0;
    dbuClassAddObjField(cls, name, (DBUField*)field, foreign_cls);
}

void dbuClassAddLinkedList(DBUClass *cls, const char *name, off_t offset, DBUClass *foreign_cls) {
    
}

void dbuClassAddValueLinkedList(DBUClass *cls, const char *name, off_t offset, DBUClass *foreign_cls) {
    
}

void dbuClassAddCxArrayList(DBUClass *cls, const char *name, off_t offset, DBUClass *foreign_cls) {
    
}

void dbuClassAddValueArrayList(DBUClass *cls, const char *name, off_t offset, DBUClass *foreign_cls) {
    
}

void dbuClassAddArray(DBUClass *cls, const char *name, off_t array_offset, off_t size_offset, DBUClass *foreign_cls) {
    
}

void dbuClassAddValueArray(DBUClass *cls, const char *name, off_t array_offset, off_t size_offset, DBUClass *foreign_cls) {
    
}

mercurial