| 2083 | } |
| 2084 | |
| 2085 | std::vector<WorkspaceObject> Workspace_Impl::nominallyRemoveObject(const Handle& handle) { |
| 2086 | // get object. should exist since call came from within Workspace. |
| 2087 | OptionalWorkspaceObject oObject = getObject(handle); |
| 2088 | if (!oObject) { |
| 2089 | OS_ASSERT(oObject); |
| 2090 | } |
| 2091 | WorkspaceObject_ImplPtr objectImplPtr = oObject->getImpl<WorkspaceObject_Impl>(); |
| 2092 | |
| 2093 | // unlink from other objects |
| 2094 | // handle -> others |
| 2095 | UnsignedVector ptrFields = objectImplPtr->objectListFields(); |
| 2096 | for (unsigned index : ptrFields) { |
| 2097 | objectImplPtr->setPointer(index, Handle(), false); |
| 2098 | } |
| 2099 | // others -> handle |
| 2100 | WorkspaceObjectVector sources; |
| 2101 | ReversePointerSet pointers = objectImplPtr->getReversePointers(); |
| 2102 | for (const ReversePointer& ptr : pointers) { |
| 2103 | OptionalWorkspaceObject source = getObject(ptr.sourceHandle); |
| 2104 | // OS_ASSERT(sourceImplPtr); |
| 2105 | if (source) { |
| 2106 | source->getImpl<WorkspaceObject_Impl>()->setPointer(ptr.fieldIndex, Handle(), false); |
| 2107 | sources.push_back(*source); |
| 2108 | } else { |
| 2109 | OptionalString objectName = objectImplPtr->name(); |
| 2110 | if (objectName) { |
| 2111 | LOG(Debug, "Object of type '" << objectImplPtr->iddObject().name() << "' named '" << *objectName |
| 2112 | << "' has a reverse pointer that cannot be followed."); |
| 2113 | } else { |
| 2114 | LOG(Debug, "Object of type '" << objectImplPtr->iddObject().name() << "' has a reverse pointer that cannot be followed."); |
| 2115 | } |
| 2116 | } |
| 2117 | } |
| 2118 | |
| 2119 | // IdfReferencesMap |
| 2120 | StringVector references = objectImplPtr->iddObject().references(); |
| 2121 | for (const std::string& reference : references) { |
| 2122 | auto irmLoc = m_idfReferencesMap.find(reference); |
| 2123 | OS_ASSERT(irmLoc != m_idfReferencesMap.end()); |
| 2124 | auto loc = irmLoc->second.find(handle); |
| 2125 | OS_ASSERT(loc != irmLoc->second.end()); |
| 2126 | irmLoc->second.erase(loc); |
| 2127 | // erase entry if set is empty |
| 2128 | if (irmLoc->second.empty()) { |
| 2129 | m_idfReferencesMap.erase(irmLoc); |
| 2130 | } |
| 2131 | } |
| 2132 | |
| 2133 | // IddObjectTypeMap |
| 2134 | auto iotmLoc = m_iddObjectTypeMap.find(objectImplPtr->iddObject().type()); |
| 2135 | OS_ASSERT(iotmLoc != m_iddObjectTypeMap.end()); |
| 2136 | auto loc = iotmLoc->second.find(handle); |
| 2137 | OS_ASSERT(loc != iotmLoc->second.end()); |
| 2138 | iotmLoc->second.erase(loc); |
| 2139 | // erase entry if set is empty |
| 2140 | if (iotmLoc->second.empty()) { |
| 2141 | m_iddObjectTypeMap.erase(iotmLoc); |
| 2142 | } |
nothing calls this directly
no test coverage detected