aboutsummaryrefslogtreecommitdiffstats
path: root/libparc/parc/algol/parc_HashCodeTable.h
diff options
context:
space:
mode:
Diffstat (limited to 'libparc/parc/algol/parc_HashCodeTable.h')
-rw-r--r--libparc/parc/algol/parc_HashCodeTable.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/libparc/parc/algol/parc_HashCodeTable.h b/libparc/parc/algol/parc_HashCodeTable.h
new file mode 100644
index 00000000..58b3d016
--- /dev/null
+++ b/libparc/parc/algol/parc_HashCodeTable.h
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2017 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file parc_HashCodeTable.h
+ * @ingroup datastructures
+ *
+ * A hashcode table requires the user to specify their own hash function
+ * to operate on the object type being inserted.
+ *
+ */
+#ifndef libparc_parc_HashCodeTable_h
+#define libparc_parc_HashCodeTable_h
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+#include <parc/algol/parc_HashCode.h>
+
+struct parc_hashcode_table;
+typedef struct parc_hashcode_table PARCHashCodeTable;
+
+typedef PARCHashCode HashCodeType;
+
+
+/**
+ * @typedef PARCHashCodeTable_KeyEqualsFunc
+ * @brief Are two keys equal?
+ *
+ */
+
+typedef bool (*PARCHashCodeTable_KeyEqualsFunc)(const void *keyA, const void *keyB);
+
+/**
+ * @typedef PARCHashCodeTable_HashCodeFunc
+ */
+
+typedef HashCodeType (*PARCHashCodeTable_HashCodeFunc)(const void *keyA);
+
+/**
+ * @typedef PARCHashCodeTable_Destroyer
+ */
+
+typedef void (*PARCHashCodeTable_Destroyer)(void **keyOrDataPtr);
+
+/**
+ * Create a Hash Table based on hash codes.
+ *
+ * @param [in] keyEqualsFunc Tests keys for equality.
+ * @param [in] keyHashCodeFunc Returns the hash code of a key
+ * @param [in] keyDestroyer Called on Remove or Destroy to free stored keys, may be NULL.
+ * @param [in] dataDestroyer Called on Remove or Destroy to free stored data, may be NULL.
+ *
+ * Example:
+ * @code
+ * <#example#>
+ * @endcode
+ */
+PARCHashCodeTable *parcHashCodeTable_Create(PARCHashCodeTable_KeyEqualsFunc keyEqualsFunc,
+ PARCHashCodeTable_HashCodeFunc keyHashCodeFunc,
+ PARCHashCodeTable_Destroyer keyDestroyer,
+ PARCHashCodeTable_Destroyer dataDestroyer);
+
+
+/**
+ * Create a Hash Table based on hash codes.
+ *
+ * @param [in] keyEqualsFunc Tests keys for equality.
+ * @param [in] keyHashCodeFunc Returns the hash code of a key
+ * @param [in] keyDestroyer Called on Remove or Destroy to free stored keys, may be NULL.
+ * @param [in] dataDestroyer Called on Remove or Destroy to free stored data, may be NULL.
+ * @param [in] minimumSize The minimum size of the table
+ *
+ * Example:
+ * @code
+ * <#example#>
+ * @endcode
+ */
+PARCHashCodeTable *parcHashCodeTable_Create_Size(PARCHashCodeTable_KeyEqualsFunc keyEqualsFunc,
+ PARCHashCodeTable_HashCodeFunc keyHashCodeFunc,
+ PARCHashCodeTable_Destroyer keyDestroyer,
+ PARCHashCodeTable_Destroyer dataDestroyer,
+ size_t minimumSize);
+
+/**
+ * Destroy the table and free all saved objects
+ *
+ * @param [in,out] tablePtr is a pointer to the `PARCHashCodeTable` reference.
+ *
+ *
+ * Example:
+ * @code
+ * <#example#>
+ * @endcode
+ */
+void parcHashCodeTable_Destroy(PARCHashCodeTable **tablePtr);
+
+/**
+ * Add an element to the hash table.
+ * @param [in,out] table The key, must be usable with the {@link PARCHashCodeTable_KeyEqualsFunc} and {@link PARCHashCodeTable_HashCodeFunc}.
+ * @param [in] key The key, must be usable with the `keyEqualsFunc` and `keyHashCodeFunc`.
+ * @param [in] data The value, must not be NULL
+ *
+ * @return true if key did not exist and data was added. Returns false if key exists or error.
+ *
+ * Example:
+ * @code
+ * <#example#>
+ * @endcode
+ */
+bool parcHashCodeTable_Add(PARCHashCodeTable *table, void *key, void *data);
+
+/**
+ * Removes a key from an instance of `PARCHashCodeTable`, freeing key and data memory. Does nothing if key does not
+ * exist in the table.
+ *
+ * @param [in,out] table The instance of `PARCHashCodeTable` from which the key will be removed.
+ * @param [in] key The key, must be usable with the {@link PARCHashCodeTable_KeyEqualsFunc} and {@link PARCHashCodeTable_HashCodeFunc}.
+ *
+ * Example:
+ * @code
+ * <#example#>
+ * @endcode
+ */
+void parcHashCodeTable_Del(PARCHashCodeTable *table, const void *key);
+
+/**
+ * Returns the key value, or NULL if the key does not exist
+ *
+ * @param [in] table The instance of `PARCHashCodeTable` from which the the value will be retrieved.
+ * @param [in] key The key to identify the desired value.
+ *
+ * @return A pointer to the value of the specified key.
+ *
+ * Example:
+ * @code
+ * <#example#>
+ * @endcode
+ */
+void *parcHashCodeTable_Get(PARCHashCodeTable *table, const void *key);
+
+/**
+ * Returns the number of entries in the table
+ *
+ *
+ * @param [in] table The specified `PARCHashCodeTable` instance.
+ * @return The number of entries in @p table.
+ *
+ * Example:
+ * @code
+ * <#example#>
+ * @endcode
+ */
+size_t parcHashCodeTable_Length(const PARCHashCodeTable *table);
+#endif // libparc_parc_HashCodeTable_h