Я создал абстрактный словарь на фортране, который может удовлетворить ваши потребности.
См .: https://github.com/zerothi/fdict
В основном это позволяет вам
type(dict) :: dic, dic2
dic = ('KEY'.kv.1)
dic = dic //('next'.kv. (/3.,5.,6./))
dic = dic //('string'.kv.'Hello world')
dic2 = ('string2'.kv.'Test')
dic = dic // ('dic2'.kvp.dic2)
Там, где вы можете сохранить все внутренние типы, и его можно легко расширить, чтобы он содержал другие типы данных, он по умолчанию изначально содержит себя в качестве другого значения. (последняя строка сохраняет словарь в качестве указателя)
Это обозначает .kv. == key : value
, что является глубокой копией, и
.kvp. == key : pointer
, который является справочной копией.
Таким образом, вы можете хранить огромные данные без необходимости дублировать данные и извлекать указатель на более позднем этапе.
Чтобы развить эту идею, все данные хранятся в виде адресных указателей с использованием вызова transfer
из производного типа, содержащего указатель данных. Таким образом, вы обманываете компилятор, чтобы передать вам адрес производного типа от fortran, но вынуждает его получать его точно таким же образом.
С помощью .kv.
указатель типа данных выделяется и впоследствии указывается контейнером данных, после чего назначенный указатель nullify
определяется и теряется , что вынуждает пользователя знать, что они делаю (в нем нет сборщика мусора;)).
По .kvp.
указатель сохраняется напрямую, без дублирования памяти.
Приятно то, что он совместим с fortran90.