Jit/containers.h (119 lines of code) (raw):
// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
/*
* Type-aliases for map and set containers. This acts as a shim to allow
* swapping between STL, phmap, and one day other container implementations.
*
* While phmap types can be used as an exact drop-in for STL, it includes more
* optimized containers that can be used if you do not need pointer-stability.
* That is, pointers to container content will be invalidated on container
* mutation. To this end the "base" types here (Set, Map, OrderedSet,
* OrderedMap) do not provide pointer-stability. If you need this, use the
* StablePointer variants where available.
*
* Additionally the StablePointer* variants may have better performance if the
* contained values are more than 100 bytes or so. This arises as they will not
* be moving so much data around when rebalancing etc.
*
* The phmap Big* variants may have better performance if the number of
* contained elements is very large. I haven't played with them but apparently
* they might take advantage of multi-threading?
*/
#pragma once
//#define JIT_FORCE_STL_CONTAINERS
#ifdef JIT_FORCE_STL_CONTAINERS
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#else
#include "parallel_hashmap/btree.h"
#include "parallel_hashmap/phmap.h"
#endif
namespace jit {
#define SET_TEMPLATE_PARAMS <Key, Hash, KeyEqual, Allocator>
#define SET_ORDERED_TEMPLATE_PARAMS <Key, Compare, Allocator>
#define MAP_TEMPLATE_PARAMS <Key, T, Hash, KeyEqual, Allocator>
#define MAP_ORDERED_TEMPLATE_PARAMS <Key, T, Compare, Allocator>
#ifdef JIT_FORCE_STL_CONTAINERS
#define SET_TEMPLATE_ARGS \
template < \
class Key, \
class Hash = std::hash<Key>, \
class KeyEqual = std::equal_to<Key>, \
class Allocator = std::allocator<Key>>
#define SET_ORDERED_TEMPLATE_ARGS \
template < \
class Key, \
class Compare = std::less<Key>, \
class Allocator = std::allocator<Key>>
#define MAP_TEMPLATE_ARGS \
template < \
class Key, \
class T, \
class Hash = std::hash<Key>, \
class KeyEqual = std::equal_to<Key>, \
class Allocator = std::allocator<std::pair<const Key, T>>>
#define MAP_ORDERED_TEMPLATE_ARGS \
template < \
class Key, \
class T, \
class Compare = std::less<Key>, \
class Allocator = std::allocator<std::pair<const Key, T>>>
SET_TEMPLATE_ARGS using UnorderedSet = std::unordered_set SET_TEMPLATE_PARAMS;
MAP_TEMPLATE_ARGS using UnorderedMap = std::unordered_map MAP_TEMPLATE_PARAMS;
SET_TEMPLATE_ARGS using UnorderedStablePointerSet =
std::unordered_set SET_TEMPLATE_PARAMS;
MAP_TEMPLATE_ARGS using UnorderedStablePointerMap =
std::unordered_map MAP_TEMPLATE_PARAMS;
SET_TEMPLATE_ARGS using UnorderedBigSet =
std::unordered_set SET_TEMPLATE_PARAMS;
MAP_TEMPLATE_ARGS using UnorderedBigMap =
std::unordered_map MAP_TEMPLATE_PARAMS;
SET_TEMPLATE_ARGS using UnorderedBigStablePointerSet =
std::unordered_set SET_TEMPLATE_PARAMS;
MAP_TEMPLATE_ARGS using UnorderedBigStablePointerMap =
std::unordered_map MAP_TEMPLATE_PARAMS;
SET_ORDERED_TEMPLATE_ARGS using OrderedSet =
std::set SET_ORDERED_TEMPLATE_PARAMS;
MAP_ORDERED_TEMPLATE_ARGS using OrderedMap =
std::map MAP_ORDERED_TEMPLATE_PARAMS;
SET_ORDERED_TEMPLATE_ARGS using OrderedMultiset =
std::multiset SET_ORDERED_TEMPLATE_PARAMS;
MAP_ORDERED_TEMPLATE_ARGS using OrderedMultimap =
std::multimap MAP_ORDERED_TEMPLATE_PARAMS;
#else // JIT_FORCE_STL_CONTAINERS
#define SET_TEMPLATE_ARGS \
template < \
class Key, \
class Hash = phmap::priv::hash_default_hash<Key>, \
class KeyEqual = phmap::priv::hash_default_eq<Key>, \
class Allocator = phmap::priv::Allocator<Key>>
#define SET_ORDERED_TEMPLATE_ARGS \
template < \
class Key, \
class Compare = phmap::Less<Key>, \
class Allocator = phmap::Allocator<Key>>
#define MAP_TEMPLATE_ARGS \
template < \
class Key, \
class T, \
class Hash = std::hash<Key>, \
class KeyEqual = std::equal_to<Key>, \
class Allocator = std::allocator<std::pair<const Key, T>>>
#define MAP_ORDERED_TEMPLATE_ARGS \
template < \
class Key, \
class T, \
class Compare = phmap::Less<Key>, \
class Allocator = phmap::Allocator<phmap::priv::Pair<const Key, T>>>
SET_TEMPLATE_ARGS using UnorderedSet = phmap::flat_hash_set SET_TEMPLATE_PARAMS;
MAP_TEMPLATE_ARGS using UnorderedMap = phmap::flat_hash_map MAP_TEMPLATE_PARAMS;
SET_TEMPLATE_ARGS using UnorderedStablePointerSet =
phmap::node_hash_set SET_TEMPLATE_PARAMS;
MAP_TEMPLATE_ARGS using UnorderedStablePointerMap =
phmap::node_hash_map MAP_TEMPLATE_PARAMS;
SET_TEMPLATE_ARGS using UnorderedBigSet =
phmap::parallel_flat_hash_set SET_TEMPLATE_PARAMS;
MAP_TEMPLATE_ARGS using UnorderedBigMap =
phmap::parallel_flat_hash_map MAP_TEMPLATE_PARAMS;
SET_TEMPLATE_ARGS using UnorderedBigStablePointerSet =
phmap::parallel_node_hash_set SET_TEMPLATE_PARAMS;
MAP_TEMPLATE_ARGS using UnorderedBigStablePointerMap =
phmap::parallel_node_hash_map MAP_TEMPLATE_PARAMS;
SET_ORDERED_TEMPLATE_ARGS using OrderedSet =
phmap::btree_set SET_ORDERED_TEMPLATE_PARAMS;
MAP_ORDERED_TEMPLATE_ARGS using OrderedMap =
phmap::btree_map MAP_ORDERED_TEMPLATE_PARAMS;
SET_ORDERED_TEMPLATE_ARGS using OrderedMultiset =
phmap::btree_multiset SET_ORDERED_TEMPLATE_PARAMS;
MAP_ORDERED_TEMPLATE_ARGS using OrderedMultimap =
phmap::btree_multimap MAP_ORDERED_TEMPLATE_PARAMS;
#endif
#undef SET_TEMPLATE_PARAMS
#undef SET_ORDERED_TEMPLATE_PARAMS
#undef MAP_TEMPLATE_PARAMS
#undef MAP_ORDERED_TEMPLATE_PARAMS
#undef SET_TEMPLATE_ARGS
#undef SET_ORDERED_TEMPLATE_ARGS
#undef MAP_TEMPLATE_ARGS
#undef MAP_ORDERED_TEMPLATE_ARGS
}; // namespace jit