Quick actions

cmd+k|ctrl+k

Navigation

Languages

CraftStruct2

Snippet info

Language

Cpp

Visibility

public

Author

evine

Created

2016-05-25T14:37:09Z

Updated

2016-05-25T23:12:55Z

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define forS0(Name, String) \
for(u32 Name = 0; Name == 0 || (String)[Name-1]; Name++)

typedef uint64_t u64;
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;

enum struct CraftStructEnum : u8{
    Tnull,
    Ts64,
    Tstring
};


struct CraftStructEntry{
    CraftStructEnum type;
    u8 type_size;
    u8 word_size;
    int& E(char *member);
};

CraftStructEntry *next(CraftStructEntry *in)
{
    char *result = (char *)in;
    result += sizeof(CraftStructEntry);
    result += in->type_size;
    result += in->word_size;
    return (CraftStructEntry *)result;
}

int& CraftStructEntry::E(char *member)
{
    CraftStructEntry *entry = this;
    int *result;
    while(1)
    {
        bool match = 1;
        if(entry->type == CraftStructEnum::Tnull)
        {
            entry->type = CraftStructEnum::Ts64;
            entry->type_size = 8;
            entry->word_size = 0;
            forS0(i, member)
            {
                ((char *)entry)[sizeof(CraftStructEntry)+i] = member[i];
                entry->word_size++;
            }
            result = (int *)(((char *)entry) + sizeof(CraftStructEntry) + entry->word_size); // get value
            
            break;
        }
        for(int i = 0; member[i] != 0; ++i)
        {
            if(member[i] != ((char *)entry)[i+sizeof(CraftStructEntry)]) // get member
            {
                match = 0;
                break;
            }
        }
        if(match == 1)
        {
            result = (int *)(((char *)entry) + sizeof(CraftStructEntry) + entry->word_size); // get value
            break;
        }
        entry = next(entry);  
    }
    
    return *result;
}


int main()
{
    CraftStructEntry *Some_data = (CraftStructEntry *)calloc(1024 * 64, 1);
    
    Some_data->E("tega") = 1024;
    Some_data->E("fgg") = 32;
    
    printf("%lli, %lli, %lli", Some_data->E("fgg"), Some_data->E("tega"), Some_data->E("non_exist"));
    
    return 0;
}
INFO