#pragma once #include "Set.h" // template // using TPair = TTuple; template class TPair { public: KeyType First; ValueType Second; FORCEINLINE KeyType& Key() { return First; } FORCEINLINE const KeyType& Key() const { return First; } FORCEINLINE ValueType& Value() { return Second; } FORCEINLINE const ValueType& Value() const { return Second; } }; template class TMap { public: typedef TPair ElementType; public: TSet Pairs; public: class FBaseIterator { private: TMap& IteratedMap; TSet::FBaseIterator SetIt; public: FBaseIterator(TMap& InMap, TSet::FBaseIterator InSet) : IteratedMap(InMap) , SetIt(InSet) { } FORCEINLINE TMap::FBaseIterator operator++() { ++SetIt; return *this; } FORCEINLINE TMap::ElementType& operator*() { return *SetIt; } FORCEINLINE const TMap::ElementType& operator*() const { return *SetIt; } FORCEINLINE bool operator==(const TMap::FBaseIterator& Other) const { return SetIt == Other.SetIt; } FORCEINLINE bool operator!=(const TMap::FBaseIterator& Other) const { return SetIt != Other.SetIt; } FORCEINLINE bool IsElementValid() const { return SetIt.IsElementValid(); } }; FORCEINLINE TMap::FBaseIterator begin() { return TMap::FBaseIterator(*this, Pairs.begin()); } FORCEINLINE const TMap::FBaseIterator begin() const { return TMap::FBaseIterator(*this, Pairs.begin()); } FORCEINLINE TMap::FBaseIterator end() { return TMap::FBaseIterator(*this, Pairs.end()); } FORCEINLINE const TMap::FBaseIterator end() const { return TMap::FBaseIterator(*this, Pairs.end()); } FORCEINLINE ValueType& operator[](const KeyType& Key) { return this->GetByKey(Key); } FORCEINLINE const ValueType& operator[](const KeyType& Key) const { return this->GetByKey(Key); } FORCEINLINE int32 Num() const { return Pairs.Num(); } FORCEINLINE bool IsValid() const { return Pairs.IsValid(); } FORCEINLINE bool IsIndexValid(int32 IndexToCheck) const { return Pairs.IsIndexValid(IndexToCheck); } FORCEINLINE bool Contains(const KeyType& ElementToLookFor) const { for (auto Element : *this) { if (Element.Key() == ElementToLookFor) return true; } return false; } FORCEINLINE ValueType& GetByKey(const KeyType& Key) { for (auto Pair : *this) { if (Pair.Key() == Key) { return Pair.Value(); } } } FORCEINLINE ValueType& Find(const KeyType& Key) { return GetByKey(Key); } FORCEINLINE ValueType GetByKeyNoRef(const KeyType& Key) { for (auto Pair : *this) { if (Pair.Key() == Key) { return Pair.Value(); } } } };