94 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
#pragma once
 | 
						|
 | 
						|
#if !defined(MIJIN_CONTAINER_MAP_VIEW_HPP_INCLUDED)
 | 
						|
#define MIJIN_CONTAINER_MAP_VIEW_HPP_INCLUDED 1
 | 
						|
 | 
						|
#include <unordered_map>
 | 
						|
 | 
						|
namespace mijin
 | 
						|
{
 | 
						|
 | 
						|
//
 | 
						|
// public defines
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// public constants
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// public types
 | 
						|
//
 | 
						|
 | 
						|
template<typename TKey, typename TValue, typename TMap = std::unordered_map<TKey, TValue>>
 | 
						|
struct MapView
 | 
						|
{
 | 
						|
private:
 | 
						|
    TMap& map;
 | 
						|
public:
 | 
						|
    MapView() = delete;
 | 
						|
    MapView(const MapView&) = default;
 | 
						|
    MapView(MapView&&) noexcept = default;
 | 
						|
    inline MapView(TMap& map_) : map(map_) {}
 | 
						|
 | 
						|
    MapView& operator=(const MapView&) = default;
 | 
						|
    MapView& operator=(MapView&&) noexcept = default;
 | 
						|
    
 | 
						|
    [[nodiscard]] TValue& operator[](const TKey& key)
 | 
						|
    {
 | 
						|
        return at(key);
 | 
						|
    }
 | 
						|
    [[nodiscard]] const TValue& operator[](const TKey& key) const
 | 
						|
    {
 | 
						|
        return at(key);
 | 
						|
    }
 | 
						|
 | 
						|
    [[nodiscard]] TValue& at(const TKey& key)
 | 
						|
    {
 | 
						|
        return map.at(key);
 | 
						|
    }
 | 
						|
 | 
						|
    [[nodiscard]] const TValue& at(const TKey& key) const
 | 
						|
    {
 | 
						|
        return map.at(key);
 | 
						|
    }
 | 
						|
 | 
						|
    [[nodiscard]] auto begin() const
 | 
						|
    {
 | 
						|
        return map.begin();
 | 
						|
    }
 | 
						|
 | 
						|
    [[nodiscard]] auto begin()
 | 
						|
    {
 | 
						|
        return map.begin();
 | 
						|
    }
 | 
						|
 | 
						|
    [[nodiscard]] auto end()
 | 
						|
    {
 | 
						|
        return map.end();
 | 
						|
    }
 | 
						|
    
 | 
						|
    [[nodiscard]] auto end() const
 | 
						|
    {
 | 
						|
        return map.end();
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
// template<typename TKey, typename TValue, template<typename, typename, typename...> typename TMap>
 | 
						|
// MapView(TMap<TKey, TValue>& map) -> MapView<TKey, TValue, TMap<TKey, TValue>>;
 | 
						|
 | 
						|
template<typename TMap>
 | 
						|
MapView(TMap& map) -> MapView<typename TMap::key_type, typename TMap::mapped_type, TMap>;
 | 
						|
 | 
						|
template<typename TMap>
 | 
						|
MapView(const TMap& map) -> MapView<typename TMap::key_type, const typename TMap::mapped_type, const TMap>;
 | 
						|
 | 
						|
//
 | 
						|
// public functions
 | 
						|
//
 | 
						|
 | 
						|
} // namespace mijin
 | 
						|
 | 
						|
#endif // !defined(MIJIN_CONTAINER_MAP_VIEW_HPP_INCLUDED)
 |