Сделал важное изменение. Заменил пассивные данных mVerPos и mVerSize (которые вычислялись сверху) на ключ по которому данные ищутся в файле, в псевдокоде для простоты строка
C++ (Qt)
struct Target {
..
QString mFullFileName; // полное имя файла данных
Geometry * mGeometryList; // список данных
};
struct Geometry {
Geometry * mPrev, * mNext; // двусвязный спысок
...
QString mDataKey; // ключ для поиска данных в файле
Container * mData; // данные (потенциально большие)
};
Ладно, решил действовать стандартно, использовать связку shared+weak. Выходит такая конструкция
C++ (Qt)
// ключ - тот что выше, значение - загруженные данные
typedef QMap<QString, QWeakPointer<Container> > TContainerMap;
// ключ - полное имя файла, значение - мапа выше
typedef QMap<QString, TContainerMap> TFileMap;
// глобальная мапа
TFileMap theFileMap;
// этот метод лазит по мапам
// возвращает имеющийся шаред или создает новый (с нулевыми данными)
static QSharedPointer<Container> Geometry::Make( const QString & keyFile, const QString & keyData );
Теперь копирование и удаление работают (правда остаются orphan weak, ну это не горит). Хуже с самой зарядкой данных (загрузкой их из файлов). Приходится делать так:
- собрать все Target'ы использующие данный файл (дорого)
- зачистить шаред во всех принадлежащих им Geometry
- открыть файл и для всех Geometry вызвать Make - если данные ненулевые то они уже загружены кем-то из шарящих. Иначе (контейнер пуст) найти данные в файле и загрузить в контейнер
Это работает, но "поиск всех" (по всем имеющимся данным) не выглядит хорошо. Как можно это улучшить?