sharedtables
Поддержка общих таблиц для Nim. Используйте обычные ключи и значения без сборки мусора, иначе у вас возникнут проблемы. Используется единственный замок для защиты таблицы, приветствуются реализации без блокировок, но если конфликт блокировок настолько высок, что вам нужна хеш-таблица без блокировок, вы делаете что-то не так.
Нестабильный API.
Импорты
- hashes, math, locks
Типы
SharedTable[A; B] = object data: KeyValuePairSeq[A, B] counter, dataLen: int lock: Lock
- обобщенная хеш-таблица SharedTable Исходный код Редактировать
Процедуры
proc rightSize(count: Natural): int {...}{.inline, deprecated: "Deprecated since 1.4.0", raises: [], tags: [].}-
Устаревшее начиная с Nim v1.4.0, оно больше не нужно, потому что выбор правильного размера выполняется внутри.
Возвращает значение
initialSizeдля поддержкиcountэлементов.Если ожидается добавление большего количества элементов, просто добавьте ожидаемое дополнительное количество к параметру перед вызовом этой функции.
Исходный код Редактировать 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 hasKeyOrPut[A, B](t: var SharedTable[A, B]; key: A; val: B): bool
- возвращает true, если
keyнаходится в таблице, в противном случае вставляетvalue. Исходный код Редактировать 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Исходный код Редактировать -
proc `[]=`[A, B](t: var SharedTable[A, B]; key: A; val: B)
- помещает пару (ключ, значение) в
t. Исходный код Редактировать proc add[A, B](t: var SharedTable[A, B]; key: A; val: B)
- помещает новую пару (ключ, значение) в
t, даже еслиt[key]уже существует. Это может привести к дублированию ключей в таблице! Исходный код Редактировать proc del[A, B](t: var SharedTable[A, B]; key: A)
- удаляет
keyиз хеш-таблицыt. Исходный код Редактировать proc len[A, B](t: var SharedTable[A, B]): int
- количество элементов в
tИсходный код Редактировать proc init[A, B](t: var SharedTable[A, B]; initialSize = 32)
-
создает новую пустую хеш-таблицу.
Эту процедуру необходимо вызвать перед любым другим использованием
Исходный код Редактироватьt. proc deinitSharedTable[A, B](t: var SharedTable[A, B])
- Исходный код Редактировать
Шаблоны
template withValue[A; B](t: var SharedTable[A, B]; key: A; value, body: untyped)
- извлекает значение по
t[key].valueможет быть изменено в рамках вызоваwithValue.sharedTable.withValue(key, value) do: # block is executed only if ``key`` in ``t`` # value is threadsafe in block value.name = "username" value.uid = 1000
Исходный код Редактировать template withValue[A; B](t: var SharedTable[A, B]; key: A; value, body1, body2: untyped)- извлекает значение по
t[key].valueможет быть изменено в рамках вызоваwithValue.sharedTable.withValue(key, value) do: # block is executed only if ``key`` in ``t`` # value is threadsafe in block value.name = "username" value.uid = 1000 do: # block is executed when ``key`` not in ``t`` raise newException(KeyError, "Key not found")
Исходный код Редактировать
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/sharedtables.html