| 107 | */ |
| 108 | template<typename Folder, typename Entity> |
| 109 | static void sanitizeFolderTree(std::vector<Folder>& folders, std::vector<Entity>& entities) |
| 110 | { |
| 111 | QHash<int, int> parentOf; |
| 112 | QSet<int> validFolders; |
| 113 | for (const auto& f : std::as_const(folders)) { |
| 114 | validFolders.insert(f.folderId); |
| 115 | parentOf.insert(f.folderId, f.parentFolderId); |
| 116 | } |
| 117 | |
| 118 | for (auto& f : folders) { |
| 119 | if (f.parentFolderId != -1 && !validFolders.contains(f.parentFolderId)) { |
| 120 | f.parentFolderId = -1; |
| 121 | continue; |
| 122 | } |
| 123 | |
| 124 | QSet<int> seen; |
| 125 | int p = f.parentFolderId; |
| 126 | const int kMax = static_cast<int>(folders.size()); |
| 127 | for (int i = 0; i < kMax && p != -1; ++i) { |
| 128 | if (p == f.folderId || seen.contains(p)) { |
| 129 | f.parentFolderId = -1; |
| 130 | break; |
| 131 | } |
| 132 | |
| 133 | seen.insert(p); |
| 134 | p = parentOf.value(p, -1); |
| 135 | } |
| 136 | } |
| 137 | |
| 138 | for (auto& e : entities) |
| 139 | if (e.parentFolderId != -1 && !validFolders.contains(e.parentFolderId)) |
| 140 | e.parentFolderId = -1; |
| 141 | } |
| 142 | |
| 143 | /** |
| 144 | * @brief Serializes any folder vector to a JSON array. |
no test coverage detected