Поддержка общих таблиц для Nim. Используйте обычные не управляемые сборщиком мусора ключи и значения, иначе у вас возникнут проблемы. Использует единственный замок для защиты таблицы, приветствуются бесключевые реализации, но если конфликт блокировки настолько высок, что вам нужна бесключевая хэш-таблица, вы делаете что-то не так.
proc mget[A, B](t: var SharedTable[A, B]; key: A): var B
Извлекает значение по t[key]. Значение может быть изменено. Если key отсутствует в t, возникает исключение KeyError. ИсточникИзменить
proc mgetOrPut[A, B](t: var SharedTable[A, B]; key: A; val: B): var B
Извлекает значение по t[key] или вставляет val, если отсутствует, в любом случае возвращая изменяемое значение. Примечание: Это изначально небезопасно в контексте многопоточности, так как возвращает указатель на B. ИсточникИзменить
proc withKey[A, B](t: var SharedTable[A, B]; key: A;
mapper: proc (key: A; val: var B; pairExists: var bool))
Вычисляет новое отображение для key с помощью указанной процедуры mapper.
Процедура mapper принимает 3 аргумента:
key - текущий ключ, если он существует, или ключ, переданный withKey в противном случае;
val - текущее значение, если ключ существует, или значение по умолчанию для типа в противном случае;
pairExists - true если ключ существует, false в противном случае.
Процедура mapper может изменять значения val и pairExists для изменения отображения ключа или удаления его из таблицы. При добавлении значения убедитесь, что вы установили pairExists в true вместе с изменением val.
Операция выполняется атомарно, и другие операции с таблицей будут заблокированы во время вызова mapper так что она должна быть короткой и простой.
Пример использования:
# If value exists, decrement it.
# If it becomes zero or less, delete the key
t.withKey(1'i64) do (k: int64, v: var int, pairExists: var bool):
if pairExists:
dec v
if v <= 0:
pairExists = false