#pragma once #include #include namespace Bloom { /** * Simple bidirectional map * * This should only be used for small maps, with small elements (enums, string literals, etc). * * TODO: This needs some work - was written as a quick implementation with minimal requirements. * TODO: Add support for inserting/deleting elements (outside of construction). * * @tparam TypeA * @tparam TypeB */ template class BiMap { private: std::unordered_map map = {}; std::unordered_map::iterator> flippedMap = {}; public: BiMap(std::initializer_list> elements) { for (auto it = elements.begin(); it != elements.end(); ++it) { auto insertResultPair = this->map.insert(std::pair{it->first, it->second}); this->flippedMap.insert( std::pair::iterator>{ it->second, insertResultPair.first } ); } } bool contains(TypeA key) const { return this->map.find(key) != this->map.end(); } bool contains(TypeB key) const { return this->flippedMap.find(key) != this->flippedMap.end(); } std::optional valueAt(TypeA key) const { std::optional output; if (this->contains(key)) { output = this->map.find(key)->second; } return output; } std::optional valueAt(TypeB key) const { std::optional output; if (this->contains(key)) { output = this->flippedMap.find(key)->second->first; } return output; } std::unordered_map getMap() { return this->map; } }; }