Spec-Zone.ru › Nim 1

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: [].}
Устаревшее: Устаревшее начиная с 1.4.0

Устаревшее начиная с 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 аргумента:

  1. key - текущий ключ, если он существует, или ключ, переданный в withKey в противном случае;
  2. val - текущее значение, если ключ существует, или значение по умолчанию для типа в противном случае;
  3. 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API