Spec-Zone.ru › Nim

std/sharedtables

Источник Изменить
Устарело

Поддержка общих таблиц для Nim. Используйте обычные не управляемые сборщиком мусора ключи и значения, иначе у вас возникнут проблемы. Использует единственный замок для защиты таблицы, приветствуются бесключевые реализации, но если конфликт блокировки настолько высок, что вам нужна бесключевая хэш-таблица, вы делаете что-то не так.

Нестабильный API.

Импорты

hashes, math, locks, outparams

Типы

SharedTable[A; B] = object
обобщенная хэш-таблица SharedTable Источник Изменить

Константы

defaultInitialSize = 32
Источник Изменить

Процедуры

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 deinitSharedTable[A, B](t: var SharedTable[A, B])
Источник Изменить
proc del[A, B](t: var SharedTable[A, B]; key: A)
Удаляет key из хэш-таблицы t. Источник Изменить
proc hasKeyOrPut[A, B](t: var SharedTable[A, B]; key: A; val: B): bool
Возвращает true, если key находится в таблице, иначе вставляет value. Источник Изменить
proc init[A, B](t: var SharedTable[A, B]; initialSize = 32)

Создает новую пустую хэш-таблицу.

Эта процедура должна быть вызвана перед любым другим использованием t.

Источник Изменить
proc len[A, B](t: var SharedTable[A, B]): int
Количество элементов в t. Источник Изменить
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 аргумента:

  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
Источник Изменить

Шаблоны

template withValue[A, B](t: var SharedTable[A, B]; key: A;
                         value, body1, body2: untyped)
Извлекает значение по t[key]. value может быть изменено в рамках вызова withValue.

Пример:

var table: SharedTable[string, string]
init(table)

table["a"] = "x"
table["b"] = "y"
table["c"] = "z"


table.withValue("a", value):
  value[] = "m"

var flag = false
table.withValue("d", value):
  discard value
  doAssert false
do: # if "d" notin table
  flag = true

if flag:
  table["d"] = "n"

assert table.mget("a") == "m"
assert table.mget("d") == "n"
Источник Изменить
template withValue[A, B](t: var SharedTable[A, B]; key: A; value, body: untyped)
Извлекает значение по t[key]. value может быть изменено в рамках вызова withValue .

Пример:

var table: SharedTable[string, string]
init(table)

table["a"] = "x"
table["b"] = "y"
table["c"] = "z"

table.withValue("a", value):
  assert value[] == "x"

table.withValue("b", value):
  value[] = "modified"

table.withValue("b", value):
  assert value[] == "modified"

table.withValue("nonexistent", value):
  assert false # not called
Источник Изменить

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/sharedtables.html

Spec-Zone.ru

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