/*
 * Created by Brett on 31/03/23.
 * Licensed under GNU General Public License V3.0
 * See LICENSE file for license detail
 */

#ifndef BLT_HASH_MAP_H
#define BLT_HASH_MAP_H

namespace blt
{

//    template<typename K, typename V, typename Hash = std::hash<K>, typename Eq = std::equal_to<K>>
//    class hashmap
//    {
//        private:
//
//        public:
//
//    };

}

#ifndef HASHMAP
    #if defined __has_include && __has_include(<parallel_hashmap/phmap.h>)
        
        #include <parallel_hashmap/phmap.h>
        #include <parallel_hashmap/phmap_fwd_decl.h>

namespace blt
{
    template<class K, class V,
            class Hash  = phmap::priv::hash_default_hash <K>,
            class Eq    = phmap::priv::hash_default_eq <K>,
            class Alloc = phmap::priv::Allocator <phmap::priv::Pair<const K, V>>>
    using hashmap_t = phmap::flat_hash_map<K, V, Hash, Eq, Alloc>;
    template<class T,
            class Hash  = phmap::priv::hash_default_hash <T>,
            class Eq    = phmap::priv::hash_default_eq <T>,
            class Alloc = phmap::priv::Allocator <T>>
    using hashset_t = phmap::flat_hash_set<T, Hash, Eq, Alloc>;
}
    #else
        #include <unordered_map>
        #include <unordered_set>
namespace blt {

    template<typename K, typename V,
        typename Hash = std::hash<K>,
        typename Eq = std::equal_to<K>,
        typename Alloc = std::allocator<std::pair<const K, V>>>
    using hashmap_t = std::unordered_map<K, V, Hash, Eq, Alloc>;
    
    template<typename K,
        typename Hash = std::hash<K>,
        typename Eq = std::equal_to<K>,
        typename Alloc = std::allocator<K>>
    using hashset_t = std::unordered_set<K, Hash, Eq, Alloc>;
}
    #endif
#endif

#endif //BLT_HASH_MAP_H