summaryrefslogtreecommitdiffstats
path: root/lib/xwax/lut_win32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/xwax/lut_win32.cpp')
-rw-r--r--lib/xwax/lut_win32.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/lib/xwax/lut_win32.cpp b/lib/xwax/lut_win32.cpp
new file mode 100644
index 0000000000..3f55251b6f
--- /dev/null
+++ b/lib/xwax/lut_win32.cpp
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2013 Mark Hills <mark@xwax.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License version 2 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ */
+
+extern "C" {
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "lut.h"
+
+/* The number of bits to form the hash, which governs the overall size
+ * of the hash lookup table, and hence the amount of chaining */
+
+#define HASH_BITS 16
+
+#define HASH(timecode) ((timecode) & ((1 << HASH_BITS) - 1))
+#define NO_SLOT ((unsigned)-1)
+
+
+/* Initialise an empty hash lookup table to store the given number
+ * of timecode -> position lookups */
+
+int lut_init(struct lut *lut, int nslots)
+{
+ int n, hashes;
+ size_t bytes;
+
+ hashes = 1 << HASH_BITS;
+ bytes = sizeof(struct slot) * nslots + sizeof(slot_no_t) * hashes;
+
+ fprintf(stderr, "Lookup table has %d hashes to %d slots"
+ " (%d slots per hash, %zuKb)\n",
+ hashes, nslots, nslots / hashes, bytes / 1024);
+
+ lut->slot = malloc(sizeof(struct slot) * nslots);
+ if (lut->slot == NULL) {
+ perror("malloc");
+ return -1;
+ }
+
+ lut->table = malloc(sizeof(slot_no_t) * hashes);
+ if (lut->table == NULL) {
+ perror("malloc");
+ return -1;
+ }
+
+ for (n = 0; n < hashes; n++)
+ lut->table[n] = NO_SLOT;
+
+ lut->avail = 0;
+
+ return 0;
+}
+
+
+void lut_clear(struct lut *lut)
+{
+ free(lut->table);
+ free(lut->slot);
+}
+
+
+void lut_push(struct lut *lut, unsigned int timecode)
+{
+ unsigned int hash;
+ slot_no_t slot_no;
+ struct slot *slot;
+
+ slot_no = lut->avail++; /* take the next available slot */
+
+ slot = &lut->slot[slot_no];
+ slot->timecode = timecode;
+
+ hash = HASH(timecode);
+ slot->next = lut->table[hash];
+ lut->table[hash] = slot_no;
+}
+
+
+unsigned int lut_lookup(struct lut *lut, unsigned int timecode)
+{
+ unsigned int hash;
+ slot_no_t slot_no;
+ struct slot *slot;
+
+ hash = HASH(timecode);
+ slot_no = lut->table[hash];
+
+ while (slot_no != NO_SLOT) {
+ slot = &lut->slot[slot_no];
+ if (slot->timecode == timecode)
+ return slot_no;
+ slot_no = slot->next;
+ }
+
+ return (unsigned)-1;
+}
+
+}; // extern "C"