db.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #ifndef _DB_H_
  2. #define _DB_H_
  3. #include <stdarg.h>
  4. #define HASH_SIZE (256+27)
  5. #define RED 0
  6. #define BLACK 1
  7. struct dbn {
  8. struct dbn *parent,*left,*right;
  9. int color;
  10. void *key;
  11. void *data;
  12. int deleted; // 削除済みフラグ(db_foreach)
  13. };
  14. struct dbt {
  15. int (*cmp)(struct dbt*,void*,void*);
  16. unsigned int (*hash)(struct dbt*,void*);
  17. // which 1 - key, 2 - data, 3 - both
  18. void (*release)(struct dbn*,int which);
  19. int maxlen;
  20. struct dbn *ht[HASH_SIZE];
  21. int item_count; // vf?
  22. const char* alloc_file; // DB?t@C
  23. int alloc_line; // DB?s
  24. // db_foreach 内部でdb_erase される対策として、
  25. // db_foreach が終わるまでロックすることにする
  26. struct db_free {
  27. struct dbn *z;
  28. struct dbn **root;
  29. } *free_list;
  30. int free_count;
  31. int free_max;
  32. int free_lock;
  33. };
  34. #define strdb_search(t,k) db_search((t),(void*)(k))
  35. #define strdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
  36. #define strdb_erase(t,k) db_erase ((t),(void*)(k))
  37. #define strdb_foreach db_foreach
  38. #define strdb_final db_final
  39. #define numdb_search(t,k) db_search((t),(void*)(k))
  40. #define numdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
  41. #define numdb_erase(t,k) db_erase ((t),(void*)(k))
  42. #define numdb_foreach db_foreach
  43. #define numdb_final db_final
  44. #define strdb_init(a) strdb_init_(a,__FILE__,__LINE__)
  45. #define numdb_init() numdb_init_(__FILE__,__LINE__)
  46. struct dbt* strdb_init_(int maxlen,const char *file,int line);
  47. struct dbt* numdb_init_(const char *file,int line);
  48. void* db_search(struct dbt *table,void* key);
  49. void* db_search2(struct dbt *table, const char *key); // [MouseJstr]
  50. struct dbn* db_insert(struct dbt *table,void* key,void* data);
  51. void* db_erase(struct dbt *table,void* key);
  52. void db_foreach(struct dbt*,int(*)(void*,void*,va_list),...);
  53. void db_final(struct dbt*,int(*)(void*,void*,va_list),...);
  54. #endif