view Renderer/Engine/TextureHash.cc @ 996:78ebcdaae8bc

add sdl_test file
author yutaka@charles.cr.ie.u-ryukyu.ac.jp
date Mon, 11 Oct 2010 18:56:51 +0900
parents 735f76483bb2
children
line wrap: on
line source

#include <string.h>
#include <stdlib.h>
#include "TextureHash.h"

static int id_count;

TextureHash::TextureHash(void)
{
    table = (hashtable*)malloc(sizeof(hashtable)*TABLE_SIZE);

    for (int i = 0; i < TABLE_SIZE; i++) {
        table[i].tx_id = -1;
        table[i].key = NULL;
    }
}

TextureHash::~TextureHash(void)
{
    free(table);
}

int
TextureHash::hash_function(const char *key)
{
    //float value = 0.0;
    int value = 0;

    for (int i = 0; key[i]; i++) {
        value += key[i]*(i+1)*17+1;
    }

    return value%TABLE_SIZE;
}

int
TextureHash::hash_regist(const char* key, int &id)
{
    int hash = hash_function(key);

    for (int i = 0; ; i++) {
        if (table[hash].tx_id == -1) {
            table[hash].key   = (char*)key;
            id = id_count++;
            return 0;

        } else if (strcmp(key, table[hash].key) == 0
                   && table[hash].tx_id != -1){
            id = table[hash].tx_id;
            return 1;
        }
        hash = ((37*hash)^(11*i)) % TABLE_SIZE;
    }
}