12 #include <unordered_map> 18 template <
class Key,
class Item,
class KeyHash = std::hash<Key>>
27 std::size_t
size()
const;
32 std::size_t
id(
const Key & key)
const;
41 bool idExists(
const std::size_t
id)
const;
46 const Item &
item(
const std::size_t
id)
const;
63 template <
typename CreateItem>
64 std::size_t
registerItem(
const Key & key, CreateItem & create_item);
70 std::unordered_map<Key, std::size_t, KeyHash>
_key_to_id;
82 template <
class Key,
class Item,
class KeyHash>
87 template <
class Key,
class Item,
class KeyHash>
91 std::lock_guard<std::mutex> lock(_id_to_item_mutex);
92 return _id_to_item.size();
95 template <
class Key,
class Item,
class KeyHash>
99 std::lock_guard<std::mutex> lock(_key_to_id_mutex);
100 const auto it = _key_to_id.find(key);
101 if (it == _key_to_id.end())
102 mooseError(_name,
": Key '", key,
"' is not registered");
106 template <
class Key,
class Item,
class KeyHash>
110 std::lock_guard<std::mutex> lock(_key_to_id_mutex);
111 return _key_to_id.count(key);
114 template <
class Key,
class Item,
class KeyHash>
118 std::lock_guard<std::mutex> lock(_id_to_item_mutex);
119 return id < _id_to_item.size();
122 template <
class Key,
class Item,
class KeyHash>
126 std::lock_guard<std::mutex> lock(_id_to_item_mutex);
127 return itemNonLocking(
id);
130 template <
class Key,
class Item,
class KeyHash>
134 if (
id >= _id_to_item.size())
135 mooseError(_name,
": ID '",
id,
"' is not registered");
136 return _id_to_item[id];
139 template <
class Key,
class Item,
class KeyHash>
140 template <
typename CreateItem>
144 std::lock_guard<std::mutex> lock_key(_key_to_id_mutex);
147 const auto it = _key_to_id.find(key);
148 if (it != _key_to_id.end())
152 std::lock_guard<std::mutex> lock_id(_id_to_item_mutex);
153 const auto id = _id_to_item.size();
154 _key_to_id.emplace(key,
id);
155 _id_to_item.emplace_back(std::move(create_item(
id)));
std::string name(const ElemQuality q)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
const Item & itemNonLocking(const std::size_t id) const
std::mutex _key_to_id_mutex
Mutex for locking access to _key_to_id NOTE: These can be changed to shared_mutexes once we get C++17...
const std::string _name
The name of this registry; used in error handling.
std::unordered_map< Key, std::size_t, KeyHash > _key_to_id
Map of keys to IDs.
bool idExists(const std::size_t id) const
std::size_t id(const Key &key) const
const Item & item(const std::size_t id) const
std::deque< Item > _id_to_item
Vector of IDs to Items.
std::size_t registerItem(const Key &key, CreateItem &create_item)
Registers an item with key key if said key does not exist.
std::mutex _id_to_item_mutex
Mutex for locking access to _id_to_item NOTE: These can be changed to shared_mutexes once we get C++1...
bool keyExists(const Key &key) const
GeneralRegistry(const std::string &name)