Performance improvements and override mandatory to optional rules
Change-Id: Id099f1f03443fafce2f2181e305fbababbe0fa1f
diff --git a/libfdproto/hashlist.cpp b/libfdproto/hashlist.cpp
new file mode 100644
index 0000000..6fa6771
--- /dev/null
+++ b/libfdproto/hashlist.cpp
@@ -0,0 +1,404 @@
+
+#include <string>
+#include <unordered_map>
+
+extern "C" {
+ int initInt32HashList(void **hl);
+ void deleteInt32HashList(void *hl);
+ void deleteEntryInt32HashList(int32_t k, void *hl);
+ int insertInt32HashList(int32_t k, void *v, void *hl, void **duplicate);
+ int findInt32HashList(int32_t k, void *hl, void **result);
+
+ int initInt64HashList(void **hl);
+ void deleteInt64HashList(void *hl);
+ void deleteEntryInt64HashList(int64_t k, void *hl);
+ int insertInt64HashList(int64_t k, void *v, void *hl, void **duplicate);
+ int findInt64HashList(int64_t k, void *hl, void **result);
+
+ int initUInt32HashList(void **hl);
+ void deleteUInt32HashList(void *hl);
+ void deleteEntryUInt32HashList(uint32_t k, void *hl);
+ int insertUInt32HashList(uint32_t k, void *v, void *hl, void **duplicate);
+ int findUInt32HashList(uint32_t k, void *hl, void **result);
+
+ int initUInt64HashList(void **hl);
+ void deleteUInt64HashList(void *hl);
+ void deleteEntryUInt64HashList(uint64_t k, void *hl);
+ int insertUInt64HashList(uint64_t k, void *v, void *hl, void **duplicate);
+ int findUInt64HashList(uint64_t k, void *hl, void **result);
+
+ int initFloat32HashList(void **hl);
+ void deleteFloat32HashList(void *hl);
+ void deleteEntryFloat32HashList(float k, void *hl);
+ int insertFloat32HashList(float k, void *v, void *hl, void **duplicate);
+ int findFloat32HashList(float k, void *hl, void **result);
+
+ int initFloat64HashList(void **hl);
+ void deleteFloat64HashList(void *hl);
+ void deleteEntryFloat64HashList(double k, void *hl);
+ int insertFloat64HashList(double k, void *v, void *hl, void **duplicate);
+ int findFloat64HashList(double k, void *hl, void **result);
+
+ int initStringHashList(void **hl);
+ void deleteStringHashList(void *hl);
+ void deleteEntryStringHashList(const char *k, void *hl);
+ int insertStringHashList(const char *k, void *v, void *hl, void **duplicate);
+ int findStringHashList(const char *k, void *hl, void **result);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+int initInt32HashList(void **hl)
+{
+ *hl = (void*)(new std::unordered_map<int32_t,void*>());
+ return 0;
+}
+
+void deleteInt32HashList(void *hl)
+{
+ delete (std::unordered_map<int32_t,void*>*)hl;
+}
+
+void deleteEntryInt32HashList(int32_t k, void *hl)
+{
+ std::unordered_map<int32_t,void*> &l( *(std::unordered_map<int32_t,void*>*)hl );
+
+ l.erase(k);
+}
+
+int insertInt32HashList(int32_t k, void *v, void *hl, void **duplicate)
+{
+ std::unordered_map<int32_t,void*> &l( *(std::unordered_map<int32_t,void*>*)hl );
+
+ auto result = l.insert({k,v});
+
+ if (!result.second && duplicate)
+ *duplicate = result.first->second;
+
+ return result.second ? 0 : EEXIST;
+}
+
+int findInt32HashList(int32_t k, void *hl, void **result)
+{
+ if (hl == NULL || result == NULL)
+ return EINVAL;
+
+ int ret = 0;
+ std::unordered_map<int32_t,void*> &l( *(std::unordered_map<int32_t,void*>*)hl );
+
+ auto search = l.find(k);
+
+ if (search != l.end())
+ *result = search->second;
+ else
+ ret = ENOENT;
+
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+int initInt64HashList(void **hl)
+{
+ *hl = (void*)(new std::unordered_map<int64_t,void*>());
+ return 0;
+}
+
+void deleteInt64HashList(void *hl)
+{
+ delete (std::unordered_map<int64_t,void*>*)hl;
+}
+
+void deleteEntryInt64HashList(int64_t k, void *hl)
+{
+ std::unordered_map<int64_t,void*> &l( *(std::unordered_map<int64_t,void*>*)hl );
+
+ l.erase(k);
+}
+
+int insertInt64HashList(int64_t k, void *v, void *hl, void **duplicate)
+{
+ std::unordered_map<int64_t,void*> &l( *(std::unordered_map<int64_t,void*>*)hl );
+
+ auto result = l.insert({k,v});
+
+ if (!result.second && duplicate)
+ *duplicate = result.first->second;
+
+ return result.second ? 0 : EEXIST;
+}
+
+int findInt64HashList(int64_t k, void *hl, void **result)
+{
+ if (hl == NULL || result == NULL)
+ return EINVAL;
+
+ int ret = 0;
+ std::unordered_map<int64_t,void*> &l( *(std::unordered_map<int64_t,void*>*)hl );
+
+ auto search = l.find(k);
+
+ if (search != l.end())
+ *result = search->second;
+ else
+ ret = ENOENT;
+
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+int initUInt32HashList(void **hl)
+{
+ *hl = (void*)(new std::unordered_map<uint32_t,void*>());
+ return 0;
+}
+
+void deleteUInt32HashList(void *hl)
+{
+ delete (std::unordered_map<uint32_t,void*>*)hl;
+}
+
+void deleteEntryUInt32HashList(uint32_t k, void *hl)
+{
+ std::unordered_map<uint32_t,void*> &l( *(std::unordered_map<uint32_t,void*>*)hl );
+
+ l.erase(k);
+}
+
+int insertUInt32HashList(uint32_t k, void *v, void *hl, void **duplicate)
+{
+ std::unordered_map<uint32_t,void*> &l( *(std::unordered_map<uint32_t,void*>*)hl );
+
+ auto result = l.insert({k,v});
+
+ if (!result.second && duplicate)
+ *duplicate = result.first->second;
+
+ return result.second ? 0 : EEXIST;
+}
+
+int findUInt32HashList(uint32_t k, void *hl, void **result)
+{
+ if (hl == NULL || result == NULL)
+ return EINVAL;
+
+ int ret = 0;
+ std::unordered_map<uint32_t,void*> &l( *(std::unordered_map<uint32_t,void*>*)hl );
+
+ auto search = l.find(k);
+
+ if (search != l.end())
+ *result = search->second;
+ else
+ ret = ENOENT;
+
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+int initUInt64HashList(void **hl)
+{
+ *hl = (void*)(new std::unordered_map<uint64_t,void*>());
+ return 0;
+}
+
+void deleteUInt64HashList(void *hl)
+{
+ delete (std::unordered_map<uint64_t,void*>*)hl;
+}
+
+void deleteEntryUInt64HashList(uint64_t k, void *hl)
+{
+ std::unordered_map<uint64_t,void*> &l( *(std::unordered_map<uint64_t,void*>*)hl );
+
+ l.erase(k);
+}
+
+int insertUInt64HashList(uint64_t k, void *v, void *hl, void **duplicate)
+{
+ std::unordered_map<uint64_t,void*> &l( *(std::unordered_map<uint64_t,void*>*)hl );
+
+ auto result = l.insert({k,v});
+
+ if (!result.second && duplicate)
+ *duplicate = result.first->second;
+
+ return result.second ? 0 : EEXIST;
+}
+
+int findUInt64HashList(uint64_t k, void *hl, void **result)
+{
+ if (hl == NULL || result == NULL)
+ return EINVAL;
+
+ int ret = 0;
+ std::unordered_map<uint64_t,void*> &l( *(std::unordered_map<uint64_t,void*>*)hl );
+
+ auto search = l.find(k);
+
+ if (search != l.end())
+ *result = search->second;
+ else
+ ret = ENOENT;
+
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+int initFloat32HashList(void **hl)
+{
+ *hl = (void*)(new std::unordered_map<float,void*>());
+ return 0;
+}
+
+void deleteFloat32HashList(void *hl)
+{
+ delete (std::unordered_map<float,void*>*)hl;
+}
+
+void deleteEntryFloat32HashList(float k, void *hl)
+{
+ std::unordered_map<float,void*> &l( *(std::unordered_map<float,void*>*)hl );
+
+ l.erase(k);
+}
+
+int insertFloat32HashList(float k, void *v, void *hl, void **duplicate)
+{
+ std::unordered_map<float,void*> &l( *(std::unordered_map<float,void*>*)hl );
+
+ auto result = l.insert({k,v});
+
+ if (!result.second && duplicate)
+ *duplicate = result.first->second;
+
+ return result.second ? 0 : EEXIST;
+}
+
+int findFloat32HashList(float k, void *hl, void **result)
+{
+ if (hl == NULL || result == NULL)
+ return EINVAL;
+
+ int ret = 0;
+ std::unordered_map<float,void*> &l( *(std::unordered_map<float,void*>*)hl );
+
+ auto search = l.find(k);
+
+ if (search != l.end())
+ *result = search->second;
+ else
+ ret = ENOENT;
+
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+int initFloat64HashList(void **hl)
+{
+ *hl = (void*)(new std::unordered_map<double,void*>());
+ return 0;
+}
+
+void deleteFloat64HashList(void *hl)
+{
+ delete (std::unordered_map<double,void*>*)hl;
+}
+
+void deleteEntryFloat64HashList(double k, void *hl)
+{
+ std::unordered_map<double,void*> &l( *(std::unordered_map<double,void*>*)hl );
+
+ l.erase(k);
+}
+
+int insertFloat64HashList(double k, void *v, void *hl, void **duplicate)
+{
+ std::unordered_map<double,void*> &l( *(std::unordered_map<double,void*>*)hl );
+
+ auto result = l.insert({k,v});
+
+ if (!result.second && duplicate)
+ *duplicate = result.first->second;
+
+ return result.second ? 0 : EEXIST;
+}
+
+int findFloat64HashList(double k, void *hl, void **result)
+{
+ if (hl == NULL || result == NULL)
+ return EINVAL;
+
+ int ret = 0;
+ std::unordered_map<double,void*> &l( *(std::unordered_map<double,void*>*)hl );
+
+ auto search = l.find(k);
+
+ if (search != l.end())
+ *result = search->second;
+ else
+ ret = ENOENT;
+
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+int initStringHashList(void **hl)
+{
+ *hl = (void*)(new std::unordered_map<std::string,void*>());
+ return 0;
+}
+
+void deleteStringHashList(void *hl)
+{
+ delete (std::unordered_map<std::string,void*>*)hl;
+}
+
+void deleteEntryStringHashList(const char *k, void *hl)
+{
+ std::unordered_map<std::string,void*> &l( *(std::unordered_map<std::string,void*>*)hl );
+
+ l.erase(k);
+}
+
+int insertStringHashList(const char *k, void *v, void *hl, void **duplicate)
+{
+ std::unordered_map<std::string,void*> &l( *(std::unordered_map<std::string,void*>*)hl );
+
+ auto result = l.insert({k,v});
+
+ if (!result.second && duplicate)
+ *duplicate = result.first->second;
+
+ return result.second ? 0 : EEXIST;
+}
+
+int findStringHashList(const char *k, void *hl, void **result)
+{
+ if (hl == NULL || result == NULL)
+ return EINVAL;
+
+ int ret = 0;
+ std::unordered_map<std::string,void*> &l( *(std::unordered_map<std::string,void*>*)hl );
+
+ auto search = l.find(k);
+
+ if (search != l.end())
+ *result = search->second;
+ else
+ ret = ENOENT;
+
+ return ret;
+}