Files

185 lines
4.7 KiB
C++
Raw Permalink Normal View History

2023-03-27 14:29:15 -07:00
#include <map>
2024-11-30 15:33:11 +10:00
#include <unordered_map>
2023-03-27 15:58:53 -07:00
#include <cstdint>
2023-03-27 16:06:55 -07:00
#include <cstddef>
2024-11-30 15:33:11 +10:00
#include <memory>
2023-03-27 14:29:15 -07:00
2024-11-30 15:33:11 +10:00
enum class MapType {
Ordered,
Unordered
};
2023-03-27 14:29:15 -07:00
2024-11-30 15:33:11 +10:00
// Ordered maps can be iterated by key order
// Unordered maps have the fastest lookup times (also called a hash map)
class HMap {
public:
HMap(MapType type = MapType::Ordered) : mMapType(type) {
switch (mMapType) {
case MapType::Ordered:
2024-11-30 16:19:48 +10:00
mOrderedMap = std::make_unique<std::map<int64_t, void*>>();
2024-11-30 15:33:11 +10:00
break;
case MapType::Unordered:
2024-11-30 16:19:48 +10:00
mUnorderedMap = std::make_unique<std::unordered_map<int64_t, void*>>();
2024-11-30 15:33:11 +10:00
break;
}
}
2024-11-30 16:19:48 +10:00
void* get(int64_t key) {
2024-11-30 15:33:11 +10:00
switch (mMapType) {
case MapType::Ordered:
if (mOrderedMap->count(key)) {
return mOrderedMap->at(key);
}
break;
case MapType::Unordered:
if (mUnorderedMap->count(key)) {
return mUnorderedMap->at(key);
}
break;
}
return nullptr;
}
2024-11-30 16:19:48 +10:00
void put(int64_t key, void* value) {
2024-11-30 15:33:11 +10:00
switch (mMapType) {
case MapType::Ordered:
2024-11-30 16:19:48 +10:00
mOrderedMap->insert_or_assign(key, value);
2024-11-30 15:33:11 +10:00
break;
case MapType::Unordered:
2024-11-30 16:19:48 +10:00
mUnorderedMap->insert_or_assign(key, value);
2024-11-30 15:33:11 +10:00
break;
}
}
2024-11-30 16:19:48 +10:00
void erase(int64_t key) {
2024-11-30 15:33:11 +10:00
switch (mMapType) {
case MapType::Ordered:
mOrderedMap->erase(key);
break;
case MapType::Unordered:
mUnorderedMap->erase(key);
break;
}
}
void clear() {
switch (mMapType) {
case MapType::Ordered:
mOrderedMap->clear();
break;
case MapType::Unordered:
mUnorderedMap->clear();
break;
}
}
size_t size() const {
switch (mMapType) {
case MapType::Ordered:
return mOrderedMap->size();
case MapType::Unordered:
return mUnorderedMap->size();
}
return 0;
}
void* begin() {
switch (mMapType) {
case MapType::Ordered: {
auto& orderedMap = *mOrderedMap;
if (orderedMap.empty()) { return nullptr; }
mOrderedIterator = mOrderedMap->begin();
return mOrderedIterator->second;
}
case MapType::Unordered: {
auto& unorderedMap = *mUnorderedMap;
if (unorderedMap.empty()) { return nullptr; }
mUnorderedIterator = mUnorderedMap->begin();
return mUnorderedIterator->second;
}
}
return nullptr;
}
void* next() {
switch (mMapType) {
case MapType::Ordered: {
if (++mOrderedIterator != mOrderedMap->end()) {
return mOrderedIterator->second;
}
break;
}
case MapType::Unordered: {
if (++mUnorderedIterator != mUnorderedMap->end()) {
return mUnorderedIterator->second;
}
break;
}
}
return nullptr;
}
private:
MapType mMapType;
2024-11-30 16:19:48 +10:00
std::unique_ptr<std::map<int64_t, void*>> mOrderedMap;
typename std::map<int64_t, void*>::iterator mOrderedIterator;
2024-11-30 15:33:11 +10:00
2024-11-30 16:19:48 +10:00
std::unique_ptr<std::unordered_map<int64_t, void*>> mUnorderedMap;
typename std::unordered_map<int64_t, void*>::iterator mUnorderedIterator;
2023-03-27 14:29:15 -07:00
};
extern "C" {
2024-11-30 15:33:11 +10:00
void* hmap_create(MapType type) {
2024-11-30 16:19:48 +10:00
return new HMap(type);
2023-03-27 14:29:15 -07:00
}
2024-11-30 15:33:11 +10:00
void* hmap_get(void* map, int64_t key) {
2023-11-25 15:44:30 -08:00
if (!map) { return NULL; }
2024-11-30 16:19:48 +10:00
HMap* hmap = reinterpret_cast<HMap*>(map);
2024-11-30 15:33:11 +10:00
return hmap->get(key);
2023-03-27 14:29:15 -07:00
}
2024-11-30 15:33:11 +10:00
void hmap_put(void* map, int64_t key, void* value) {
2023-11-25 15:44:30 -08:00
if (!map) { return; }
2024-11-30 16:19:48 +10:00
HMap* hmap = reinterpret_cast<HMap*>(map);
2024-11-30 15:33:11 +10:00
hmap->put(key, value);
2023-03-27 14:29:15 -07:00
}
2024-11-30 15:33:11 +10:00
void hmap_del(void* map, int64_t key) {
2023-11-25 15:44:30 -08:00
if (!map) { return; }
2024-11-30 16:19:48 +10:00
HMap* hmap = reinterpret_cast<HMap*>(map);
2024-11-30 15:33:11 +10:00
hmap->erase(key);
2023-03-27 14:29:15 -07:00
}
void hmap_clear(void* map) {
2023-11-25 15:44:30 -08:00
if (!map) { return; }
2024-11-30 16:19:48 +10:00
HMap* hmap = reinterpret_cast<HMap*>(map);
2024-11-30 15:33:11 +10:00
hmap->clear();
}
void hmap_destroy(void* map) {
if (!map) { return; }
2024-11-30 16:19:48 +10:00
delete reinterpret_cast<HMap*>(map);
2023-03-27 14:29:15 -07:00
}
size_t hmap_len(void* map) {
2023-11-25 15:44:30 -08:00
if (!map) { return 0; }
2024-11-30 16:19:48 +10:00
HMap* hmap = reinterpret_cast<HMap*>(map);
2024-11-30 15:33:11 +10:00
return hmap->size();
2023-03-27 14:29:15 -07:00
}
2024-11-30 15:33:11 +10:00
void* hmap_begin(void* map) {
if (!map) { return NULL; }
2024-11-30 16:19:48 +10:00
HMap* hmap = reinterpret_cast<HMap*>(map);
2024-11-30 15:33:11 +10:00
return hmap->begin();
2023-03-27 14:29:15 -07:00
}
2024-11-30 15:33:11 +10:00
void* hmap_next(void* map) {
if (!map) { return NULL; }
2024-11-30 16:19:48 +10:00
HMap* hmap = reinterpret_cast<HMap*>(map);
2024-11-30 15:33:11 +10:00
return hmap->next();
2023-03-27 14:29:15 -07:00
}
}