@@ -1155,57 +1155,64 @@ Event* Module::addEvent(Event* curr) {
11551155
11561156void Module::addStart (const Name& s) { start = s; }
11571157
1158- void Module::removeFunctionType (Name name) {
1159- for (size_t i = 0 ; i < functionTypes.size (); i++) {
1160- if (functionTypes[i]->name == name) {
1161- functionTypes.erase (functionTypes.begin () + i);
1158+ template <typename Vector, typename Map>
1159+ void removeModuleElement (Vector& v, Map& m, Name name) {
1160+ m.erase (name);
1161+ for (size_t i = 0 ; i < v.size (); i++) {
1162+ if (v[i]->name == name) {
1163+ v.erase (v.begin () + i);
11621164 break ;
11631165 }
11641166 }
1165- functionTypesMap.erase (name);
11661167}
11671168
1169+ void Module::removeFunctionType (Name name) {
1170+ removeModuleElement (functionTypes, functionTypesMap, name);
1171+ }
11681172void Module::removeExport (Name name) {
1169- for (size_t i = 0 ; i < exports.size (); i++) {
1170- if (exports[i]->name == name) {
1171- exports.erase (exports.begin () + i);
1172- break ;
1173- }
1174- }
1175- exportsMap.erase (name);
1173+ removeModuleElement (exports, exportsMap, name);
11761174}
1177-
11781175void Module::removeFunction (Name name) {
1179- for (size_t i = 0 ; i < functions.size (); i++) {
1180- if (functions[i]->name == name) {
1181- functions.erase (functions.begin () + i);
1182- break ;
1183- }
1184- }
1185- functionsMap.erase (name);
1176+ removeModuleElement (functions, functionsMap, name);
11861177}
1187-
11881178void Module::removeGlobal (Name name) {
1189- for (size_t i = 0 ; i < globals.size (); i++) {
1190- if (globals[i]->name == name) {
1191- globals.erase (globals.begin () + i);
1192- break ;
1193- }
1194- }
1195- globalsMap.erase (name);
1179+ removeModuleElement (globals, globalsMap, name);
11961180}
1197-
11981181void Module::removeEvent (Name name) {
1199- for (size_t i = 0 ; i < events.size (); i++) {
1200- if (events[i]->name == name) {
1201- events.erase (events.begin () + i);
1202- break ;
1182+ removeModuleElement (events, eventsMap, name);
1183+ }
1184+
1185+ template <typename Vector, typename Map, typename Elem>
1186+ void removeModuleElements (Vector& v,
1187+ Map& m,
1188+ std::function<bool (Elem* elem)> pred) {
1189+ for (auto it = m.begin (); it != m.end ();) {
1190+ if (pred (it->second )) {
1191+ it = m.erase (it);
1192+ } else {
1193+ it++;
12031194 }
12041195 }
1205- eventsMap.erase (name);
1196+ v.erase (
1197+ std::remove_if (v.begin (), v.end (), [&](auto & e) { return pred (e.get ()); }),
1198+ v.end ());
12061199}
12071200
1208- // TODO: remove* for other elements
1201+ void Module::removeFunctionTypes (std::function<bool (FunctionType*)> pred) {
1202+ removeModuleElements (functionTypes, functionTypesMap, pred);
1203+ }
1204+ void Module::removeExports (std::function<bool (Export*)> pred) {
1205+ removeModuleElements (exports, exportsMap, pred);
1206+ }
1207+ void Module::removeFunctions (std::function<bool (Function*)> pred) {
1208+ removeModuleElements (functions, functionsMap, pred);
1209+ }
1210+ void Module::removeGlobals (std::function<bool (Global*)> pred) {
1211+ removeModuleElements (globals, globalsMap, pred);
1212+ }
1213+ void Module::removeEvents (std::function<bool (Event*)> pred) {
1214+ removeModuleElements (events, eventsMap, pred);
1215+ }
12091216
12101217void Module::updateMaps () {
12111218 functionsMap.clear ();
0 commit comments