Browse Source

Merge pull request #51409 from LightningAA/use-map-iterators

Use range iterators for `Map` in most cases
Rémi Verschelde 4 years ago
parent
commit
77721b35ba
100 changed files with 1134 additions and 1137 deletions
  1. 18 18
      core/config/project_settings.cpp
  2. 4 4
      core/core_bind.cpp
  3. 5 5
      core/debugger/engine_debugger.cpp
  4. 4 4
      core/debugger/local_debugger.cpp
  5. 2 2
      core/debugger/remote_debugger.cpp
  6. 3 3
      core/extension/extension_api_dump.cpp
  7. 6 6
      core/extension/native_extension_manager.cpp
  8. 7 7
      core/input/input.cpp
  9. 4 4
      core/io/file_access_pack.cpp
  10. 4 4
      core/io/ip.cpp
  11. 2 2
      core/io/resource.cpp
  12. 2 2
      core/io/resource_format_binary.cpp
  13. 2 2
      core/io/resource_loader.cpp
  14. 12 12
      core/math/quick_hull.cpp
  15. 2 2
      core/math/triangle_mesh.cpp
  16. 6 6
      core/object/message_queue.cpp
  17. 2 2
      core/object/script_language.cpp
  18. 5 5
      core/string/optimized_translation.cpp
  19. 6 6
      core/string/translation.cpp
  20. 4 4
      core/variant/variant_call.cpp
  21. 2 2
      drivers/unix/net_socket_posix.cpp
  22. 3 3
      drivers/vulkan/rendering_device_vulkan.cpp
  23. 8 8
      drivers/vulkan/vulkan_context.cpp
  24. 9 9
      editor/animation_bezier_editor.cpp
  25. 18 21
      editor/animation_track_editor.cpp
  26. 8 8
      editor/audio_stream_preview.cpp
  27. 2 2
      editor/debugger/debug_adapter/debug_adapter_parser.cpp
  28. 3 3
      editor/debugger/editor_debugger_inspector.cpp
  29. 5 5
      editor/debugger/editor_debugger_node.cpp
  30. 6 6
      editor/debugger/editor_network_profiler.cpp
  31. 8 8
      editor/debugger/editor_profiler.cpp
  32. 10 10
      editor/dependency_editor.cpp
  33. 7 7
      editor/doc_tools.cpp
  34. 2 2
      editor/editor_autoload_settings.cpp
  35. 7 7
      editor/editor_data.cpp
  36. 3 3
      editor/editor_export.cpp
  37. 3 3
      editor/editor_feature_profile.cpp
  38. 5 5
      editor/editor_file_system.cpp
  39. 9 9
      editor/editor_help.cpp
  40. 12 12
      editor/editor_inspector.cpp
  41. 8 8
      editor/editor_log.cpp
  42. 7 7
      editor/editor_node.cpp
  43. 3 3
      editor/editor_run_native.cpp
  44. 9 9
      editor/editor_settings.cpp
  45. 4 4
      editor/filesystem_dock.cpp
  46. 2 2
      editor/find_in_files.cpp
  47. 10 10
      editor/import/collada.cpp
  48. 10 10
      editor/import/editor_import_collada.cpp
  49. 4 4
      editor/import/editor_importer_bake_reset.cpp
  50. 8 8
      editor/import/resource_importer_texture.cpp
  51. 29 29
      editor/import/scene_import_settings.cpp
  52. 2 2
      editor/import/scene_importer_mesh.cpp
  53. 3 3
      editor/import_defaults_editor.cpp
  54. 5 5
      editor/plugins/animation_blend_tree_editor_plugin.cpp
  55. 7 7
      editor/plugins/asset_library_editor_plugin.cpp
  56. 18 18
      editor/plugins/canvas_item_editor_plugin.cpp
  57. 4 4
      editor/plugins/node_3d_editor_gizmos.cpp
  58. 27 27
      editor/plugins/node_3d_editor_plugin.cpp
  59. 3 3
      editor/plugins/shader_editor_plugin.cpp
  60. 5 5
      editor/plugins/theme_editor_plugin.cpp
  61. 4 4
      editor/plugins/tiles/tile_atlas_view.cpp
  62. 47 47
      editor/plugins/tiles/tile_data_editors.cpp
  63. 93 93
      editor/plugins/tiles/tile_map_editor.cpp
  64. 5 5
      editor/plugins/tiles/tile_set_atlas_source_editor.cpp
  65. 7 7
      editor/plugins/visual_shader_editor_plugin.cpp
  66. 3 3
      editor/progress_dialog.cpp
  67. 4 4
      editor/scene_tree_dock.cpp
  68. 2 2
      editor/script_create_dialog.cpp
  69. 2 2
      editor/settings_config_dialog.cpp
  70. 2 2
      modules/bullet/bullet_physics_server.cpp
  71. 2 2
      modules/bullet/shape_bullet.cpp
  72. 4 4
      modules/csg/csg.cpp
  73. 3 3
      modules/fbx/data/fbx_skeleton.cpp
  74. 17 17
      modules/fbx/editor_scene_importer_fbx.cpp
  75. 3 3
      modules/fbx/tools/validation_tools.h
  76. 9 9
      modules/gdnative/gdnative_library_editor_plugin.cpp
  77. 2 2
      modules/gdnative/nativescript/api_generator.cpp
  78. 62 62
      modules/gdnative/nativescript/nativescript.cpp
  79. 74 74
      modules/gdscript/gdscript.cpp
  80. 3 3
      modules/gdscript/gdscript_analyzer.cpp
  81. 28 28
      modules/gdscript/gdscript_byte_codegen.cpp
  82. 3 3
      modules/gdscript/gdscript_byte_codegen.h
  83. 4 4
      modules/gdscript/gdscript_compiler.cpp
  84. 19 19
      modules/gdscript/gdscript_editor.cpp
  85. 4 4
      modules/gdscript/gdscript_function.cpp
  86. 3 3
      modules/gdscript/gdscript_parser.cpp
  87. 6 6
      modules/gdscript/gdscript_utility_functions.cpp
  88. 2 2
      modules/gdscript/gdscript_vm.cpp
  89. 4 4
      modules/gdscript/language_server/gdscript_language_protocol.cpp
  90. 2 2
      modules/gdscript/language_server/gdscript_text_document.cpp
  91. 16 16
      modules/gdscript/language_server/gdscript_workspace.cpp
  92. 5 5
      modules/gdscript/language_server/lsp.hpp
  93. 2 2
      modules/gdscript/tests/test_gdscript.cpp
  94. 32 32
      modules/gltf/gltf_document.cpp
  95. 52 52
      modules/gridmap/grid_map.cpp
  96. 6 6
      modules/navigation/nav_map.cpp
  97. 83 83
      modules/text_server_adv/text_server_adv.cpp
  98. 89 89
      modules/text_server_fb/text_server_fb.cpp
  99. 16 16
      modules/visual_script/visual_script.cpp
  100. 12 12
      modules/visual_script/visual_script_editor.cpp

+ 18 - 18
core/config/project_settings.cpp

@@ -252,15 +252,15 @@ void ProjectSettings::_get_property_list(List<PropertyInfo> *p_list) const {
 
 	Set<_VCSort> vclist;
 
-	for (Map<StringName, VariantContainer>::Element *E = props.front(); E; E = E->next()) {
-		const VariantContainer *v = &E->get();
+	for (const KeyValue<StringName, VariantContainer> &E : props) {
+		const VariantContainer *v = &E.value;
 
 		if (v->hide_from_editor) {
 			continue;
 		}
 
 		_VCSort vc;
-		vc.name = E->key();
+		vc.name = E.key;
 		vc.order = v->order;
 		vc.type = v->variant.get_type();
 		if (vc.name.begins_with("input/") || vc.name.begins_with("import/") || vc.name.begins_with("export/") || vc.name.begins_with("/remap") || vc.name.begins_with("/locale") || vc.name.begins_with("/autoload")) {
@@ -318,14 +318,14 @@ bool ProjectSettings::_load_resource_pack(const String &p_pack, bool p_replace_f
 void ProjectSettings::_convert_to_last_version(int p_from_version) {
 	if (p_from_version <= 3) {
 		// Converts the actions from array to dictionary (array of events to dictionary with deadzone + events)
-		for (Map<StringName, ProjectSettings::VariantContainer>::Element *E = props.front(); E; E = E->next()) {
-			Variant value = E->get().variant;
-			if (String(E->key()).begins_with("input/") && value.get_type() == Variant::ARRAY) {
+		for (KeyValue<StringName, ProjectSettings::VariantContainer> &E : props) {
+			Variant value = E.value.variant;
+			if (String(E.key).begins_with("input/") && value.get_type() == Variant::ARRAY) {
 				Array array = value;
 				Dictionary action;
 				action["deadzone"] = Variant(0.5f);
 				action["events"] = array;
-				E->get().variant = action;
+				E.value.variant = action;
 			}
 		}
 	}
@@ -695,8 +695,8 @@ Error ProjectSettings::_save_settings_binary(const String &p_file, const Map<Str
 
 	int count = 0;
 
-	for (Map<String, List<String>>::Element *E = props.front(); E; E = E->next()) {
-		count += E->get().size();
+	for (const KeyValue<String, List<String>> &E : props) {
+		count += E.value.size();
 	}
 
 	if (p_custom_features != String()) {
@@ -788,7 +788,7 @@ Error ProjectSettings::_save_settings_text(const String &p_file, const Map<Strin
 	}
 	file->store_string("\n");
 
-	for (Map<String, List<String>>::Element *E = props.front(); E; E = E->next()) {
+	for (const Map<String, List<String>>::Element *E = props.front(); E; E = E->next()) {
 		if (E != props.front()) {
 			file->store_string("\n");
 		}
@@ -831,19 +831,19 @@ Error ProjectSettings::save_custom(const String &p_path, const CustomMap &p_cust
 	Set<_VCSort> vclist;
 
 	if (p_merge_with_current) {
-		for (Map<StringName, VariantContainer>::Element *G = props.front(); G; G = G->next()) {
-			const VariantContainer *v = &G->get();
+		for (const KeyValue<StringName, VariantContainer> &G : props) {
+			const VariantContainer *v = &G.value;
 
 			if (v->hide_from_editor) {
 				continue;
 			}
 
-			if (p_custom.has(G->key())) {
+			if (p_custom.has(G.key)) {
 				continue;
 			}
 
 			_VCSort vc;
-			vc.name = G->key(); //*k;
+			vc.name = G.key; //*k;
 			vc.order = v->order;
 			vc.type = v->variant.get_type();
 			vc.flags = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_STORAGE;
@@ -855,14 +855,14 @@ Error ProjectSettings::save_custom(const String &p_path, const CustomMap &p_cust
 		}
 	}
 
-	for (const Map<String, Variant>::Element *E = p_custom.front(); E; E = E->next()) {
+	for (const KeyValue<String, Variant> &E : p_custom) {
 		// Lookup global prop to store in the same order
-		Map<StringName, VariantContainer>::Element *global_prop = props.find(E->key());
+		Map<StringName, VariantContainer>::Element *global_prop = props.find(E.key);
 
 		_VCSort vc;
-		vc.name = E->key();
+		vc.name = E.key;
 		vc.order = global_prop ? global_prop->get().order : 0xFFFFFFF;
-		vc.type = E->get().get_type();
+		vc.type = E.value.get_type();
 		vc.flags = PROPERTY_USAGE_STORAGE;
 		vclist.insert(vc);
 	}

+ 4 - 4
core/core_bind.cpp

@@ -2411,12 +2411,12 @@ Error EngineDebugger::call_capture(void *p_user, const String &p_cmd, const Arra
 }
 
 EngineDebugger::~EngineDebugger() {
-	for (Map<StringName, Callable>::Element *E = captures.front(); E; E = E->next()) {
-		::EngineDebugger::unregister_message_capture(E->key());
+	for (const KeyValue<StringName, Callable> &E : captures) {
+		::EngineDebugger::unregister_message_capture(E.key);
 	}
 	captures.clear();
-	for (Map<StringName, ProfilerCallable>::Element *E = profilers.front(); E; E = E->next()) {
-		::EngineDebugger::unregister_profiler(E->key());
+	for (const KeyValue<StringName, ProfilerCallable> &E : profilers) {
+		::EngineDebugger::unregister_profiler(E.key);
 	}
 	profilers.clear();
 }

+ 5 - 5
core/debugger/engine_debugger.cpp

@@ -123,8 +123,8 @@ void EngineDebugger::iteration(uint64_t p_frame_ticks, uint64_t p_process_ticks,
 	physics_time = USEC_TO_SEC(p_physics_ticks);
 	physics_frame_time = p_physics_frame_time;
 	// Notify tick to running profilers
-	for (Map<StringName, Profiler>::Element *E = profilers.front(); E; E = E->next()) {
-		Profiler &p = E->get();
+	for (KeyValue<StringName, Profiler> &E : profilers) {
+		Profiler &p = E.value;
 		if (!p.active || !p.tick) {
 			continue;
 		}
@@ -179,9 +179,9 @@ void EngineDebugger::initialize(const String &p_uri, bool p_skip_breakpoints, Ve
 void EngineDebugger::deinitialize() {
 	if (singleton) {
 		// Stop all profilers
-		for (Map<StringName, Profiler>::Element *E = profilers.front(); E; E = E->next()) {
-			if (E->get().active) {
-				singleton->profiler_enable(E->key(), false);
+		for (const KeyValue<StringName, Profiler> &E : profilers) {
+			if (E.value.active) {
+				singleton->profiler_enable(E.key, false);
 			}
 		}
 

+ 4 - 4
core/debugger/local_debugger.cpp

@@ -166,8 +166,8 @@ void LocalDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) {
 
 		} else if (line.begins_with("set")) {
 			if (line.get_slice_count(" ") == 1) {
-				for (Map<String, String>::Element *E = options.front(); E; E = E->next()) {
-					print_line("\t" + E->key() + "=" + E->value());
+				for (const KeyValue<String, String> &E : options) {
+					print_line("\t" + E.key + "=" + E.value);
 				}
 
 			} else {
@@ -249,8 +249,8 @@ void LocalDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) {
 				}
 
 				print_line("Breakpoint(s): " + itos(breakpoints.size()));
-				for (Map<int, Set<StringName>>::Element *E = breakpoints.front(); E; E = E->next()) {
-					print_line("\t" + String(E->value().front()->get()) + ":" + itos(E->key()));
+				for (const KeyValue<int, Set<StringName>> &E : breakpoints) {
+					print_line("\t" + String(E.value.front()->get()) + ":" + itos(E.key));
 				}
 
 			} else {

+ 2 - 2
core/debugger/remote_debugger.cpp

@@ -179,8 +179,8 @@ public:
 		if (pt - last_profile_time > 100) {
 			last_profile_time = pt;
 			DebuggerMarshalls::NetworkProfilerFrame frame;
-			for (Map<ObjectID, NodeInfo>::Element *E = multiplayer_node_data.front(); E; E = E->next()) {
-				frame.infos.push_back(E->get());
+			for (const KeyValue<ObjectID, NodeInfo> &E : multiplayer_node_data) {
+				frame.infos.push_back(E.value);
 			}
 			multiplayer_node_data.clear();
 			EngineDebugger::get_singleton()->send_message("network:profile_frame", frame.serialize());

+ 3 - 3
core/extension/extension_api_dump.cpp

@@ -353,11 +353,11 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() {
 		api_dump["global_constants"] = constants;
 
 		Array enums;
-		for (Map<String, List<Pair<String, int>>>::Element *E = enum_list.front(); E; E = E->next()) {
+		for (const KeyValue<String, List<Pair<String, int>>> &E : enum_list) {
 			Dictionary d1;
-			d1["name"] = E->key();
+			d1["name"] = E.key;
 			Array values;
-			for (const Pair<String, int> &F : E->get()) {
+			for (const Pair<String, int> &F : E.value) {
 				Dictionary d2;
 				d2["name"] = F.first;
 				d2["value"] = F.second;

+ 6 - 6
core/extension/native_extension_manager.cpp

@@ -84,8 +84,8 @@ bool NativeExtensionManager::is_extension_loaded(const String &p_path) const {
 
 Vector<String> NativeExtensionManager::get_loaded_extensions() const {
 	Vector<String> ret;
-	for (const Map<String, Ref<NativeExtension>>::Element *E = native_extension_map.front(); E; E = E->next()) {
-		ret.push_back(E->key());
+	for (const KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) {
+		ret.push_back(E.key);
 	}
 	return ret;
 }
@@ -97,16 +97,16 @@ Ref<NativeExtension> NativeExtensionManager::get_extension(const String &p_path)
 
 void NativeExtensionManager::initialize_extensions(NativeExtension::InitializationLevel p_level) {
 	ERR_FAIL_COND(int32_t(p_level) - 1 != level);
-	for (Map<String, Ref<NativeExtension>>::Element *E = native_extension_map.front(); E; E = E->next()) {
-		E->get()->initialize_library(p_level);
+	for (KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) {
+		E.value->initialize_library(p_level);
 	}
 	level = p_level;
 }
 
 void NativeExtensionManager::deinitialize_extensions(NativeExtension::InitializationLevel p_level) {
 	ERR_FAIL_COND(int32_t(p_level) != level);
-	for (Map<String, Ref<NativeExtension>>::Element *E = native_extension_map.front(); E; E = E->next()) {
-		E->get()->deinitialize_library(p_level);
+	for (KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) {
+		E.value->deinitialize_library(p_level);
 	}
 	level = int32_t(p_level) - 1;
 }

+ 7 - 7
core/input/input.cpp

@@ -863,9 +863,9 @@ void Input::release_pressed_events() {
 	joy_buttons_pressed.clear();
 	_joy_axis.clear();
 
-	for (Map<StringName, Input::Action>::Element *E = action_state.front(); E; E = E->next()) {
-		if (E->get().pressed) {
-			action_release(E->key());
+	for (const KeyValue<StringName, Input::Action> &E : action_state) {
+		if (E.value.pressed) {
+			action_release(E.key);
 		}
 	}
 }
@@ -1322,8 +1322,8 @@ void Input::add_joy_mapping(String p_mapping, bool p_update_existing) {
 	if (p_update_existing) {
 		Vector<String> entry = p_mapping.split(",");
 		String uid = entry[0];
-		for (Map<int, Joypad>::Element *E = joy_names.front(); E; E = E->next()) {
-			Joypad &joy = E->get();
+		for (KeyValue<int, Joypad> &E : joy_names) {
+			Joypad &joy = E.value;
 			if (joy.uid == uid) {
 				joy.mapping = map_db.size() - 1;
 			}
@@ -1337,8 +1337,8 @@ void Input::remove_joy_mapping(String p_guid) {
 			map_db.remove(i);
 		}
 	}
-	for (Map<int, Joypad>::Element *E = joy_names.front(); E; E = E->next()) {
-		Joypad &joy = E->get();
+	for (KeyValue<int, Joypad> &E : joy_names) {
+		Joypad &joy = E.value;
 		if (joy.uid == p_guid) {
 			joy.mapping = -1;
 		}

+ 4 - 4
core/io/file_access_pack.cpp

@@ -110,8 +110,8 @@ PackedData::PackedData() {
 }
 
 void PackedData::_free_packed_dirs(PackedDir *p_dir) {
-	for (Map<String, PackedDir *>::Element *E = p_dir->subdirs.front(); E; E = E->next()) {
-		_free_packed_dirs(E->get());
+	for (const KeyValue<String, PackedDir *> &E : p_dir->subdirs) {
+		_free_packed_dirs(E.value);
 	}
 	memdelete(p_dir);
 }
@@ -395,8 +395,8 @@ Error DirAccessPack::list_dir_begin() {
 	list_dirs.clear();
 	list_files.clear();
 
-	for (Map<String, PackedData::PackedDir *>::Element *E = current->subdirs.front(); E; E = E->next()) {
-		list_dirs.push_back(E->key());
+	for (const KeyValue<String, PackedData::PackedDir *> &E : current->subdirs) {
+		list_dirs.push_back(E.key);
 	}
 
 	for (Set<String>::Element *E = current->files.front(); E; E = E->next()) {

+ 4 - 4
core/io/ip.cpp

@@ -288,8 +288,8 @@ Array IP::_get_local_interfaces() const {
 	Array results;
 	Map<String, Interface_Info> interfaces;
 	get_local_interfaces(&interfaces);
-	for (Map<String, Interface_Info>::Element *E = interfaces.front(); E; E = E->next()) {
-		Interface_Info &c = E->get();
+	for (KeyValue<String, Interface_Info> &E : interfaces) {
+		Interface_Info &c = E.value;
 		Dictionary rc;
 		rc["name"] = c.name;
 		rc["friendly"] = c.name_friendly;
@@ -310,8 +310,8 @@ Array IP::_get_local_interfaces() const {
 void IP::get_local_addresses(List<IPAddress> *r_addresses) const {
 	Map<String, Interface_Info> interfaces;
 	get_local_interfaces(&interfaces);
-	for (Map<String, Interface_Info>::Element *E = interfaces.front(); E; E = E->next()) {
-		for (const IPAddress &F : E->get().ip_addresses) {
+	for (const KeyValue<String, Interface_Info> &E : interfaces) {
+		for (const IPAddress &F : E.value.ip_addresses) {
 			r_addresses->push_front(F);
 		}
 	}

+ 2 - 2
core/io/resource.cpp

@@ -540,9 +540,9 @@ void ResourceCache::dump(const char *p_file, bool p_short) {
 		}
 	}
 
-	for (Map<String, int>::Element *E = type_count.front(); E; E = E->next()) {
+	for (const KeyValue<String, int> &E : type_count) {
 		if (f) {
-			f->store_line(E->key() + " count: " + itos(E->get()));
+			f->store_line(E.key + " count: " + itos(E.value));
 		}
 	}
 	if (f) {

+ 2 - 2
core/io/resource_format_binary.cpp

@@ -1960,8 +1960,8 @@ Error ResourceFormatSaverBinaryInstance::save(const String &p_path, const RES &p
 	Vector<RES> save_order;
 	save_order.resize(external_resources.size());
 
-	for (Map<RES, int>::Element *E = external_resources.front(); E; E = E->next()) {
-		save_order.write[E->get()] = E->key();
+	for (const KeyValue<RES, int> &E : external_resources) {
+		save_order.write[E.value] = E.key;
 	}
 
 	for (int i = 0; i < save_order.size(); i++) {

+ 2 - 2
core/io/resource_loader.cpp

@@ -156,8 +156,8 @@ void ResourceFormatLoader::get_dependencies(const String &p_path, List<String> *
 
 Error ResourceFormatLoader::rename_dependencies(const String &p_path, const Map<String, String> &p_map) {
 	Dictionary deps_dict;
-	for (Map<String, String>::Element *E = p_map.front(); E; E = E->next()) {
-		deps_dict[E->key()] = E->value();
+	for (KeyValue<String, String> E : p_map) {
+		deps_dict[E.key] = E.value;
 	}
 
 	int64_t err;

+ 12 - 12
core/math/quick_hull.cpp

@@ -265,8 +265,8 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry3D::MeshData &r_
 		//create new faces from horizon edges
 		List<List<Face>::Element *> new_faces; //new faces
 
-		for (Map<Edge, FaceConnect>::Element *E = lit_edges.front(); E; E = E->next()) {
-			FaceConnect &fc = E->get();
+		for (KeyValue<Edge, FaceConnect> &E : lit_edges) {
+			FaceConnect &fc = E.value;
 			if (fc.left && fc.right) {
 				continue; //edge is uninteresting, not on horizon
 			}
@@ -275,8 +275,8 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry3D::MeshData &r_
 
 			Face face;
 			face.vertices[0] = f.points_over[next];
-			face.vertices[1] = E->key().vertices[0];
-			face.vertices[2] = E->key().vertices[1];
+			face.vertices[1] = E.key.vertices[0];
+			face.vertices[2] = E.key.vertices[1];
 
 			Plane p(p_points[face.vertices[0]], p_points[face.vertices[1]], p_points[face.vertices[2]]);
 
@@ -418,13 +418,13 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry3D::MeshData &r_
 				}
 
 				// remove all edge connections to this face
-				for (Map<Edge, RetFaceConnect>::Element *G = ret_edges.front(); G; G = G->next()) {
-					if (G->get().left == O) {
-						G->get().left = nullptr;
+				for (KeyValue<Edge, RetFaceConnect> &G : ret_edges) {
+					if (G.value.left == O) {
+						G.value.left = nullptr;
 					}
 
-					if (G->get().right == O) {
-						G->get().right = nullptr;
+					if (G.value.right == O) {
+						G.value.right = nullptr;
 					}
 				}
 
@@ -444,10 +444,10 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry3D::MeshData &r_
 	}
 	r_mesh.edges.resize(ret_edges.size());
 	idx = 0;
-	for (Map<Edge, RetFaceConnect>::Element *E = ret_edges.front(); E; E = E->next()) {
+	for (const KeyValue<Edge, RetFaceConnect> &E : ret_edges) {
 		Geometry3D::MeshData::Edge e;
-		e.a = E->key().vertices[0];
-		e.b = E->key().vertices[1];
+		e.a = E.key.vertices[0];
+		e.b = E.key.vertices[1];
 		r_mesh.edges.write[idx++] = e;
 	}
 

+ 2 - 2
core/math/triangle_mesh.cpp

@@ -157,8 +157,8 @@ void TriangleMesh::create(const Vector<Vector3> &p_faces) {
 
 		vertices.resize(db.size());
 		Vector3 *vw = vertices.ptrw();
-		for (Map<Vector3, int>::Element *E = db.front(); E; E = E->next()) {
-			vw[E->get()] = E->key();
+		for (const KeyValue<Vector3, int> &E : db) {
+			vw[E.value] = E.key;
 		}
 	}
 

+ 6 - 6
core/object/message_queue.cpp

@@ -227,16 +227,16 @@ void MessageQueue::statistics() {
 	print_line("TOTAL BYTES: " + itos(buffer_end));
 	print_line("NULL count: " + itos(null_count));
 
-	for (Map<StringName, int>::Element *E = set_count.front(); E; E = E->next()) {
-		print_line("SET " + E->key() + ": " + itos(E->get()));
+	for (const KeyValue<StringName, int> &E : set_count) {
+		print_line("SET " + E.key + ": " + itos(E.value));
 	}
 
-	for (Map<Callable, int>::Element *E = call_count.front(); E; E = E->next()) {
-		print_line("CALL " + E->key() + ": " + itos(E->get()));
+	for (const KeyValue<Callable, int> &E : call_count) {
+		print_line("CALL " + E.key + ": " + itos(E.value));
 	}
 
-	for (Map<int, int>::Element *E = notify_count.front(); E; E = E->next()) {
-		print_line("NOTIFY " + itos(E->key()) + ": " + itos(E->get()));
+	for (const KeyValue<int, int> &E : notify_count) {
+		print_line("NOTIFY " + itos(E.key) + ": " + itos(E.value));
 	}
 }
 

+ 2 - 2
core/object/script_language.cpp

@@ -93,8 +93,8 @@ Dictionary Script::_get_script_constant_map() {
 	Dictionary ret;
 	Map<StringName, Variant> map;
 	get_constants(&map);
-	for (Map<StringName, Variant>::Element *E = map.front(); E; E = E->next()) {
-		ret[E->key()] = E->value();
+	for (const KeyValue<StringName, Variant> &E : map) {
+		ret[E.key] = E.value;
 	}
 	return ret;
 }

+ 5 - 5
core/string/optimized_translation.cpp

@@ -162,11 +162,11 @@ void OptimizedTranslation::generate(const Ref<Translation> &p_from) {
 		btw[btindex++] = t.size();
 		btw[btindex++] = hfunc_table[i];
 
-		for (Map<uint32_t, int>::Element *E = t.front(); E; E = E->next()) {
-			btw[btindex++] = E->key();
-			btw[btindex++] = compressed[E->get()].offset;
-			btw[btindex++] = compressed[E->get()].compressed.size();
-			btw[btindex++] = compressed[E->get()].orig_len;
+		for (const KeyValue<uint32_t, int> &E : t) {
+			btw[btindex++] = E.key;
+			btw[btindex++] = compressed[E.value].offset;
+			btw[btindex++] = compressed[E.value].compressed.size();
+			btw[btindex++] = compressed[E.value].orig_len;
 		}
 	}
 

+ 6 - 6
core/string/translation.cpp

@@ -820,8 +820,8 @@ static const char *locale_renames[][2] = {
 
 Dictionary Translation::_get_messages() const {
 	Dictionary d;
-	for (const Map<StringName, StringName>::Element *E = translation_map.front(); E; E = E->next()) {
-		d[E->key()] = E->value();
+	for (const KeyValue<StringName, StringName> &E : translation_map) {
+		d[E.key] = E.value;
 	}
 	return d;
 }
@@ -830,8 +830,8 @@ Vector<String> Translation::_get_message_list() const {
 	Vector<String> msgs;
 	msgs.resize(translation_map.size());
 	int idx = 0;
-	for (const Map<StringName, StringName>::Element *E = translation_map.front(); E; E = E->next()) {
-		msgs.set(idx, E->key());
+	for (const KeyValue<StringName, StringName> &E : translation_map) {
+		msgs.set(idx, E.key);
 		idx += 1;
 	}
 
@@ -911,8 +911,8 @@ void Translation::erase_message(const StringName &p_src_text, const StringName &
 }
 
 void Translation::get_message_list(List<StringName> *r_messages) const {
-	for (const Map<StringName, StringName>::Element *E = translation_map.front(); E; E = E->next()) {
-		r_messages->push_back(E->key());
+	for (const KeyValue<StringName, StringName> &E : translation_map) {
+		r_messages->push_back(E.key);
 	}
 }
 

+ 4 - 4
core/variant/variant_call.cpp

@@ -1241,8 +1241,8 @@ void Variant::get_constants_for_type(Variant::Type p_type, List<StringName> *p_c
 	for (List<StringName>::Element *E = cd.value_ordered.front(); E; E = E->next()) {
 		p_constants->push_back(E->get());
 #else
-	for (Map<StringName, int>::Element *E = cd.value.front(); E; E = E->next()) {
-		p_constants->push_back(E->key());
+	for (const KeyValue<StringName, int> &E : cd.value) {
+		p_constants->push_back(E.key);
 #endif
 	}
 
@@ -1250,8 +1250,8 @@ void Variant::get_constants_for_type(Variant::Type p_type, List<StringName> *p_c
 	for (List<StringName>::Element *E = cd.variant_value_ordered.front(); E; E = E->next()) {
 		p_constants->push_back(E->get());
 #else
-	for (Map<StringName, Variant>::Element *E = cd.variant_value.front(); E; E = E->next()) {
-		p_constants->push_back(E->key());
+	for (const KeyValue<StringName, Variant> &E : cd.variant_value) {
+		p_constants->push_back(E.key);
 #endif
 	}
 }

+ 2 - 2
drivers/unix/net_socket_posix.cpp

@@ -258,8 +258,8 @@ _FORCE_INLINE_ Error NetSocketPosix::_change_multicast_group(IPAddress p_ip, Str
 	uint32_t if_v6id = 0;
 	Map<String, IP::Interface_Info> if_info;
 	IP::get_singleton()->get_local_interfaces(&if_info);
-	for (Map<String, IP::Interface_Info>::Element *E = if_info.front(); E; E = E->next()) {
-		IP::Interface_Info &c = E->get();
+	for (KeyValue<String, IP::Interface_Info> &E : if_info) {
+		IP::Interface_Info &c = E.value;
 		if (c.name != p_if_name) {
 			continue;
 		}

+ 3 - 3
drivers/vulkan/rendering_device_vulkan.cpp

@@ -8688,10 +8688,10 @@ void RenderingDeviceVulkan::_free_pending_resources(int p_frame) {
 	while (frames[p_frame].framebuffers_to_dispose_of.front()) {
 		Framebuffer *framebuffer = &frames[p_frame].framebuffers_to_dispose_of.front()->get();
 
-		for (Map<Framebuffer::VersionKey, Framebuffer::Version>::Element *E = framebuffer->framebuffers.front(); E; E = E->next()) {
+		for (const KeyValue<Framebuffer::VersionKey, Framebuffer::Version> &E : framebuffer->framebuffers) {
 			//first framebuffer, then render pass because it depends on it
-			vkDestroyFramebuffer(device, E->get().framebuffer, nullptr);
-			vkDestroyRenderPass(device, E->get().render_pass, nullptr);
+			vkDestroyFramebuffer(device, E.value.framebuffer, nullptr);
+			vkDestroyRenderPass(device, E.value.render_pass, nullptr);
 		}
 
 		frames[p_frame].framebuffers_to_dispose_of.pop_front();

+ 8 - 8
drivers/vulkan/vulkan_context.cpp

@@ -1755,8 +1755,8 @@ Error VulkanContext::prepare_buffers() {
 	vkWaitForFences(device, 1, &fences[frame_index], VK_TRUE, UINT64_MAX);
 	vkResetFences(device, 1, &fences[frame_index]);
 
-	for (Map<int, Window>::Element *E = windows.front(); E; E = E->next()) {
-		Window *w = &E->get();
+	for (KeyValue<int, Window> &E : windows) {
+		Window *w = &E.value;
 
 		w->semaphore_acquired = false;
 
@@ -1837,8 +1837,8 @@ Error VulkanContext::swap_buffers() {
 	VkSemaphore *semaphores_to_acquire = (VkSemaphore *)alloca(windows.size() * sizeof(VkSemaphore));
 	uint32_t semaphores_to_acquire_count = 0;
 
-	for (Map<int, Window>::Element *E = windows.front(); E; E = E->next()) {
-		Window *w = &E->get();
+	for (KeyValue<int, Window> &E : windows) {
+		Window *w = &E.value;
 
 		if (w->semaphore_acquired) {
 			semaphores_to_acquire[semaphores_to_acquire_count++] = w->image_acquired_semaphores[frame_index];
@@ -1876,8 +1876,8 @@ Error VulkanContext::swap_buffers() {
 		VkCommandBuffer *cmdbufptr = (VkCommandBuffer *)alloca(sizeof(VkCommandBuffer *) * windows.size());
 		submit_info.pCommandBuffers = cmdbufptr;
 
-		for (Map<int, Window>::Element *E = windows.front(); E; E = E->next()) {
-			Window *w = &E->get();
+		for (KeyValue<int, Window> &E : windows) {
+			Window *w = &E.value;
 
 			if (w->swapchain == VK_NULL_HANDLE) {
 				continue;
@@ -1911,8 +1911,8 @@ Error VulkanContext::swap_buffers() {
 	present.pSwapchains = pSwapchains;
 	present.pImageIndices = pImageIndices;
 
-	for (Map<int, Window>::Element *E = windows.front(); E; E = E->next()) {
-		Window *w = &E->get();
+	for (KeyValue<int, Window> &E : windows) {
+		Window *w = &E.value;
 
 		if (w->swapchain == VK_NULL_HANDLE) {
 			continue;

+ 9 - 9
editor/animation_bezier_editor.cpp

@@ -398,17 +398,17 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
 
 			float scale = timeline->get_zoom_scale();
 			Ref<Texture2D> point = get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons"));
-			for (Map<int, Color>::Element *E = subtrack_colors.front(); E; E = E->next()) {
-				_draw_track(E->key(), E->get());
+			for (const KeyValue<int, Color> &E : subtrack_colors) {
+				_draw_track(E.key, E.value);
 
-				for (int i = 0; i < animation->track_get_key_count(E->key()); i++) {
-					float offset = animation->track_get_key_time(E->key(), i);
-					float value = animation->bezier_track_get_key_value(E->key(), i);
+				for (int i = 0; i < animation->track_get_key_count(E.key); i++) {
+					float offset = animation->track_get_key_time(E.key, i);
+					float value = animation->bezier_track_get_key_value(E.key, i);
 
 					Vector2 pos((offset - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value));
 
 					if (pos.x >= limit && pos.x <= right_limit) {
-						draw_texture(point, pos - point->get_size() / 2, E->get());
+						draw_texture(point, pos - point->get_size() / 2, E.value);
 					}
 				}
 			}
@@ -680,9 +680,9 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
 			emit_signal(SNAME("close_request"));
 			return;
 		}
-		for (Map<int, Rect2>::Element *E = subtracks.front(); E; E = E->next()) {
-			if (E->get().has_point(mb->get_position())) {
-				set_animation_and_track(animation, E->key());
+		for (const KeyValue<int, Rect2> &E : subtracks) {
+			if (E.value.has_point(mb->get_position())) {
+				set_animation_and_track(animation, E.key);
 				_clear_selection();
 				return;
 			}

+ 18 - 21
editor/animation_track_editor.cpp

@@ -700,16 +700,15 @@ public:
 			return;
 		}
 
-		for (Map<int, List<float>>::Element *E = key_ofs_map.front(); E; E = E->next()) {
+		for (const KeyValue<int, List<float>> &E : key_ofs_map) {
 			int key = 0;
-			for (float &F : E->value()) {
-				float key_ofs = F;
+			for (const float &key_ofs : E.value) {
 				if (from != key_ofs) {
 					key++;
 					continue;
 				}
 
-				int track = E->key();
+				int track = E.key;
 				key_ofs_map[track][key] = to;
 
 				if (setting) {
@@ -726,10 +725,9 @@ public:
 	bool _set(const StringName &p_name, const Variant &p_value) {
 		bool update_obj = false;
 		bool change_notify_deserved = false;
-		for (Map<int, List<float>>::Element *E = key_ofs_map.front(); E; E = E->next()) {
-			int track = E->key();
-			for (float &F : E->value()) {
-				float key_ofs = F;
+		for (const KeyValue<int, List<float>> &E : key_ofs_map) {
+			int track = E.key;
+			for (const float &key_ofs : E.value) {
 				int key = animation->track_find_key(track, key_ofs, true);
 				ERR_FAIL_COND_V(key == -1, false);
 
@@ -984,10 +982,9 @@ public:
 	}
 
 	bool _get(const StringName &p_name, Variant &r_ret) const {
-		for (Map<int, List<float>>::Element *E = key_ofs_map.front(); E; E = E->next()) {
-			int track = E->key();
-			for (float &F : E->value()) {
-				float key_ofs = F;
+		for (const KeyValue<int, List<float>> &E : key_ofs_map) {
+			int track = E.key;
+			for (const float &key_ofs : E.value) {
 				int key = animation->track_find_key(track, key_ofs, true);
 				ERR_CONTINUE(key == -1);
 
@@ -1119,15 +1116,15 @@ public:
 		bool show_time = true;
 		bool same_track_type = true;
 		bool same_key_type = true;
-		for (Map<int, List<float>>::Element *E = key_ofs_map.front(); E; E = E->next()) {
-			int track = E->key();
+		for (const KeyValue<int, List<float>> &E : key_ofs_map) {
+			int track = E.key;
 			ERR_FAIL_INDEX(track, animation->get_track_count());
 
 			if (first_track < 0) {
 				first_track = track;
 			}
 
-			if (show_time && E->value().size() > 1) {
+			if (show_time && E.value.size() > 1) {
 				show_time = false;
 			}
 
@@ -1137,7 +1134,7 @@ public:
 					same_key_type = false;
 				}
 
-				for (float &F : E->value()) {
+				for (const float &F : E.value) {
 					int key = animation->track_find_key(track, F, true);
 					ERR_FAIL_COND(key == -1);
 					if (first_key < 0) {
@@ -4831,8 +4828,8 @@ void AnimationTrackEditor::_update_key_edit() {
 		Map<int, List<float>> key_ofs_map;
 		Map<int, NodePath> base_map;
 		int first_track = -1;
-		for (Map<SelectedKey, KeyInfo>::Element *E = selection.front(); E; E = E->next()) {
-			int track = E->key().track;
+		for (const KeyValue<SelectedKey, KeyInfo> &E : selection) {
+			int track = E.key.track;
 			if (first_track < 0) {
 				first_track = track;
 			}
@@ -4842,7 +4839,7 @@ void AnimationTrackEditor::_update_key_edit() {
 				base_map[track] = NodePath();
 			}
 
-			key_ofs_map[track].push_back(animation->track_get_key_time(track, E->key().key));
+			key_ofs_map[track].push_back(animation->track_get_key_time(track, E.key.key));
 		}
 		multi_key_edit->key_ofs_map = key_ofs_map;
 		multi_key_edit->base_map = base_map;
@@ -5386,8 +5383,8 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
 			float len = -1e20;
 			float pivot = 0;
 
-			for (Map<SelectedKey, KeyInfo>::Element *E = selection.front(); E; E = E->next()) {
-				float t = animation->track_get_key_time(E->key().track, E->key().key);
+			for (const KeyValue<SelectedKey, KeyInfo> &E : selection) {
+				float t = animation->track_get_key_time(E.key.track, E.key.key);
 				if (t < from_t) {
 					from_t = t;
 				}

+ 8 - 8
editor/audio_stream_preview.cpp

@@ -216,15 +216,15 @@ AudioStreamPreviewGenerator *AudioStreamPreviewGenerator::singleton = nullptr;
 void AudioStreamPreviewGenerator::_notification(int p_what) {
 	if (p_what == NOTIFICATION_PROCESS) {
 		List<ObjectID> to_erase;
-		for (Map<ObjectID, Preview>::Element *E = previews.front(); E; E = E->next()) {
-			if (!E->get().generating.is_set()) {
-				if (E->get().thread) {
-					E->get().thread->wait_to_finish();
-					memdelete(E->get().thread);
-					E->get().thread = nullptr;
+		for (KeyValue<ObjectID, Preview> &E : previews) {
+			if (!E.value.generating.is_set()) {
+				if (E.value.thread) {
+					E.value.thread->wait_to_finish();
+					memdelete(E.value.thread);
+					E.value.thread = nullptr;
 				}
-				if (!ObjectDB::get_instance(E->key())) { //no longer in use, get rid of preview
-					to_erase.push_back(E->key());
+				if (!ObjectDB::get_instance(E.key)) { //no longer in use, get rid of preview
+					to_erase.push_back(E.key);
 				}
 			}
 		}

+ 2 - 2
editor/debugger/debug_adapter/debug_adapter_parser.cpp

@@ -306,8 +306,8 @@ Dictionary DebugAdapterParser::req_stackTrace(const Dictionary &p_params) const
 
 	Array arr;
 	DebugAdapterProtocol *dap = DebugAdapterProtocol::get_singleton();
-	for (Map<DAP::StackFrame, List<int>>::Element *E = dap->stackframe_list.front(); E; E = E->next()) {
-		DAP::StackFrame sf = E->key();
+	for (const KeyValue<DAP::StackFrame, List<int>> &E : dap->stackframe_list) {
+		DAP::StackFrame sf = E.key;
 		if (!lines_at_one) {
 			sf.line--;
 		}

+ 3 - 3
editor/debugger/editor_debugger_inspector.cpp

@@ -200,12 +200,12 @@ ObjectID EditorDebuggerInspector::add_object(const Array &p_arr) {
 }
 
 void EditorDebuggerInspector::clear_cache() {
-	for (Map<ObjectID, EditorDebuggerRemoteObject *>::Element *E = remote_objects.front(); E; E = E->next()) {
+	for (const KeyValue<ObjectID, EditorDebuggerRemoteObject *> &E : remote_objects) {
 		EditorNode *editor = EditorNode::get_singleton();
-		if (editor->get_editor_history()->get_current() == E->value()->get_instance_id()) {
+		if (editor->get_editor_history()->get_current() == E.value->get_instance_id()) {
 			editor->push_item(nullptr);
 		}
-		memdelete(E->value());
+		memdelete(E.value);
 	}
 	remote_objects.clear();
 	remote_dependencies.clear();

+ 5 - 5
editor/debugger/editor_debugger_node.cpp

@@ -328,9 +328,9 @@ void EditorDebuggerNode::_notification(int p_what) {
 		debugger->set_editor_remote_tree(remote_scene_tree);
 		debugger->start(server->take_connection());
 		// Send breakpoints.
-		for (Map<Breakpoint, bool>::Element *E = breakpoints.front(); E; E = E->next()) {
-			const Breakpoint &bp = E->key();
-			debugger->set_breakpoint(bp.source, bp.line, E->get());
+		for (const KeyValue<Breakpoint, bool> &E : breakpoints) {
+			const Breakpoint &bp = E.key;
+			debugger->set_breakpoint(bp.source, bp.line, E.value);
 		} // Will arrive too late, how does the regular run work?
 
 		debugger->update_live_edit_root();
@@ -497,8 +497,8 @@ void EditorDebuggerNode::set_breakpoints(const String &p_path, Array p_lines) {
 		set_breakpoint(p_path, p_lines[i], true);
 	}
 
-	for (Map<Breakpoint, bool>::Element *E = breakpoints.front(); E; E = E->next()) {
-		Breakpoint b = E->key();
+	for (const KeyValue<Breakpoint, bool> &E : breakpoints) {
+		Breakpoint b = E.key;
 		if (b.source == p_path && !p_lines.has(b.line)) {
 			set_breakpoint(p_path, b.line, false);
 		}

+ 6 - 6
editor/debugger/editor_network_profiler.cpp

@@ -56,18 +56,18 @@ void EditorNetworkProfiler::_update_frame() {
 
 	TreeItem *root = counters_display->create_item();
 
-	for (Map<ObjectID, DebuggerMarshalls::MultiplayerNodeInfo>::Element *E = nodes_data.front(); E; E = E->next()) {
+	for (const KeyValue<ObjectID, DebuggerMarshalls::MultiplayerNodeInfo> &E : nodes_data) {
 		TreeItem *node = counters_display->create_item(root);
 
 		for (int j = 0; j < counters_display->get_columns(); ++j) {
 			node->set_text_align(j, j > 0 ? TreeItem::ALIGN_RIGHT : TreeItem::ALIGN_LEFT);
 		}
 
-		node->set_text(0, E->get().node_path);
-		node->set_text(1, E->get().incoming_rpc == 0 ? "-" : itos(E->get().incoming_rpc));
-		node->set_text(2, E->get().incoming_rset == 0 ? "-" : itos(E->get().incoming_rset));
-		node->set_text(3, E->get().outgoing_rpc == 0 ? "-" : itos(E->get().outgoing_rpc));
-		node->set_text(4, E->get().outgoing_rset == 0 ? "-" : itos(E->get().outgoing_rset));
+		node->set_text(0, E.value.node_path);
+		node->set_text(1, E.value.incoming_rpc == 0 ? "-" : itos(E.value.incoming_rpc));
+		node->set_text(2, E.value.incoming_rset == 0 ? "-" : itos(E.value.incoming_rset));
+		node->set_text(3, E.value.outgoing_rpc == 0 ? "-" : itos(E.value.outgoing_rpc));
+		node->set_text(4, E.value.outgoing_rset == 0 ? "-" : itos(E.value.outgoing_rset));
 	}
 }
 

+ 8 - 8
editor/debugger/editor_profiler.cpp

@@ -515,11 +515,11 @@ Vector<Vector<String>> EditorProfiler::get_data_as_csv() const {
 		if (!m.valid) {
 			continue;
 		}
-		for (Map<StringName, Metric::Category *>::Element *E = m.category_ptrs.front(); E; E = E->next()) {
-			possible_signatures.insert(E->key());
+		for (const KeyValue<StringName, Metric::Category *> &E : m.category_ptrs) {
+			possible_signatures.insert(E.key);
 		}
-		for (Map<StringName, Metric::Category::Item *>::Element *E = m.item_ptrs.front(); E; E = E->next()) {
-			possible_signatures.insert(E->key());
+		for (const KeyValue<StringName, Metric::Category::Item *> &E : m.item_ptrs) {
+			possible_signatures.insert(E.key);
 		}
 	}
 
@@ -557,11 +557,11 @@ Vector<Vector<String>> EditorProfiler::get_data_as_csv() const {
 		values.clear();
 		values.resize(possible_signatures.size());
 
-		for (Map<StringName, Metric::Category *>::Element *E = m.category_ptrs.front(); E; E = E->next()) {
-			values.write[sig_map[E->key()]] = String::num_real(E->value()->total_time);
+		for (const KeyValue<StringName, Metric::Category *> &E : m.category_ptrs) {
+			values.write[sig_map[E.key]] = String::num_real(E.value->total_time);
 		}
-		for (Map<StringName, Metric::Category::Item *>::Element *E = m.item_ptrs.front(); E; E = E->next()) {
-			values.write[sig_map[E->key()]] = String::num_real(E->value()->total);
+		for (const KeyValue<StringName, Metric::Category::Item *> &E : m.item_ptrs) {
+			values.write[sig_map[E.key]] = String::num_real(E.value->total);
 		}
 
 		res.push_back(values);

+ 10 - 10
editor/dependency_editor.cpp

@@ -74,16 +74,16 @@ void DependencyEditor::_fix_and_find(EditorFileSystemDirectory *efsd, Map<String
 
 		String path = efsd->get_file_path(i);
 
-		for (Map<String, String>::Element *E = candidates[file].front(); E; E = E->next()) {
-			if (E->get() == String()) {
-				E->get() = path;
+		for (KeyValue<String, String> &E : candidates[file]) {
+			if (E.value == String()) {
+				E.value = path;
 				continue;
 			}
 
 			//must match the best, using subdirs
-			String existing = E->get().replace_first("res://", "");
+			String existing = E.value.replace_first("res://", "");
 			String current = path.replace_first("res://", "");
-			String lost = E->key().replace_first("res://", "");
+			String lost = E.key.replace_first("res://", "");
 
 			Vector<String> existingv = existing.split("/");
 			existingv.reverse();
@@ -107,7 +107,7 @@ void DependencyEditor::_fix_and_find(EditorFileSystemDirectory *efsd, Map<String
 			if (current_score > existing_score) {
 				//if it was the same, could track distance to new path but..
 
-				E->get() = path; //replace by more accurate
+				E.value = path; //replace by more accurate
 			}
 		}
 	}
@@ -133,10 +133,10 @@ void DependencyEditor::_fix_all() {
 
 	Map<String, String> remaps;
 
-	for (Map<String, Map<String, String>>::Element *E = candidates.front(); E; E = E->next()) {
-		for (Map<String, String>::Element *F = E->get().front(); F; F = F->next()) {
-			if (F->get() != String()) {
-				remaps[F->key()] = F->get();
+	for (KeyValue<String, Map<String, String>> &E : candidates) {
+		for (const KeyValue<String, String> &F : E.value) {
+			if (F.value != String()) {
+				remaps[F.key] = F.value;
 			}
 		}
 	}

+ 7 - 7
editor/doc_tools.cpp

@@ -44,8 +44,8 @@
 #include "modules/modules_enabled.gen.h"
 
 void DocTools::merge_from(const DocTools &p_data) {
-	for (Map<String, DocData::ClassDoc>::Element *E = class_list.front(); E; E = E->next()) {
-		DocData::ClassDoc &c = E->get();
+	for (KeyValue<String, DocData::ClassDoc> &E : class_list) {
+		DocData::ClassDoc &c = E.value;
 
 		if (!p_data.class_list.has(c.name)) {
 			continue;
@@ -185,9 +185,9 @@ void DocTools::merge_from(const DocTools &p_data) {
 }
 
 void DocTools::remove_from(const DocTools &p_data) {
-	for (Map<String, DocData::ClassDoc>::Element *E = p_data.class_list.front(); E; E = E->next()) {
-		if (class_list.has(E->key())) {
-			class_list.erase(E->key());
+	for (const KeyValue<String, DocData::ClassDoc> &E : p_data.class_list) {
+		if (class_list.has(E.key)) {
+			class_list.erase(E.key);
 		}
 	}
 }
@@ -1227,8 +1227,8 @@ static void _write_method_doc(FileAccess *f, const String &p_name, Vector<DocDat
 }
 
 Error DocTools::save_classes(const String &p_default_path, const Map<String, String> &p_class_path) {
-	for (Map<String, DocData::ClassDoc>::Element *E = class_list.front(); E; E = E->next()) {
-		DocData::ClassDoc &c = E->get();
+	for (KeyValue<String, DocData::ClassDoc> &E : class_list) {
+		DocData::ClassDoc &c = E.value;
 
 		String save_path;
 		if (p_class_path.has(c.name)) {

+ 2 - 2
editor/editor_autoload_settings.cpp

@@ -473,8 +473,8 @@ void EditorAutoloadSettings::update_autoload() {
 	}
 
 	// Remove deleted/changed autoloads
-	for (Map<String, AutoLoadInfo>::Element *E = to_remove.front(); E; E = E->next()) {
-		AutoLoadInfo &info = E->get();
+	for (KeyValue<String, AutoLoadInfo> &E : to_remove) {
+		AutoLoadInfo &info = E.value;
 		if (info.is_singleton) {
 			for (int i = 0; i < ScriptServer::get_language_count(); i++) {
 				ScriptServer::get_language(i)->remove_named_global_constant(info.name);

+ 7 - 7
editor/editor_data.cpp

@@ -1105,8 +1105,8 @@ Array EditorSelection::_get_transformable_selected_nodes() {
 TypedArray<Node> EditorSelection::get_selected_nodes() {
 	TypedArray<Node> ret;
 
-	for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-		ret.push_back(E->key());
+	for (const KeyValue<Node *, Object *> &E : selection) {
+		ret.push_back(E.key);
 	}
 
 	return ret;
@@ -1133,8 +1133,8 @@ void EditorSelection::_update_nl() {
 
 	selected_node_list.clear();
 
-	for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-		Node *parent = E->key();
+	for (const KeyValue<Node *, Object *> &E : selection) {
+		Node *parent = E.key;
 		parent = parent->get_parent();
 		bool skip = false;
 		while (parent) {
@@ -1148,7 +1148,7 @@ void EditorSelection::_update_nl() {
 		if (skip) {
 			continue;
 		}
-		selected_node_list.push_back(E->key());
+		selected_node_list.push_back(E.key);
 	}
 
 	nl_changed = true;
@@ -1183,8 +1183,8 @@ List<Node *> &EditorSelection::get_selected_node_list() {
 
 List<Node *> EditorSelection::get_full_selected_node_list() {
 	List<Node *> node_list;
-	for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-		node_list.push_back(E->key());
+	for (const KeyValue<Node *, Object *> &E : selection) {
+		node_list.push_back(E.key);
 	}
 
 	return node_list;

+ 3 - 3
editor/editor_export.cpp

@@ -1817,9 +1817,9 @@ bool EditorExportPlatformPC::can_export(const Ref<EditorExportPreset> &p_preset,
 
 List<String> EditorExportPlatformPC::get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const {
 	List<String> list;
-	for (Map<String, String>::Element *E = extensions.front(); E; E = E->next()) {
-		if (p_preset->get(E->key())) {
-			list.push_back(extensions[E->key()]);
+	for (const KeyValue<String, String> &E : extensions) {
+		if (p_preset->get(E.key)) {
+			list.push_back(extensions[E.key]);
 			return list;
 		}
 	}

+ 3 - 3
editor/editor_feature_profile.cpp

@@ -179,9 +179,9 @@ Error EditorFeatureProfile::save_to_file(const String &p_path) {
 
 	Array dis_props;
 
-	for (Map<StringName, Set<StringName>>::Element *E = disabled_properties.front(); E; E = E->next()) {
-		for (Set<StringName>::Element *F = E->get().front(); F; F = F->next()) {
-			dis_props.push_back(String(E->key()) + ":" + String(F->get()));
+	for (KeyValue<StringName, Set<StringName>> &E : disabled_properties) {
+		for (Set<StringName>::Element *F = E.value.front(); F; F = F->next()) {
+			dis_props.push_back(String(E.key) + ":" + String(F->get()));
 		}
 	}
 

+ 5 - 5
editor/editor_file_system.cpp

@@ -1663,8 +1663,8 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
 	Error err = importer->import_group_file(p_group_file, source_file_options, base_paths);
 
 	//all went well, overwrite config files with proper remaps and md5s
-	for (Map<String, Map<StringName, Variant>>::Element *E = source_file_options.front(); E; E = E->next()) {
-		const String &file = E->key();
+	for (const KeyValue<String, Map<StringName, Variant>> &E : source_file_options) {
+		const String &file = E.key;
 		String base_path = ResourceFormatImporter::get_singleton()->get_import_base_path(file);
 		FileAccessRef f = FileAccess::open(file + ".import", FileAccess::WRITE);
 		ERR_FAIL_COND_V_MSG(!f, ERR_FILE_CANT_OPEN, "Cannot open import file '" + file + ".import'.");
@@ -2133,10 +2133,10 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
 	if (groups_to_reimport.size()) {
 		Map<String, Vector<String>> group_files;
 		_find_group_files(filesystem, group_files, groups_to_reimport);
-		for (Map<String, Vector<String>>::Element *E = group_files.front(); E; E = E->next()) {
-			Error err = _reimport_group(E->key(), E->get());
+		for (const KeyValue<String, Vector<String>> &E : group_files) {
+			Error err = _reimport_group(E.key, E.value);
 			if (err == OK) {
-				_reimport_file(E->key());
+				_reimport_file(E.key);
 			}
 		}
 	}

+ 9 - 9
editor/editor_help.cpp

@@ -394,8 +394,8 @@ void EditorHelp::_update_doc() {
 		bool prev = false;
 
 		class_desc->push_font(doc_font);
-		for (Map<String, DocData::ClassDoc>::Element *E = doc->class_list.front(); E; E = E->next()) {
-			if (E->get().inherits == cd.name) {
+		for (const KeyValue<String, DocData::ClassDoc> &E : doc->class_list) {
+			if (E.value.inherits == cd.name) {
 				if (!found) {
 					class_desc->push_color(title_color);
 					class_desc->add_text(TTR("Inherited by:") + " ");
@@ -406,7 +406,7 @@ void EditorHelp::_update_doc() {
 					class_desc->add_text(" , ");
 				}
 
-				_add_type(E->get().name);
+				_add_type(E.value.name);
 				prev = true;
 			}
 		}
@@ -876,14 +876,14 @@ void EditorHelp::_update_doc() {
 
 			class_desc->add_newline();
 
-			for (Map<String, Vector<DocData::ConstantDoc>>::Element *E = enums.front(); E; E = E->next()) {
-				enum_line[E->key()] = class_desc->get_line_count() - 2;
+			for (KeyValue<String, Vector<DocData::ConstantDoc>> &E : enums) {
+				enum_line[E.key] = class_desc->get_line_count() - 2;
 
 				class_desc->push_font(doc_code_font);
 				class_desc->push_color(title_color);
 				class_desc->add_text("enum  ");
 				class_desc->pop();
-				String e = E->key();
+				String e = E.key;
 				if ((e.get_slice_count(".") > 1) && (e.get_slice(".", 0) == edited_class)) {
 					e = e.get_slice(".", 1);
 				}
@@ -913,10 +913,10 @@ void EditorHelp::_update_doc() {
 				}
 
 				class_desc->push_indent(1);
-				Vector<DocData::ConstantDoc> enum_list = E->get();
+				Vector<DocData::ConstantDoc> enum_list = E.value;
 
 				Map<String, int> enumValuesContainer;
-				int enumStartingLine = enum_line[E->key()];
+				int enumStartingLine = enum_line[E.key];
 
 				for (int i = 0; i < enum_list.size(); i++) {
 					if (cd.name == "@GlobalScope") {
@@ -955,7 +955,7 @@ void EditorHelp::_update_doc() {
 				}
 
 				if (cd.name == "@GlobalScope") {
-					enum_values_line[E->key()] = enumValuesContainer;
+					enum_values_line[E.key] = enumValuesContainer;
 				}
 
 				class_desc->pop();

+ 12 - 12
editor/editor_inspector.cpp

@@ -842,10 +842,10 @@ void EditorProperty::set_bottom_editor(Control *p_control) {
 
 bool EditorProperty::is_cache_valid() const {
 	if (object) {
-		for (Map<StringName, Variant>::Element *E = cache.front(); E; E = E->next()) {
+		for (const KeyValue<StringName, Variant> &E : cache) {
 			bool valid;
-			Variant value = object->get(E->key(), &valid);
-			if (!valid || value != E->get()) {
+			Variant value = object->get(E.key, &valid);
+			if (!valid || value != E.value) {
 				return false;
 			}
 		}
@@ -3029,8 +3029,8 @@ void EditorInspector::collapse_all_folding() {
 		E->fold();
 	}
 
-	for (Map<StringName, List<EditorProperty *>>::Element *F = editor_property_map.front(); F; F = F->next()) {
-		for (EditorProperty *E : F->get()) {
+	for (const KeyValue<StringName, List<EditorProperty *>> &F : editor_property_map) {
+		for (EditorProperty *E : F.value) {
 			E->collapse_all_folding();
 		}
 	}
@@ -3040,8 +3040,8 @@ void EditorInspector::expand_all_folding() {
 	for (EditorInspectorSection *E : sections) {
 		E->unfold();
 	}
-	for (Map<StringName, List<EditorProperty *>>::Element *F = editor_property_map.front(); F; F = F->next()) {
-		for (EditorProperty *E : F->get()) {
+	for (const KeyValue<StringName, List<EditorProperty *>> &F : editor_property_map) {
+		for (EditorProperty *E : F.value) {
 			E->expand_all_folding();
 		}
 	}
@@ -3306,11 +3306,11 @@ void EditorInspector::_property_selected(const String &p_path, int p_focusable)
 	property_selected = p_path;
 	property_focusable = p_focusable;
 	//deselect the others
-	for (Map<StringName, List<EditorProperty *>>::Element *F = editor_property_map.front(); F; F = F->next()) {
-		if (F->key() == property_selected) {
+	for (const KeyValue<StringName, List<EditorProperty *>> &F : editor_property_map) {
+		if (F.key == property_selected) {
 			continue;
 		}
-		for (EditorProperty *E : F->get()) {
+		for (EditorProperty *E : F.value) {
 			if (E->is_selected()) {
 				E->deselect();
 			}
@@ -3368,8 +3368,8 @@ void EditorInspector::_notification(int p_what) {
 		if (refresh_countdown > 0) {
 			refresh_countdown -= get_process_delta_time();
 			if (refresh_countdown <= 0) {
-				for (Map<StringName, List<EditorProperty *>>::Element *F = editor_property_map.front(); F; F = F->next()) {
-					for (EditorProperty *E : F->get()) {
+				for (const KeyValue<StringName, List<EditorProperty *>> &F : editor_property_map) {
+					for (EditorProperty *E : F.value) {
 						if (!E->is_cache_valid()) {
 							E->update_property();
 							E->update_reload_status();

+ 8 - 8
editor/editor_log.cpp

@@ -116,8 +116,8 @@ void EditorLog::_save_state() {
 	config->load(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("editor_layout.cfg"));
 
 	const String section = "editor_log";
-	for (Map<MessageType, LogFilter *>::Element *E = type_filter_map.front(); E; E = E->next()) {
-		config->set_value(section, "log_filter_" + itos(E->key()), E->get()->is_active());
+	for (const KeyValue<MessageType, LogFilter *> &E : type_filter_map) {
+		config->set_value(section, "log_filter_" + itos(E.key), E.value->is_active());
 	}
 
 	config->set_value(section, "collapse", collapse);
@@ -135,8 +135,8 @@ void EditorLog::_load_state() {
 
 	// Run the below code even if config->load returns an error, since we want the defaults to be set even if the file does not exist yet.
 	const String section = "editor_log";
-	for (Map<MessageType, LogFilter *>::Element *E = type_filter_map.front(); E; E = E->next()) {
-		E->get()->set_active(config->get_value(section, "log_filter_" + itos(E->key()), true));
+	for (const KeyValue<MessageType, LogFilter *> &E : type_filter_map) {
+		E.value->set_active(config->get_value(section, "log_filter_" + itos(E.key), true));
 	}
 
 	collapse = config->get_value(section, "collapse", false);
@@ -306,8 +306,8 @@ void EditorLog::_search_changed(const String &p_text) {
 }
 
 void EditorLog::_reset_message_counts() {
-	for (Map<MessageType, LogFilter *>::Element *E = type_filter_map.front(); E; E = E->next()) {
-		E->value()->set_message_count(0);
+	for (const KeyValue<MessageType, LogFilter *> &E : type_filter_map) {
+		E.value->set_message_count(0);
 	}
 }
 
@@ -441,7 +441,7 @@ void EditorLog::deinit() {
 }
 
 EditorLog::~EditorLog() {
-	for (Map<MessageType, LogFilter *>::Element *E = type_filter_map.front(); E; E = E->next()) {
-		memdelete(E->get());
+	for (const KeyValue<MessageType, LogFilter *> &E : type_filter_map) {
+		memdelete(E.value);
 	}
 }

+ 7 - 7
editor/editor_node.cpp

@@ -3202,8 +3202,8 @@ void EditorNode::_update_addon_config() {
 
 	Vector<String> enabled_addons;
 
-	for (Map<String, EditorPlugin *>::Element *E = plugin_addons.front(); E; E = E->next()) {
-		enabled_addons.push_back(E->key());
+	for (const KeyValue<String, EditorPlugin *> &E : plugin_addons) {
+		enabled_addons.push_back(E.key);
 	}
 
 	if (enabled_addons.size() == 0) {
@@ -3585,9 +3585,9 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
 
 	dependency_errors.erase(lpath); //at least not self path
 
-	for (Map<String, Set<String>>::Element *E = dependency_errors.front(); E; E = E->next()) {
-		String txt = vformat(TTR("Scene '%s' has broken dependencies:"), E->key()) + "\n";
-		for (Set<String>::Element *F = E->get().front(); F; F = F->next()) {
+	for (KeyValue<String, Set<String>> &E : dependency_errors) {
+		String txt = vformat(TTR("Scene '%s' has broken dependencies:"), E.key) + "\n";
+		for (Set<String>::Element *F = E.value.front(); F; F = F->next()) {
 			txt += "\t" + F->get() + "\n";
 		}
 		add_io_error(txt);
@@ -4050,8 +4050,8 @@ Ref<Texture2D> EditorNode::get_class_icon(const String &p_class, const String &p
 	}
 
 	const Map<String, Vector<EditorData::CustomType>> &p_map = EditorNode::get_editor_data().get_custom_types();
-	for (const Map<String, Vector<EditorData::CustomType>>::Element *E = p_map.front(); E; E = E->next()) {
-		const Vector<EditorData::CustomType> &ct = E->value();
+	for (const KeyValue<String, Vector<EditorData::CustomType>> &E : p_map) {
+		const Vector<EditorData::CustomType> &ct = E.value;
 		for (int i = 0; i < ct.size(); ++i) {
 			if (ct[i].name == p_class) {
 				if (ct[i].icon.is_valid()) {

+ 3 - 3
editor/editor_run_native.cpp

@@ -66,9 +66,9 @@ void EditorRunNative::_notification(int p_what) {
 		bool changed = EditorExport::get_singleton()->poll_export_platforms() || first;
 
 		if (changed) {
-			for (Map<int, MenuButton *>::Element *E = menus.front(); E; E = E->next()) {
-				Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(E->key());
-				MenuButton *mb = E->get();
+			for (KeyValue<int, MenuButton *> &E : menus) {
+				Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(E.key);
+				MenuButton *mb = E.value;
 				int dc = eep->get_options_count();
 
 				if (dc == 0) {

+ 9 - 9
editor/editor_settings.cpp

@@ -139,10 +139,10 @@ bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const {
 
 	if (p_name == "shortcuts") {
 		Array arr;
-		for (const Map<String, Ref<Shortcut>>::Element *E = shortcuts.front(); E; E = E->next()) {
-			Ref<Shortcut> sc = E->get();
+		for (const KeyValue<String, Ref<Shortcut>> &E : shortcuts) {
+			Ref<Shortcut> sc = E.value;
 
-			if (builtin_action_overrides.has(E->key())) {
+			if (builtin_action_overrides.has(E.key)) {
 				// This shortcut was auto-generated from built in actions: don't save.
 				continue;
 			}
@@ -158,19 +158,19 @@ bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const {
 				}
 			}
 
-			arr.push_back(E->key());
+			arr.push_back(E.key);
 			arr.push_back(sc->get_event());
 		}
 		r_ret = arr;
 		return true;
 	} else if (p_name == "builtin_action_overrides") {
 		Array actions_arr;
-		for (Map<String, List<Ref<InputEvent>>>::Element *E = builtin_action_overrides.front(); E; E = E->next()) {
-			List<Ref<InputEvent>> events = E->get();
+		for (const KeyValue<String, List<Ref<InputEvent>>> &E : builtin_action_overrides) {
+			List<Ref<InputEvent>> events = E.value;
 
 			// TODO: skip actions which are the same as the builtin.
 			Dictionary action_dict;
-			action_dict["name"] = E->key();
+			action_dict["name"] = E.key;
 
 			Array events_arr;
 			for (List<Ref<InputEvent>>::Element *I = events.front(); I; I = I->next()) {
@@ -1429,8 +1429,8 @@ Ref<Shortcut> EditorSettings::get_shortcut(const String &p_name) const {
 }
 
 void EditorSettings::get_shortcut_list(List<String> *r_shortcuts) {
-	for (const Map<String, Ref<Shortcut>>::Element *E = shortcuts.front(); E; E = E->next()) {
-		r_shortcuts->push_back(E->key());
+	for (const KeyValue<String, Ref<Shortcut>> &E : shortcuts) {
+		r_shortcuts->push_back(E.key);
 	}
 }
 

+ 4 - 4
editor/filesystem_dock.cpp

@@ -1301,11 +1301,11 @@ void FileSystemDock::_update_dependencies_after_move(const Map<String, String> &
 void FileSystemDock::_update_project_settings_after_move(const Map<String, String> &p_renames) const {
 	// Find all project settings of type FILE and replace them if needed.
 	const Map<StringName, PropertyInfo> prop_info = ProjectSettings::get_singleton()->get_custom_property_info();
-	for (const Map<StringName, PropertyInfo>::Element *E = prop_info.front(); E; E = E->next()) {
-		if (E->get().hint == PROPERTY_HINT_FILE) {
-			String old_path = GLOBAL_GET(E->key());
+	for (const KeyValue<StringName, PropertyInfo> &E : prop_info) {
+		if (E.value.hint == PROPERTY_HINT_FILE) {
+			String old_path = GLOBAL_GET(E.key);
 			if (p_renames.has(old_path)) {
-				ProjectSettings::get_singleton()->set_setting(E->key(), p_renames[old_path]);
+				ProjectSettings::get_singleton()->set_setting(E.key, p_renames[old_path]);
 			}
 		};
 	}

+ 2 - 2
editor/find_in_files.cpp

@@ -840,8 +840,8 @@ void FindInFilesPanel::_on_replace_all_clicked() {
 
 	PackedStringArray modified_files;
 
-	for (Map<String, TreeItem *>::Element *E = _file_items.front(); E; E = E->next()) {
-		TreeItem *file_item = E->value();
+	for (KeyValue<String, TreeItem *> &E : _file_items) {
+		TreeItem *file_item = E.value;
 		String fpath = file_item->get_metadata(0);
 
 		Vector<Result> locations;

+ 10 - 10
editor/import/collada.cpp

@@ -2095,19 +2095,19 @@ void Collada::_merge_skeletons(VisualScene *p_vscene, Node *p_node) {
 }
 
 void Collada::_merge_skeletons2(VisualScene *p_vscene) {
-	for (Map<String, SkinControllerData>::Element *E = state.skin_controller_data_map.front(); E; E = E->next()) {
-		SkinControllerData &cd = E->get();
+	for (KeyValue<String, SkinControllerData> &E : state.skin_controller_data_map) {
+		SkinControllerData &cd = E.value;
 
 		NodeSkeleton *skeleton = nullptr;
 
-		for (Map<String, Transform3D>::Element *F = cd.bone_rest_map.front(); F; F = F->next()) {
+		for (const KeyValue<String, Transform3D> &F : cd.bone_rest_map) {
 			String name;
 
-			if (!state.sid_to_node_map.has(F->key())) {
+			if (!state.sid_to_node_map.has(F.key)) {
 				continue;
 			}
 
-			name = state.sid_to_node_map[F->key()];
+			name = state.sid_to_node_map[F.key];
 
 			ERR_CONTINUE(!state.scene_map.has(name));
 
@@ -2248,9 +2248,9 @@ bool Collada::_move_geometry_to_skeletons(VisualScene *p_vscene, Node *p_node, L
 			p_node->default_transform = skel_inv * (skin.bind_shape /* p_node->get_global_transform()*/); // i honestly have no idea what to do with a previous model xform.. most exporters ignore it
 
 			//make rests relative to the skeleton (they seem to be always relative to world)
-			for (Map<String, Transform3D>::Element *E = skin.bone_rest_map.front(); E; E = E->next()) {
-				E->get() = skel_inv * E->get(); //make the bone rest local to the skeleton
-				state.bone_rest_map[E->key()] = E->get(); // make it remember where the bone is globally, now that it's relative
+			for (KeyValue<String, Transform3D> &E : skin.bone_rest_map) {
+				E.value = skel_inv * E.value; //make the bone rest local to the skeleton
+				state.bone_rest_map[E.key] = E.value; // make it remember where the bone is globally, now that it's relative
 			}
 
 			//but most exporters seem to work only if i do this..
@@ -2302,8 +2302,8 @@ void Collada::_find_morph_nodes(VisualScene *p_vscene, Node *p_node) {
 }
 
 void Collada::_optimize() {
-	for (Map<String, VisualScene>::Element *E = state.visual_scene_map.front(); E; E = E->next()) {
-		VisualScene &vs = E->get();
+	for (KeyValue<String, VisualScene> &E : state.visual_scene_map) {
+		VisualScene &vs = E.value;
 		for (int i = 0; i < vs.root_nodes.size(); i++) {
 			_create_skeletons(&vs.root_nodes.write[i]);
 		}

+ 10 - 10
editor/import/editor_import_collada.cpp

@@ -1314,8 +1314,8 @@ Error ColladaImport::load(const String &p_path, int p_flags, bool p_force_make_t
 }
 
 void ColladaImport::_fix_param_animation_tracks() {
-	for (Map<String, Collada::Node *>::Element *E = collada.state.scene_map.front(); E; E = E->next()) {
-		Collada::Node *n = E->get();
+	for (KeyValue<String, Collada::Node *> &E : collada.state.scene_map) {
+		Collada::Node *n = E.value;
 		switch (n->type) {
 			case Collada::Node::TYPE_NODE: {
 				// ? do nothing
@@ -1363,7 +1363,7 @@ void ColladaImport::_fix_param_animation_tracks() {
 										for (int rti = 0; rti < rt.size(); rti++) {
 											Collada::AnimationTrack *at = &collada.state.animation_tracks.write[rt[rti]];
 
-											at->target = E->key();
+											at->target = E.key;
 											at->param = "morph/" + collada.state.mesh_name_map[mesh_name];
 											at->property = true;
 											//at->param
@@ -1431,11 +1431,11 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
 		animation->set_name(collada.state.animation_clips[p_clip].name);
 	}
 
-	for (Map<String, NodeMap>::Element *E = node_map.front(); E; E = E->next()) {
-		if (E->get().bone < 0) {
+	for (const KeyValue<String, NodeMap> &E : node_map) {
+		if (E.value.bone < 0) {
 			continue;
 		}
-		bones_with_animation[E->key()] = false;
+		bones_with_animation[E.key] = false;
 	}
 	//store and validate tracks
 
@@ -1626,19 +1626,19 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
 
 	if (p_make_tracks_in_all_bones) {
 		//some bones may lack animation, but since we don't store pose as a property, we must add keyframes!
-		for (Map<String, bool>::Element *E = bones_with_animation.front(); E; E = E->next()) {
-			if (E->get()) {
+		for (const KeyValue<String, bool> &E : bones_with_animation) {
+			if (E.value) {
 				continue;
 			}
 
-			NodeMap &nm = node_map[E->key()];
+			NodeMap &nm = node_map[E.key];
 			String path = scene->get_path_to(nm.node);
 			ERR_CONTINUE(nm.bone < 0);
 			Skeleton3D *sk = static_cast<Skeleton3D *>(nm.node);
 			String name = sk->get_bone_name(nm.bone);
 			path = path + ":" + name;
 
-			Collada::Node *cn = collada.state.scene_map[E->key()];
+			Collada::Node *cn = collada.state.scene_map[E.key];
 			if (cn->ignore_anim) {
 				WARN_PRINT("Collada: Ignoring animation on node: " + path);
 				continue;

+ 4 - 4
editor/import/editor_importer_bake_reset.cpp

@@ -122,14 +122,14 @@ void BakeReset::_align_animations(AnimationPlayer *p_ap, const Map<StringName, B
 	for (List<StringName>::Element *anim_i = anim_names.front(); anim_i; anim_i = anim_i->next()) {
 		Ref<Animation> a = p_ap->get_animation(anim_i->get());
 		ERR_CONTINUE(a.is_null());
-		for (Map<StringName, BakeResetRestBone>::Element *rest_bone_i = r_rest_bones.front(); rest_bone_i; rest_bone_i = rest_bone_i->next()) {
-			int track = a->find_track(NodePath(rest_bone_i->key()));
+		for (const KeyValue<StringName, BakeResetRestBone> &rest_bone_i : r_rest_bones) {
+			int track = a->find_track(NodePath(rest_bone_i.key));
 			if (track == -1) {
 				continue;
 			}
 			int new_track = a->add_track(Animation::TYPE_TRANSFORM3D);
-			NodePath new_path = NodePath(rest_bone_i->key());
-			BakeResetRestBone rest_bone = rest_bone_i->get();
+			NodePath new_path = NodePath(rest_bone_i.key);
+			const BakeResetRestBone rest_bone = rest_bone_i.value;
 			a->track_set_path(new_track, new_path);
 			for (int key_i = 0; key_i < a->track_get_key_count(track); key_i++) {
 				Vector3 loc;

+ 8 - 8
editor/import/resource_importer_texture.cpp

@@ -86,28 +86,28 @@ void ResourceImporterTexture::update_imports() {
 			return;
 		}
 
-		for (Map<StringName, MakeInfo>::Element *E = make_flags.front(); E; E = E->next()) {
+		for (const KeyValue<StringName, MakeInfo> &E : make_flags) {
 			Ref<ConfigFile> cf;
 			cf.instantiate();
-			String src_path = String(E->key()) + ".import";
+			String src_path = String(E.key) + ".import";
 
 			Error err = cf->load(src_path);
 			ERR_CONTINUE(err != OK);
 
 			bool changed = false;
 
-			if (E->get().flags & MAKE_NORMAL_FLAG && int(cf->get_value("params", "compress/normal_map")) == 0) {
+			if (E.value.flags & MAKE_NORMAL_FLAG && int(cf->get_value("params", "compress/normal_map")) == 0) {
 				cf->set_value("params", "compress/normal_map", 1);
 				changed = true;
 			}
 
-			if (E->get().flags & MAKE_ROUGHNESS_FLAG && int(cf->get_value("params", "roughness/mode")) == 0) {
-				cf->set_value("params", "roughness/mode", E->get().channel_for_roughness + 2);
-				cf->set_value("params", "roughness/src_normal", E->get().normal_path_for_roughness);
+			if (E.value.flags & MAKE_ROUGHNESS_FLAG && int(cf->get_value("params", "roughness/mode")) == 0) {
+				cf->set_value("params", "roughness/mode", E.value.channel_for_roughness + 2);
+				cf->set_value("params", "roughness/src_normal", E.value.normal_path_for_roughness);
 				changed = true;
 			}
 
-			if (E->get().flags & MAKE_3D_FLAG && bool(cf->get_value("params", "detect_3d/compress_to"))) {
+			if (E.value.flags & MAKE_3D_FLAG && bool(cf->get_value("params", "detect_3d/compress_to"))) {
 				int compress_to = cf->get_value("params", "detect_3d/compress_to");
 				cf->set_value("params", "detect_3d/compress_to", 0);
 				if (compress_to == 1) {
@@ -121,7 +121,7 @@ void ResourceImporterTexture::update_imports() {
 
 			if (changed) {
 				cf->save(src_path);
-				to_reimport.push_back(E->key());
+				to_reimport.push_back(E.key);
 			}
 		}
 

+ 29 - 29
editor/import/scene_import_settings.cpp

@@ -771,52 +771,52 @@ void SceneImportSettings::_re_import() {
 
 	Dictionary subresources;
 
-	for (Map<String, NodeData>::Element *E = node_map.front(); E; E = E->next()) {
-		if (E->get().settings.size()) {
+	for (KeyValue<String, NodeData> &E : node_map) {
+		if (E.value.settings.size()) {
 			Dictionary d;
-			for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) {
-				d[String(F->key())] = F->get();
+			for (const KeyValue<StringName, Variant> &F : E.value.settings) {
+				d[String(F.key)] = F.value;
 			}
-			nodes[E->key()] = d;
+			nodes[E.key] = d;
 		}
 	}
 	if (nodes.size()) {
 		subresources["nodes"] = nodes;
 	}
 
-	for (Map<String, MaterialData>::Element *E = material_map.front(); E; E = E->next()) {
-		if (E->get().settings.size()) {
+	for (KeyValue<String, MaterialData> &E : material_map) {
+		if (E.value.settings.size()) {
 			Dictionary d;
-			for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) {
-				d[String(F->key())] = F->get();
+			for (const KeyValue<StringName, Variant> &F : E.value.settings) {
+				d[String(F.key)] = F.value;
 			}
-			materials[E->key()] = d;
+			materials[E.key] = d;
 		}
 	}
 	if (materials.size()) {
 		subresources["materials"] = materials;
 	}
 
-	for (Map<String, MeshData>::Element *E = mesh_map.front(); E; E = E->next()) {
-		if (E->get().settings.size()) {
+	for (KeyValue<String, MeshData> &E : mesh_map) {
+		if (E.value.settings.size()) {
 			Dictionary d;
-			for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) {
-				d[String(F->key())] = F->get();
+			for (const KeyValue<StringName, Variant> &F : E.value.settings) {
+				d[String(F.key)] = F.value;
 			}
-			meshes[E->key()] = d;
+			meshes[E.key] = d;
 		}
 	}
 	if (meshes.size()) {
 		subresources["meshes"] = meshes;
 	}
 
-	for (Map<String, AnimationData>::Element *E = animation_map.front(); E; E = E->next()) {
-		if (E->get().settings.size()) {
+	for (KeyValue<String, AnimationData> &E : animation_map) {
+		if (E.value.settings.size()) {
 			Dictionary d;
-			for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) {
-				d[String(F->key())] = F->get();
+			for (const KeyValue<StringName, Variant> &F : E.value.settings) {
+				d[String(F.key)] = F.value;
 			}
-			animations[E->key()] = d;
+			animations[E.key] = d;
 		}
 	}
 	if (animations.size()) {
@@ -889,8 +889,8 @@ void SceneImportSettings::_save_dir_callback(const String &p_path) {
 
 	switch (current_action) {
 		case ACTION_EXTRACT_MATERIALS: {
-			for (Map<String, MaterialData>::Element *E = material_map.front(); E; E = E->next()) {
-				MaterialData &md = material_map[E->key()];
+			for (const KeyValue<String, MaterialData> &E : material_map) {
+				MaterialData &md = material_map[E.key];
 
 				TreeItem *item = external_path_tree->create_item(root);
 
@@ -905,7 +905,7 @@ void SceneImportSettings::_save_dir_callback(const String &p_path) {
 						item->set_text(2, "Already External");
 						item->set_tooltip(2, TTR("This material already references an external file, no action will be taken.\nDisable the external property for it to be extracted again."));
 					} else {
-						item->set_metadata(0, E->key());
+						item->set_metadata(0, E.key);
 						item->set_editable(0, true);
 						item->set_checked(0, true);
 						String path = p_path.plus_file(name);
@@ -942,8 +942,8 @@ void SceneImportSettings::_save_dir_callback(const String &p_path) {
 			external_paths->get_ok_button()->set_text(TTR("Extract"));
 		} break;
 		case ACTION_CHOOSE_MESH_SAVE_PATHS: {
-			for (Map<String, MeshData>::Element *E = mesh_map.front(); E; E = E->next()) {
-				MeshData &md = mesh_map[E->key()];
+			for (const KeyValue<String, MeshData> &E : mesh_map) {
+				MeshData &md = mesh_map[E.key];
 
 				TreeItem *item = external_path_tree->create_item(root);
 
@@ -958,7 +958,7 @@ void SceneImportSettings::_save_dir_callback(const String &p_path) {
 						item->set_text(2, "Already Saving");
 						item->set_tooltip(2, TTR("This mesh already saves to an external resource, no action will be taken."));
 					} else {
-						item->set_metadata(0, E->key());
+						item->set_metadata(0, E.key);
 						item->set_editable(0, true);
 						item->set_checked(0, true);
 						String path = p_path.plus_file(name);
@@ -995,8 +995,8 @@ void SceneImportSettings::_save_dir_callback(const String &p_path) {
 			external_paths->get_ok_button()->set_text(TTR("Set Paths"));
 		} break;
 		case ACTION_CHOOSE_ANIMATION_SAVE_PATHS: {
-			for (Map<String, AnimationData>::Element *E = animation_map.front(); E; E = E->next()) {
-				AnimationData &ad = animation_map[E->key()];
+			for (const KeyValue<String, AnimationData> &E : animation_map) {
+				AnimationData &ad = animation_map[E.key];
 
 				TreeItem *item = external_path_tree->create_item(root);
 
@@ -1010,7 +1010,7 @@ void SceneImportSettings::_save_dir_callback(const String &p_path) {
 					item->set_text(2, "Already Saving");
 					item->set_tooltip(2, TTR("This animation already saves to an external resource, no action will be taken."));
 				} else {
-					item->set_metadata(0, E->key());
+					item->set_metadata(0, E.key);
 					item->set_editable(0, true);
 					item->set_checked(0, true);
 					String path = p_path.plus_file(name);

+ 2 - 2
editor/import/scene_importer_mesh.cpp

@@ -966,8 +966,8 @@ Ref<NavigationMesh> EditorSceneImporterMesh::create_navigation_mesh() {
 
 	Vector<Vector3> vertices;
 	vertices.resize(unique_vertices.size());
-	for (Map<Vector3, int>::Element *E = unique_vertices.front(); E; E = E->next()) {
-		vertices.write[E->get()] = E->key();
+	for (const KeyValue<Vector3, int> &E : unique_vertices) {
+		vertices.write[E.value] = E.key;
 	}
 
 	Ref<NavigationMesh> nm;

+ 3 - 3
editor/import_defaults_editor.cpp

@@ -86,9 +86,9 @@ void ImportDefaultsEditor::_save() {
 	if (settings->importer.is_valid()) {
 		Dictionary modified;
 
-		for (Map<StringName, Variant>::Element *E = settings->values.front(); E; E = E->next()) {
-			if (E->get() != settings->default_values[E->key()]) {
-				modified[E->key()] = E->get();
+		for (const KeyValue<StringName, Variant> &E : settings->values) {
+			if (E.value != settings->default_values[E.key]) {
+				modified[E.key] = E.value;
 			}
 		}
 

+ 5 - 5
editor/plugins/animation_blend_tree_editor_plugin.cpp

@@ -776,16 +776,16 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) {
 		}
 
 		if (player) {
-			for (Map<StringName, ProgressBar *>::Element *E = animations.front(); E; E = E->next()) {
-				Ref<AnimationNodeAnimation> an = blend_tree->get_node(E->key());
+			for (const KeyValue<StringName, ProgressBar *> &E : animations) {
+				Ref<AnimationNodeAnimation> an = blend_tree->get_node(E.key);
 				if (an.is_valid()) {
 					if (player->has_animation(an->get_animation())) {
 						Ref<Animation> anim = player->get_animation(an->get_animation());
 						if (anim.is_valid()) {
-							E->get()->set_max(anim->get_length());
+							E.value->set_max(anim->get_length());
 							//StringName path = AnimationTreeEditor::get_singleton()->get_base_path() + E.input_node;
-							StringName time_path = AnimationTreeEditor::get_singleton()->get_base_path() + String(E->key()) + "/time";
-							E->get()->set_value(AnimationTreeEditor::get_singleton()->get_tree()->get(time_path));
+							StringName time_path = AnimationTreeEditor::get_singleton()->get_base_path() + String(E.key) + "/time";
+							E.value->set_value(AnimationTreeEditor::get_singleton()->get_tree()->get(time_path));
 						}
 					}
 				}

+ 7 - 7
editor/plugins/asset_library_editor_plugin.cpp

@@ -830,9 +830,9 @@ void EditorAssetLibrary::_update_image_queue() {
 	int current_images = 0;
 
 	List<int> to_delete;
-	for (Map<int, ImageQueue>::Element *E = image_queue.front(); E; E = E->next()) {
-		if (!E->get().active && current_images < max_images) {
-			String cache_filename_base = EditorPaths::get_singleton()->get_cache_dir().plus_file("assetimage_" + E->get().image_url.md5_text());
+	for (KeyValue<int, ImageQueue> &E : image_queue) {
+		if (!E.value.active && current_images < max_images) {
+			String cache_filename_base = EditorPaths::get_singleton()->get_cache_dir().plus_file("assetimage_" + E.value.image_url.md5_text());
 			Vector<String> headers;
 
 			if (FileAccess::exists(cache_filename_base + ".etag") && FileAccess::exists(cache_filename_base + ".data")) {
@@ -844,14 +844,14 @@ void EditorAssetLibrary::_update_image_queue() {
 				}
 			}
 
-			Error err = E->get().request->request(E->get().image_url, headers);
+			Error err = E.value.request->request(E.value.image_url, headers);
 			if (err != OK) {
-				to_delete.push_back(E->key());
+				to_delete.push_back(E.key);
 			} else {
-				E->get().active = true;
+				E.value.active = true;
 			}
 			current_images++;
-		} else if (E->get().active) {
+		} else if (E.value.active) {
 			current_images++;
 		}
 	}

+ 18 - 18
editor/plugins/canvas_item_editor_plugin.cpp

@@ -748,8 +748,8 @@ bool CanvasItemEditor::_select_click_on_item(CanvasItem *item, Point2 p_click_po
 
 List<CanvasItem *> CanvasItemEditor::_get_edited_canvas_items(bool retreive_locked, bool remove_canvas_item_if_parent_in_selection) {
 	List<CanvasItem *> selection;
-	for (Map<Node *, Object *>::Element *E = editor_selection->get_selection().front(); E; E = E->next()) {
-		CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
+	for (const KeyValue<Node *, Object *> &E : editor_selection->get_selection()) {
+		CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E.key);
 		if (canvas_item && canvas_item->is_visible_in_tree() && canvas_item->get_viewport() == EditorNode::get_singleton()->get_scene_root() && (retreive_locked || !_is_node_locked(canvas_item))) {
 			CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
 			if (se) {
@@ -3782,8 +3782,8 @@ void CanvasItemEditor::_notification(int p_what) {
 		}
 
 		// Update the viewport if bones changes
-		for (Map<BoneKey, BoneList>::Element *E = bone_list.front(); E; E = E->next()) {
-			Object *b = ObjectDB::get_instance(E->key().from);
+		for (KeyValue<BoneKey, BoneList> &E : bone_list) {
+			Object *b = ObjectDB::get_instance(E.key.from);
 			if (!b) {
 				viewport->update();
 				break;
@@ -3796,14 +3796,14 @@ void CanvasItemEditor::_notification(int p_what) {
 
 			Transform2D global_xform = b2->get_global_transform();
 
-			if (global_xform != E->get().xform) {
-				E->get().xform = global_xform;
+			if (global_xform != E.value.xform) {
+				E.value.xform = global_xform;
 				viewport->update();
 			}
 
 			Bone2D *bone = Object::cast_to<Bone2D>(b);
-			if (bone && bone->get_length() != E->get().length) {
-				E->get().length = bone->get_length();
+			if (bone && bone->get_length() != E.value.length) {
+				E.value.length = bone->get_length();
 				viewport->update();
 			}
 		}
@@ -4263,8 +4263,8 @@ void CanvasItemEditor::_button_tool_select(int p_index) {
 void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation, bool p_scale, bool p_on_existing) {
 	Map<Node *, Object *> &selection = editor_selection->get_selection();
 
-	for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-		CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
+	for (const KeyValue<Node *, Object *> &E : selection) {
+		CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E.key);
 		if (!canvas_item || !canvas_item->is_visible_in_tree()) {
 			continue;
 		}
@@ -4695,8 +4695,8 @@ void CanvasItemEditor::_popup_callback(int p_op) {
 
 			Map<Node *, Object *> &selection = editor_selection->get_selection();
 
-			for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-				CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
+			for (const KeyValue<Node *, Object *> &E : selection) {
+				CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E.key);
 				if (!canvas_item || !canvas_item->is_visible_in_tree()) {
 					continue;
 				}
@@ -4741,8 +4741,8 @@ void CanvasItemEditor::_popup_callback(int p_op) {
 		case ANIM_CLEAR_POSE: {
 			Map<Node *, Object *> &selection = editor_selection->get_selection();
 
-			for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-				CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
+			for (const KeyValue<Node *, Object *> &E : selection) {
+				CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E.key);
 				if (!canvas_item || !canvas_item->is_visible_in_tree()) {
 					continue;
 				}
@@ -4816,8 +4816,8 @@ void CanvasItemEditor::_popup_callback(int p_op) {
 			Node *editor_root = EditorNode::get_singleton()->get_edited_scene()->get_tree()->get_edited_scene_root();
 
 			undo_redo->create_action(TTR("Create Custom Bone2D(s) from Node(s)"));
-			for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-				Node2D *n2d = Object::cast_to<Node2D>(E->key());
+			for (const KeyValue<Node *, Object *> &E : selection) {
+				Node2D *n2d = Object::cast_to<Node2D>(E.key);
 
 				Bone2D *new_bone = memnew(Bone2D);
 				String new_bone_name = n2d->get_name();
@@ -4861,8 +4861,8 @@ void CanvasItemEditor::_focus_selection(int p_op) {
 	int count = 0;
 
 	Map<Node *, Object *> &selection = editor_selection->get_selection();
-	for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-		CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
+	for (const KeyValue<Node *, Object *> &E : selection) {
+		CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E.key);
 		if (!canvas_item) {
 			continue;
 		}

+ 4 - 4
editor/plugins/node_3d_editor_gizmos.cpp

@@ -4773,10 +4773,10 @@ void NavigationRegion3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
 	}
 	Vector<Vector3> lines;
 
-	for (Map<_EdgeKey, bool>::Element *E = edge_map.front(); E; E = E->next()) {
-		if (E->get()) {
-			lines.push_back(E->key().from);
-			lines.push_back(E->key().to);
+	for (const KeyValue<_EdgeKey, bool> &E : edge_map) {
+		if (E.value) {
+			lines.push_back(E.key.from);
+			lines.push_back(E.key.to);
 		}
 	}
 

+ 27 - 27
editor/plugins/node_3d_editor_plugin.cpp

@@ -357,8 +357,8 @@ int Node3DEditorViewport::get_selected_count() const {
 
 	int count = 0;
 
-	for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-		Node3D *sp = Object::cast_to<Node3D>(E->key());
+	for (const KeyValue<Node *, Object *> &E : selection) {
+		Node3D *sp = Object::cast_to<Node3D>(E.key);
 		if (!sp) {
 			continue;
 		}
@@ -864,8 +864,8 @@ void Node3DEditorViewport::_compute_edit(const Point2 &p_point) {
 	Node3DEditorSelectedItem *se = selected ? editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(selected) : nullptr;
 
 	if (se && se->gizmo.is_valid()) {
-		for (Map<int, Transform3D>::Element *E = se->subgizmos.front(); E; E = E->next()) {
-			int subgizmo_id = E->key();
+		for (const KeyValue<int, Transform3D> &E : se->subgizmos) {
+			int subgizmo_id = E.key;
 			se->subgizmos[subgizmo_id] = se->gizmo->get_subgizmo_transform(subgizmo_id);
 		}
 		se->original_local = selected->get_transform();
@@ -1374,9 +1374,9 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 							Vector<int> ids;
 							Vector<Transform3D> restore;
 
-							for (Map<int, Transform3D>::Element *GE = se->subgizmos.front(); GE; GE = GE->next()) {
-								ids.push_back(GE->key());
-								restore.push_back(GE->value());
+							for (const KeyValue<int, Transform3D> &GE : se->subgizmos) {
+								ids.push_back(GE.key);
+								restore.push_back(GE.value);
 							}
 
 							se->gizmo->commit_subgizmos(ids, restore, true);
@@ -1612,9 +1612,9 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 							Vector<int> ids;
 							Vector<Transform3D> restore;
 
-							for (Map<int, Transform3D>::Element *GE = se->subgizmos.front(); GE; GE = GE->next()) {
-								ids.push_back(GE->key());
-								restore.push_back(GE->value());
+							for (const KeyValue<int, Transform3D> &GE : se->subgizmos) {
+								ids.push_back(GE.key);
+								restore.push_back(GE.value);
 							}
 
 							se->gizmo->commit_subgizmos(ids, restore, false);
@@ -1845,13 +1845,13 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 							}
 
 							if (se->gizmo.is_valid()) {
-								for (Map<int, Transform3D>::Element *GE = se->subgizmos.front(); GE; GE = GE->next()) {
-									Transform3D xform = GE->get();
+								for (KeyValue<int, Transform3D> &GE : se->subgizmos) {
+									Transform3D xform = GE.value;
 									Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original * xform, xform, motion, snap, local_coords);
 									if (!local_coords) {
 										new_xform = se->original.affine_inverse() * new_xform;
 									}
-									se->gizmo->set_subgizmo_transform(GE->key(), new_xform);
+									se->gizmo->set_subgizmo_transform(GE.key, new_xform);
 								}
 							} else {
 								Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original, se->original_local, motion, snap, local_coords);
@@ -1944,11 +1944,11 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 							}
 
 							if (se->gizmo.is_valid()) {
-								for (Map<int, Transform3D>::Element *GE = se->subgizmos.front(); GE; GE = GE->next()) {
-									Transform3D xform = GE->get();
+								for (KeyValue<int, Transform3D> &GE : se->subgizmos) {
+									Transform3D xform = GE.value;
 									Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original * xform, xform, motion, snap, local_coords);
 									new_xform = se->original.affine_inverse() * new_xform;
-									se->gizmo->set_subgizmo_transform(GE->key(), new_xform);
+									se->gizmo->set_subgizmo_transform(GE.key, new_xform);
 								}
 							} else {
 								Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original, se->original_local, motion, snap, local_coords);
@@ -2030,14 +2030,14 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 
 							Vector3 compute_axis = local_coords ? axis : plane.normal;
 							if (se->gizmo.is_valid()) {
-								for (Map<int, Transform3D>::Element *GE = se->subgizmos.front(); GE; GE = GE->next()) {
-									Transform3D xform = GE->get();
+								for (KeyValue<int, Transform3D> &GE : se->subgizmos) {
+									Transform3D xform = GE.value;
 
 									Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original * xform, xform, compute_axis, angle, local_coords);
 									if (!local_coords) {
 										new_xform = se->original.affine_inverse() * new_xform;
 									}
-									se->gizmo->set_subgizmo_transform(GE->key(), new_xform);
+									se->gizmo->set_subgizmo_transform(GE.key, new_xform);
 								}
 							} else {
 								Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original, se->original_local, compute_axis, angle, local_coords);
@@ -2666,8 +2666,8 @@ void Node3DEditorViewport::_notification(int p_what) {
 		bool changed = false;
 		bool exist = false;
 
-		for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-			Node3D *sp = Object::cast_to<Node3D>(E->key());
+		for (const KeyValue<Node *, Object *> &E : selection) {
+			Node3D *sp = Object::cast_to<Node3D>(E.key);
 			if (!sp) {
 				continue;
 			}
@@ -3809,8 +3809,8 @@ void Node3DEditorViewport::focus_selection() {
 		}
 
 		if (se->gizmo.is_valid()) {
-			for (Map<int, Transform3D>::Element *GE = se->subgizmos.front(); GE; GE = GE->next()) {
-				center += se->gizmo->get_subgizmo_transform(GE->key()).origin;
+			for (const KeyValue<int, Transform3D> &GE : se->subgizmos) {
+				center += se->gizmo->get_subgizmo_transform(GE.key).origin;
 				count++;
 			}
 		}
@@ -4750,8 +4750,8 @@ void Node3DEditor::update_transform_gizmo() {
 	Node3DEditorSelectedItem *se = selected ? editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(selected) : nullptr;
 
 	if (se && se->gizmo.is_valid()) {
-		for (Map<int, Transform3D>::Element *E = se->subgizmos.front(); E; E = E->next()) {
-			Transform3D xf = se->sp->get_global_transform() * se->gizmo->get_subgizmo_transform(E->key());
+		for (const KeyValue<int, Transform3D> &E : se->subgizmos) {
+			Transform3D xf = se->sp->get_global_transform() * se->gizmo->get_subgizmo_transform(E.key);
 			gizmo_center += xf.origin;
 			if (count == 0 && local_gizmo_coords) {
 				gizmo_basis = xf.basis;
@@ -6677,8 +6677,8 @@ Vector<int> Node3DEditor::get_subgizmo_selection() {
 
 	Vector<int> ret;
 	if (se) {
-		for (Map<int, Transform3D>::Element *E = se->subgizmos.front(); E; E = E->next()) {
-			ret.push_back(E->key());
+		for (const KeyValue<int, Transform3D> &E : se->subgizmos) {
+			ret.push_back(E.key);
 		}
 	}
 	return ret;

+ 3 - 3
editor/plugins/shader_editor_plugin.cpp

@@ -131,9 +131,9 @@ void ShaderTextEditor::_load_theme_settings() {
 
 	List<String> built_ins;
 	if (shader.is_valid()) {
-		for (const Map<StringName, ShaderLanguage::FunctionInfo>::Element *E = ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())).front(); E; E = E->next()) {
-			for (const Map<StringName, ShaderLanguage::BuiltInInfo>::Element *F = E->get().built_ins.front(); F; F = F->next()) {
-				built_ins.push_back(F->key());
+		for (const KeyValue<StringName, ShaderLanguage::FunctionInfo> &E : ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode()))) {
+			for (const KeyValue<StringName, ShaderLanguage::BuiltInInfo> &F : E.value.built_ins) {
+				built_ins.push_back(F.key);
 			}
 		}
 

+ 5 - 5
editor/plugins/theme_editor_plugin.cpp

@@ -437,8 +437,8 @@ void ThemeItemImportTree::_update_total_selected(Theme::DataType p_data_type) {
 	}
 
 	int count = 0;
-	for (Map<ThemeItem, ItemCheckedState>::Element *E = selected_items.front(); E; E = E->next()) {
-		ThemeItem ti = E->key();
+	for (const KeyValue<ThemeItem, ItemCheckedState> &E : selected_items) {
+		ThemeItem ti = E.key;
 		if (ti.data_type == p_data_type) {
 			count++;
 		}
@@ -759,7 +759,7 @@ void ThemeItemImportTree::_import_selected() {
 	ProgressDialog::get_singleton()->add_task("import_theme_items", TTR("Importing Theme Items"), selected_items.size() + 2);
 
 	int idx = 0;
-	for (Map<ThemeItem, ItemCheckedState>::Element *E = selected_items.front(); E; E = E->next()) {
+	for (KeyValue<ThemeItem, ItemCheckedState> &E : selected_items) {
 		// Arbitrary number of items to skip from reporting.
 		// Reduces the number of UI updates that this causes when copying large themes.
 		if (idx % 10 == 0) {
@@ -769,8 +769,8 @@ void ThemeItemImportTree::_import_selected() {
 			ProgressDialog::get_singleton()->task_step("import_theme_items", TTR("Importing items {n}/{n}").format(arr, "{n}"), idx);
 		}
 
-		ItemCheckedState cs = E->get();
-		ThemeItem ti = E->key();
+		ItemCheckedState cs = E.value;
+		ThemeItem ti = E.key;
 
 		if (cs == SELECT_IMPORT_DEFINITION || cs == SELECT_IMPORT_FULL) {
 			Variant item_value = Variant();

+ 4 - 4
editor/plugins/tiles/tile_atlas_view.cpp

@@ -522,10 +522,10 @@ void TileAtlasView::_update_alternative_tiles_rect_cache() {
 }
 
 Vector3i TileAtlasView::get_alternative_tile_at_pos(const Vector2 p_pos) const {
-	for (Map<Vector2, Map<int, Rect2i>>::Element *E_coords = alternative_tiles_rect_cache.front(); E_coords; E_coords = E_coords->next()) {
-		for (Map<int, Rect2i>::Element *E_alternative = E_coords->value().front(); E_alternative; E_alternative = E_alternative->next()) {
-			if (E_alternative->value().has_point(p_pos)) {
-				return Vector3i(E_coords->key().x, E_coords->key().y, E_alternative->key());
+	for (const KeyValue<Vector2, Map<int, Rect2i>> &E_coords : alternative_tiles_rect_cache) {
+		for (const KeyValue<int, Rect2i> &E_alternative : E_coords.value) {
+			if (E_alternative.value.has_point(p_pos)) {
+				return Vector3i(E_coords.key.x, E_coords.key.y, E_alternative.key);
 			}
 		}
 	}

+ 47 - 47
editor/plugins/tiles/tile_data_editors.cpp

@@ -756,10 +756,10 @@ Variant TileDataDefaultEditor::_get_value(TileSetAtlasSource *p_tile_set_atlas_s
 }
 
 void TileDataDefaultEditor::_setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, Map<TileMapCell, Variant> p_previous_values, Variant p_new_value) {
-	for (Map<TileMapCell, Variant>::Element *E = p_previous_values.front(); E; E = E->next()) {
-		Vector2i coords = E->key().get_atlas_coords();
-		undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/%s", coords.x, coords.y, E->key().alternative_tile, property), E->get());
-		undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/%s", coords.x, coords.y, E->key().alternative_tile, property), p_new_value);
+	for (const KeyValue<TileMapCell, Variant> &E : p_previous_values) {
+		Vector2i coords = E.key.get_atlas_coords();
+		undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/%s", coords.x, coords.y, E.key.alternative_tile, property), E.value);
+		undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/%s", coords.x, coords.y, E.key.alternative_tile, property), p_new_value);
 	}
 }
 
@@ -1191,10 +1191,10 @@ Variant TileDataOcclusionShapeEditor::_get_value(TileSetAtlasSource *p_tile_set_
 }
 
 void TileDataOcclusionShapeEditor::_setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, Map<TileMapCell, Variant> p_previous_values, Variant p_new_value) {
-	for (Map<TileMapCell, Variant>::Element *E = p_previous_values.front(); E; E = E->next()) {
-		Vector2i coords = E->key().get_atlas_coords();
-		undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/occlusion_layer_%d/polygon", coords.x, coords.y, E->key().alternative_tile, occlusion_layer), E->get());
-		undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/occlusion_layer_%d/polygon", coords.x, coords.y, E->key().alternative_tile, occlusion_layer), p_new_value);
+	for (const KeyValue<TileMapCell, Variant> &E : p_previous_values) {
+		Vector2i coords = E.key.get_atlas_coords();
+		undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/occlusion_layer_%d/polygon", coords.x, coords.y, E.key.alternative_tile, occlusion_layer), E.value);
+		undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/occlusion_layer_%d/polygon", coords.x, coords.y, E.key.alternative_tile, occlusion_layer), p_new_value);
 	}
 }
 
@@ -1312,8 +1312,8 @@ void TileDataCollisionEditor::_set_painted_value(TileSetAtlasSource *p_tile_set_
 		dummy_object->set(vformat("polygon_%d_one_way", i), tile_data->is_collision_polygon_one_way(physics_layer, i));
 		dummy_object->set(vformat("polygon_%d_one_way_margin", i), tile_data->get_collision_polygon_one_way_margin(physics_layer, i));
 	}
-	for (Map<StringName, EditorProperty *>::Element *E = property_editors.front(); E; E = E->next()) {
-		E->get()->update_property();
+	for (const KeyValue<StringName, EditorProperty *> &E : property_editors) {
+		E.value->update_property();
 	}
 
 	polygon_editor->set_background(p_tile_set_atlas_source->get_texture(), p_tile_set_atlas_source->get_tile_texture_region(p_coords), p_tile_set_atlas_source->get_tile_effective_texture_offset(p_coords, p_alternative_tile), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate());
@@ -1359,24 +1359,24 @@ Variant TileDataCollisionEditor::_get_value(TileSetAtlasSource *p_tile_set_atlas
 
 void TileDataCollisionEditor::_setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, Map<TileMapCell, Variant> p_previous_values, Variant p_new_value) {
 	Array new_array = p_new_value;
-	for (Map<TileMapCell, Variant>::Element *E = p_previous_values.front(); E; E = E->next()) {
-		Array old_array = E->get();
+	for (KeyValue<TileMapCell, Variant> &E : p_previous_values) {
+		Array old_array = E.value;
 
-		Vector2i coords = E->key().get_atlas_coords();
-		undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygons_count", coords.x, coords.y, E->key().alternative_tile, physics_layer), old_array.size());
+		Vector2i coords = E.key.get_atlas_coords();
+		undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygons_count", coords.x, coords.y, E.key.alternative_tile, physics_layer), old_array.size());
 		for (int i = 0; i < old_array.size(); i++) {
 			Dictionary dict = old_array[i];
-			undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/points", coords.x, coords.y, E->key().alternative_tile, physics_layer, i), dict["points"]);
-			undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/one_way", coords.x, coords.y, E->key().alternative_tile, physics_layer, i), dict["one_way"]);
-			undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/one_way_margin", coords.x, coords.y, E->key().alternative_tile, physics_layer, i), dict["one_way_margin"]);
+			undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/points", coords.x, coords.y, E.key.alternative_tile, physics_layer, i), dict["points"]);
+			undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/one_way", coords.x, coords.y, E.key.alternative_tile, physics_layer, i), dict["one_way"]);
+			undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/one_way_margin", coords.x, coords.y, E.key.alternative_tile, physics_layer, i), dict["one_way_margin"]);
 		}
 
-		undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygons_count", coords.x, coords.y, E->key().alternative_tile, physics_layer), new_array.size());
+		undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygons_count", coords.x, coords.y, E.key.alternative_tile, physics_layer), new_array.size());
 		for (int i = 0; i < new_array.size(); i++) {
 			Dictionary dict = new_array[i];
-			undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/points", coords.x, coords.y, E->key().alternative_tile, physics_layer, i), dict["points"]);
-			undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/one_way", coords.x, coords.y, E->key().alternative_tile, physics_layer, i), dict["one_way"]);
-			undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/one_way_margin", coords.x, coords.y, E->key().alternative_tile, physics_layer, i), dict["one_way_margin"]);
+			undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/points", coords.x, coords.y, E.key.alternative_tile, physics_layer, i), dict["points"]);
+			undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/one_way", coords.x, coords.y, E.key.alternative_tile, physics_layer, i), dict["one_way"]);
+			undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/physics_layer_%d/polygon_%d/one_way_margin", coords.x, coords.y, E.key.alternative_tile, physics_layer, i), dict["one_way_margin"]);
 		}
 	}
 }
@@ -2021,16 +2021,16 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t
 					drag_type = DRAG_TYPE_NONE;
 				} else if (drag_type == DRAG_TYPE_PAINT_TERRAIN_SET) {
 					undo_redo->create_action(TTR("Painting Terrain Set"));
-					for (Map<TileMapCell, Variant>::Element *E = drag_modified.front(); E; E = E->next()) {
-						Dictionary dict = E->get();
-						Vector2i coords = E->key().get_atlas_coords();
-						undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E->key().alternative_tile), drag_painted_value);
-						undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E->key().alternative_tile), dict["terrain_set"]);
+					for (KeyValue<TileMapCell, Variant> &E : drag_modified) {
+						Dictionary dict = E.value;
+						Vector2i coords = E.key.get_atlas_coords();
+						undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.key.alternative_tile), drag_painted_value);
+						undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.key.alternative_tile), dict["terrain_set"]);
 						Array array = dict["terrain_peering_bits"];
 						for (int i = 0; i < array.size(); i++) {
 							TileSet::CellNeighbor bit = TileSet::CellNeighbor(i);
 							if (tile_set->is_valid_peering_bit_terrain(dict["terrain_set"], bit)) {
-								undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E->key().alternative_tile), array[i]);
+								undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), array[i]);
 							}
 						}
 					}
@@ -2041,17 +2041,17 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t
 					int terrain_set = int(painted["terrain_set"]);
 					int terrain = int(painted["terrain"]);
 					undo_redo->create_action(TTR("Painting Terrain"));
-					for (Map<TileMapCell, Variant>::Element *E = drag_modified.front(); E; E = E->next()) {
-						Dictionary dict = E->get();
-						Vector2i coords = E->key().get_atlas_coords();
+					for (KeyValue<TileMapCell, Variant> &E : drag_modified) {
+						Dictionary dict = E.value;
+						Vector2i coords = E.key.get_atlas_coords();
 						Array array = dict["terrain_peering_bits"];
 						for (int i = 0; i < array.size(); i++) {
 							TileSet::CellNeighbor bit = TileSet::CellNeighbor(i);
 							if (tile_set->is_valid_peering_bit_terrain(terrain_set, bit)) {
-								undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E->key().alternative_tile), terrain);
+								undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), terrain);
 							}
 							if (tile_set->is_valid_peering_bit_terrain(dict["terrain_set"], bit)) {
-								undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E->key().alternative_tile), array[i]);
+								undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), array[i]);
 							}
 						}
 					}
@@ -2304,14 +2304,14 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi
 			} else {
 				if (drag_type == DRAG_TYPE_PAINT_TERRAIN_SET) {
 					undo_redo->create_action(TTR("Painting Tiles Property"));
-					for (Map<TileMapCell, Variant>::Element *E = drag_modified.front(); E; E = E->next()) {
-						Dictionary dict = E->get();
-						Vector2i coords = E->key().get_atlas_coords();
-						undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E->key().alternative_tile), dict["terrain_set"]);
-						undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E->key().alternative_tile), drag_painted_value);
+					for (KeyValue<TileMapCell, Variant> &E : drag_modified) {
+						Dictionary dict = E.value;
+						Vector2i coords = E.key.get_atlas_coords();
+						undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.key.alternative_tile), dict["terrain_set"]);
+						undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.key.alternative_tile), drag_painted_value);
 						Array array = dict["terrain_peering_bits"];
 						for (int i = 0; i < array.size(); i++) {
-							undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E->key().alternative_tile), array[i]);
+							undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), array[i]);
 						}
 					}
 					undo_redo->commit_action(false);
@@ -2321,17 +2321,17 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi
 					int terrain_set = int(painted["terrain_set"]);
 					int terrain = int(painted["terrain"]);
 					undo_redo->create_action(TTR("Painting Terrain"));
-					for (Map<TileMapCell, Variant>::Element *E = drag_modified.front(); E; E = E->next()) {
-						Dictionary dict = E->get();
-						Vector2i coords = E->key().get_atlas_coords();
+					for (KeyValue<TileMapCell, Variant> &E : drag_modified) {
+						Dictionary dict = E.value;
+						Vector2i coords = E.key.get_atlas_coords();
 						Array array = dict["terrain_peering_bits"];
 						for (int i = 0; i < array.size(); i++) {
 							TileSet::CellNeighbor bit = TileSet::CellNeighbor(i);
 							if (tile_set->is_valid_peering_bit_terrain(terrain_set, bit)) {
-								undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E->key().alternative_tile), terrain);
+								undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), terrain);
 							}
 							if (tile_set->is_valid_peering_bit_terrain(dict["terrain_set"], bit)) {
-								undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E->key().alternative_tile), array[i]);
+								undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), array[i]);
 							}
 						}
 					}
@@ -2443,10 +2443,10 @@ Variant TileDataNavigationEditor::_get_value(TileSetAtlasSource *p_tile_set_atla
 }
 
 void TileDataNavigationEditor::_setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, Map<TileMapCell, Variant> p_previous_values, Variant p_new_value) {
-	for (Map<TileMapCell, Variant>::Element *E = p_previous_values.front(); E; E = E->next()) {
-		Vector2i coords = E->key().get_atlas_coords();
-		undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/navigation_layer_%d/polygon", coords.x, coords.y, E->key().alternative_tile, navigation_layer), E->get());
-		undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/navigation_layer_%d/polygon", coords.x, coords.y, E->key().alternative_tile, navigation_layer), p_new_value);
+	for (const KeyValue<TileMapCell, Variant> &E : p_previous_values) {
+		Vector2i coords = E.key.get_atlas_coords();
+		undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/navigation_layer_%d/polygon", coords.x, coords.y, E.key.alternative_tile, navigation_layer), E.value);
+		undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/navigation_layer_%d/polygon", coords.x, coords.y, E.key.alternative_tile, navigation_layer), p_new_value);
 	}
 }
 

+ 93 - 93
editor/plugins/tiles/tile_map_editor.cpp

@@ -455,15 +455,15 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
 		switch (drag_type) {
 			case DRAG_TYPE_PAINT: {
 				Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_last_mouse_pos, mpos);
-				for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
-					if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
+				for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
+					if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) {
 						continue;
 					}
-					Vector2i coords = E->key();
+					Vector2i coords = E.key;
 					if (!drag_modified.has(coords)) {
 						drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords));
 					}
-					tile_map->set_cell(tile_map_layer, coords, E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+					tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 				}
 			} break;
 			case DRAG_TYPE_BUCKET: {
@@ -471,15 +471,15 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
 				for (int i = 0; i < line.size(); i++) {
 					if (!drag_modified.has(line[i])) {
 						Map<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_continuous_checkbox->is_pressed());
-						for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
-							if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
+						for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
+							if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) {
 								continue;
 							}
-							Vector2i coords = E->key();
+							Vector2i coords = E.key;
 							if (!drag_modified.has(coords)) {
 								drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords));
 							}
-							tile_map->set_cell(tile_map_layer, coords, E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+							tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 						}
 					}
 				}
@@ -531,15 +531,15 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
 							drag_start_mouse_pos = mpos;
 							drag_modified.clear();
 							Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, mpos, mpos);
-							for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
-								if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
+							for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
+								if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) {
 									continue;
 								}
-								Vector2i coords = E->key();
+								Vector2i coords = E.key;
 								if (!drag_modified.has(coords)) {
 									drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords));
 								}
-								tile_map->set_cell(tile_map_layer, coords, E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+								tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 							}
 						} else if (tool_buttons_group->get_pressed_button() == line_tool_button) {
 							drag_type = DRAG_TYPE_LINE;
@@ -557,15 +557,15 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
 							for (int i = 0; i < line.size(); i++) {
 								if (!drag_modified.has(line[i])) {
 									Map<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_continuous_checkbox->is_pressed());
-									for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
-										if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
+									for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
+										if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) {
 											continue;
 										}
-										Vector2i coords = E->key();
+										Vector2i coords = E.key;
 										if (!drag_modified.has(coords)) {
 											drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords));
 										}
-										tile_map->set_cell(tile_map_layer, coords, E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+										tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 									}
 								}
 							}
@@ -710,8 +710,8 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over
 			// Expand the grid if needed
 			if (expand_grid && !preview.is_empty()) {
 				drawn_grid_rect = Rect2i(preview.front()->key(), Vector2i(1, 1));
-				for (Map<Vector2i, TileMapCell>::Element *E = preview.front(); E; E = E->next()) {
-					drawn_grid_rect.expand_to(E->key());
+				for (const KeyValue<Vector2i, TileMapCell> &E : preview) {
+					drawn_grid_rect.expand_to(E.key);
 				}
 			}
 		}
@@ -748,23 +748,23 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over
 			}
 
 			// Draw the preview.
-			for (Map<Vector2i, TileMapCell>::Element *E = preview.front(); E; E = E->next()) {
+			for (const KeyValue<Vector2i, TileMapCell> &E : preview) {
 				Transform2D tile_xform;
-				tile_xform.set_origin(tile_map->map_to_world(E->key()));
+				tile_xform.set_origin(tile_map->map_to_world(E.key));
 				tile_xform.set_scale(tile_set->get_tile_size());
 				if (!erase_button->is_pressed() && random_tile_checkbox->is_pressed()) {
 					tile_set->draw_tile_shape(p_overlay, xform * tile_xform, Color(1.0, 1.0, 1.0, 0.5), true);
 				} else {
-					if (tile_set->has_source(E->get().source_id)) {
-						TileSetSource *source = *tile_set->get_source(E->get().source_id);
+					if (tile_set->has_source(E.value.source_id)) {
+						TileSetSource *source = *tile_set->get_source(E.value.source_id);
 						TileSetAtlasSource *atlas_source = Object::cast_to<TileSetAtlasSource>(source);
 						if (atlas_source) {
 							// Get tile data.
-							TileData *tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(E->get().get_atlas_coords(), E->get().alternative_tile));
+							TileData *tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(E.value.get_atlas_coords(), E.value.alternative_tile));
 
 							// Compute the offset
-							Rect2i source_rect = atlas_source->get_tile_texture_region(E->get().get_atlas_coords());
-							Vector2i tile_offset = atlas_source->get_tile_effective_texture_offset(E->get().get_atlas_coords(), E->get().alternative_tile);
+							Rect2i source_rect = atlas_source->get_tile_texture_region(E.value.get_atlas_coords());
+							Vector2i tile_offset = atlas_source->get_tile_effective_texture_offset(E.value.get_atlas_coords(), E.value.alternative_tile);
 
 							// Compute the destination rectangle in the CanvasItem.
 							Rect2 dest_rect;
@@ -772,9 +772,9 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over
 
 							bool transpose = tile_data->get_transpose();
 							if (transpose) {
-								dest_rect.position = (tile_map->map_to_world(E->key()) - Vector2(dest_rect.size.y, dest_rect.size.x) / 2 - tile_offset);
+								dest_rect.position = (tile_map->map_to_world(E.key) - Vector2(dest_rect.size.y, dest_rect.size.x) / 2 - tile_offset);
 							} else {
-								dest_rect.position = (tile_map->map_to_world(E->key()) - dest_rect.size / 2 - tile_offset);
+								dest_rect.position = (tile_map->map_to_world(E.key) - dest_rect.size / 2 - tile_offset);
 							}
 
 							dest_rect = xform.xform(dest_rect);
@@ -1165,11 +1165,11 @@ void TileMapEditorTilesPlugin::_stop_dragging() {
 			}
 			undo_redo->create_action(TTR("Move tiles"));
 			// Move the tiles.
-			for (Map<Vector2i, TileMapCell>::Element *E = cells_do.front(); E; E = E->next()) {
-				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+			for (const KeyValue<Vector2i, TileMapCell> &E : cells_do) {
+				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 			}
-			for (Map<Vector2i, TileMapCell>::Element *E = cells_undo.front(); E; E = E->next()) {
-				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+			for (const KeyValue<Vector2i, TileMapCell> &E : cells_undo) {
+				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 			}
 
 			// Update the selection.
@@ -1205,41 +1205,41 @@ void TileMapEditorTilesPlugin::_stop_dragging() {
 		} break;
 		case DRAG_TYPE_PAINT: {
 			undo_redo->create_action(TTR("Paint tiles"));
-			for (Map<Vector2i, TileMapCell>::Element *E = drag_modified.front(); E; E = E->next()) {
-				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E->key(), tile_map->get_cell_source_id(tile_map_layer, E->key()), tile_map->get_cell_atlas_coords(tile_map_layer, E->key()), tile_map->get_cell_alternative_tile(tile_map_layer, E->key()));
-				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+			for (const KeyValue<Vector2i, TileMapCell> &E : drag_modified) {
+				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, tile_map->get_cell_source_id(tile_map_layer, E.key), tile_map->get_cell_atlas_coords(tile_map_layer, E.key), tile_map->get_cell_alternative_tile(tile_map_layer, E.key));
+				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 			}
 			undo_redo->commit_action(false);
 		} break;
 		case DRAG_TYPE_LINE: {
 			Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_start_mouse_pos, mpos);
 			undo_redo->create_action(TTR("Paint tiles"));
-			for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
-				if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
+			for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
+				if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) {
 					continue;
 				}
-				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
-				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E->key(), tile_map->get_cell_source_id(tile_map_layer, E->key()), tile_map->get_cell_atlas_coords(tile_map_layer, E->key()), tile_map->get_cell_alternative_tile(tile_map_layer, E->key()));
+				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
+				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, tile_map->get_cell_source_id(tile_map_layer, E.key), tile_map->get_cell_atlas_coords(tile_map_layer, E.key), tile_map->get_cell_alternative_tile(tile_map_layer, E.key));
 			}
 			undo_redo->commit_action();
 		} break;
 		case DRAG_TYPE_RECT: {
 			Map<Vector2i, TileMapCell> to_draw = _draw_rect(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(mpos));
 			undo_redo->create_action(TTR("Paint tiles"));
-			for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
-				if (!erase_button->is_pressed() && E->get().source_id == TileSet::INVALID_SOURCE) {
+			for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
+				if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) {
 					continue;
 				}
-				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
-				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E->key(), tile_map->get_cell_source_id(tile_map_layer, E->key()), tile_map->get_cell_atlas_coords(tile_map_layer, E->key()), tile_map->get_cell_alternative_tile(tile_map_layer, E->key()));
+				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
+				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, tile_map->get_cell_source_id(tile_map_layer, E.key), tile_map->get_cell_atlas_coords(tile_map_layer, E.key), tile_map->get_cell_alternative_tile(tile_map_layer, E.key));
 			}
 			undo_redo->commit_action();
 		} break;
 		case DRAG_TYPE_BUCKET: {
 			undo_redo->create_action(TTR("Paint tiles"));
-			for (Map<Vector2i, TileMapCell>::Element *E = drag_modified.front(); E; E = E->next()) {
-				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E->key(), tile_map->get_cell_source_id(tile_map_layer, E->key()), tile_map->get_cell_atlas_coords(tile_map_layer, E->key()), tile_map->get_cell_alternative_tile(tile_map_layer, E->key()));
-				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+			for (const KeyValue<Vector2i, TileMapCell> &E : drag_modified) {
+				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, tile_map->get_cell_source_id(tile_map_layer, E.key), tile_map->get_cell_atlas_coords(tile_map_layer, E.key), tile_map->get_cell_alternative_tile(tile_map_layer, E.key));
+				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 			}
 			undo_redo->commit_action(false);
 		} break;
@@ -1364,17 +1364,17 @@ void TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_selection(
 	}
 
 	int vertical_offset = 0;
-	for (Map<int, List<const TileMapCell *>>::Element *E_source = per_source.front(); E_source; E_source = E_source->next()) {
+	for (const KeyValue<int, List<const TileMapCell *>> &E_source : per_source) {
 		// Per source.
 		List<const TileMapCell *> unorganized;
 		Rect2i encompassing_rect_coords;
 		Map<Vector2i, const TileMapCell *> organized_pattern;
 
-		TileSetSource *source = *tile_set->get_source(E_source->key());
+		TileSetSource *source = *tile_set->get_source(E_source.key);
 		TileSetAtlasSource *atlas_source = Object::cast_to<TileSetAtlasSource>(source);
 		if (atlas_source) {
 			// Organize using coordinates.
-			for (const TileMapCell *current : E_source->get()) {
+			for (const TileMapCell *current : E_source.value) {
 				if (current->alternative_tile == 0) {
 					organized_pattern[current->get_atlas_coords()] = current;
 				} else {
@@ -1393,14 +1393,14 @@ void TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_selection(
 			}
 		} else {
 			// Add everything unorganized.
-			for (const TileMapCell *cell : E_source->get()) {
+			for (const TileMapCell *cell : E_source.value) {
 				unorganized.push_back(cell);
 			}
 		}
 
 		// Now add everything to the output pattern.
-		for (Map<Vector2i, const TileMapCell *>::Element *E_cell = organized_pattern.front(); E_cell; E_cell = E_cell->next()) {
-			selection_pattern->set_cell(E_cell->key() - encompassing_rect_coords.position + Vector2i(0, vertical_offset), E_cell->get()->source_id, E_cell->get()->get_atlas_coords(), E_cell->get()->alternative_tile);
+		for (const KeyValue<Vector2i, const TileMapCell *> &E_cell : organized_pattern) {
+			selection_pattern->set_cell(E_cell.key - encompassing_rect_coords.position + Vector2i(0, vertical_offset), E_cell.value->source_id, E_cell.value->get_atlas_coords(), E_cell.value->alternative_tile);
 		}
 		Vector2i organized_size = selection_pattern->get_size();
 		int unorganized_index = 0;
@@ -2308,14 +2308,14 @@ Set<TileMapEditorTerrainsPlugin::TerrainsTilePattern> TileMapEditorTerrainsPlugi
 
 	// Returns all tiles compatible with the given constraints.
 	Set<TerrainsTilePattern> compatible_terrain_tile_patterns;
-	for (Map<TerrainsTilePattern, Set<TileMapCell>>::Element *E = per_terrain_terrains_tile_patterns_tiles[p_terrain_set].front(); E; E = E->next()) {
+	for (const KeyValue<TerrainsTilePattern, Set<TileMapCell>> &E : per_terrain_terrains_tile_patterns_tiles[p_terrain_set]) {
 		int valid = true;
 		int in_pattern_count = 0;
 		for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) {
 			TileSet::CellNeighbor bit = TileSet::CellNeighbor(i);
 			if (tile_set->is_valid_peering_bit_terrain(p_terrain_set, bit)) {
 				// Check if the bit is compatible with the constraints.
-				Constraint terrain_bit_constraint = Constraint(tile_map, p_position, bit, E->key()[in_pattern_count]);
+				Constraint terrain_bit_constraint = Constraint(tile_map, p_position, bit, E.key[in_pattern_count]);
 
 				Set<Constraint>::Element *in_set_constraint_element = p_constraints.find(terrain_bit_constraint);
 				if (in_set_constraint_element && in_set_constraint_element->get().get_terrain() != terrain_bit_constraint.get_terrain()) {
@@ -2327,7 +2327,7 @@ Set<TileMapEditorTerrainsPlugin::TerrainsTilePattern> TileMapEditorTerrainsPlugi
 		}
 
 		if (valid) {
-			compatible_terrain_tile_patterns.insert(E->key());
+			compatible_terrain_tile_patterns.insert(E.key);
 		}
 	}
 
@@ -2368,15 +2368,15 @@ Set<TileMapEditorTerrainsPlugin::Constraint> TileMapEditorTerrainsPlugin::_get_c
 
 		// Count the number of occurrences per terrain.
 		Map<Vector2i, TileSet::CellNeighbor> overlapping_terrain_bits = c.get_overlapping_coords_and_peering_bits();
-		for (Map<Vector2i, TileSet::CellNeighbor>::Element *E_overlapping = overlapping_terrain_bits.front(); E_overlapping; E_overlapping = E_overlapping->next()) {
-			if (!p_to_replace.has(E_overlapping->key())) {
-				TileMapCell neighbor_cell = tile_map->get_cell(tile_map_layer, E_overlapping->key());
+		for (const KeyValue<Vector2i, TileSet::CellNeighbor> &E_overlapping : overlapping_terrain_bits) {
+			if (!p_to_replace.has(E_overlapping.key)) {
+				TileMapCell neighbor_cell = tile_map->get_cell(tile_map_layer, E_overlapping.key);
 				TileData *neighbor_tile_data = nullptr;
 				if (terrain_tiles.has(neighbor_cell) && terrain_tiles[neighbor_cell]->get_terrain_set() == p_terrain_set) {
 					neighbor_tile_data = terrain_tiles[neighbor_cell];
 				}
 
-				int terrain = neighbor_tile_data ? neighbor_tile_data->get_peering_bit_terrain(TileSet::CellNeighbor(E_overlapping->get())) : -1;
+				int terrain = neighbor_tile_data ? neighbor_tile_data->get_peering_bit_terrain(TileSet::CellNeighbor(E_overlapping.value)) : -1;
 				if (terrain_count.has(terrain)) {
 					terrain_count[terrain] = 0;
 				}
@@ -2387,10 +2387,10 @@ Set<TileMapEditorTerrainsPlugin::Constraint> TileMapEditorTerrainsPlugin::_get_c
 		// Get the terrain with the max number of occurrences.
 		int max = 0;
 		int max_terrain = -1;
-		for (Map<int, int>::Element *E_terrain_count = terrain_count.front(); E_terrain_count; E_terrain_count = E_terrain_count->next()) {
-			if (E_terrain_count->get() > max) {
-				max = E_terrain_count->get();
-				max_terrain = E_terrain_count->key();
+		for (const KeyValue<int, int> &E_terrain_count : terrain_count) {
+			if (E_terrain_count.value > max) {
+				max = E_terrain_count.value;
+				max_terrain = E_terrain_count.key;
 			}
 		}
 
@@ -2458,15 +2458,15 @@ Map<Vector2i, TileMapEditorTerrainsPlugin::TerrainsTilePattern> TileMapEditorTer
 	while (!to_replace.is_empty()) {
 		// Compute the minimum number of tile possibilities for each cell.
 		int min_nb_possibilities = 100000000;
-		for (Map<Vector2i, Set<TerrainsTilePattern>>::Element *E = per_cell_acceptable_tiles.front(); E; E = E->next()) {
-			min_nb_possibilities = MIN(min_nb_possibilities, E->get().size());
+		for (const KeyValue<Vector2i, Set<TerrainsTilePattern>> &E : per_cell_acceptable_tiles) {
+			min_nb_possibilities = MIN(min_nb_possibilities, E.value.size());
 		}
 
 		// Get the set of possible cells to fill.
 		LocalVector<Vector2i> to_choose_from;
-		for (Map<Vector2i, Set<TerrainsTilePattern>>::Element *E = per_cell_acceptable_tiles.front(); E; E = E->next()) {
-			if (E->get().size() == min_nb_possibilities) {
-				to_choose_from.push_back(E->key());
+		for (const KeyValue<Vector2i, Set<TerrainsTilePattern>> &E : per_cell_acceptable_tiles) {
+			if (E.value.size() == min_nb_possibilities) {
+				to_choose_from.push_back(E.key);
 			}
 		}
 
@@ -2584,9 +2584,9 @@ Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_terrains(const Map
 
 	// Add the constraints from the added tiles.
 	Set<TileMapEditorTerrainsPlugin::Constraint> added_tiles_constraints_set;
-	for (Map<Vector2i, TerrainsTilePattern>::Element *E_to_paint = p_to_paint.front(); E_to_paint; E_to_paint = E_to_paint->next()) {
-		Vector2i coords = E_to_paint->key();
-		TerrainsTilePattern terrains_tile_pattern = E_to_paint->get();
+	for (const KeyValue<Vector2i, TerrainsTilePattern> &E_to_paint : p_to_paint) {
+		Vector2i coords = E_to_paint.key;
+		TerrainsTilePattern terrains_tile_pattern = E_to_paint.value;
 
 		Set<TileMapEditorTerrainsPlugin::Constraint> cell_constraints = _get_constraints_from_added_tile(coords, p_terrain_set, terrains_tile_pattern);
 		for (Set<TileMapEditorTerrainsPlugin::Constraint>::Element *E = cell_constraints.front(); E; E = E->next()) {
@@ -2596,8 +2596,8 @@ Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_terrains(const Map
 
 	// Build the list of potential tiles to replace.
 	Set<Vector2i> potential_to_replace;
-	for (Map<Vector2i, TerrainsTilePattern>::Element *E_to_paint = p_to_paint.front(); E_to_paint; E_to_paint = E_to_paint->next()) {
-		Vector2i coords = E_to_paint->key();
+	for (const KeyValue<Vector2i, TerrainsTilePattern> &E_to_paint : p_to_paint) {
+		Vector2i coords = E_to_paint.key;
 		for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) {
 			if (tile_map->is_existing_neighbor(TileSet::CellNeighbor(i))) {
 				Vector2i neighbor = tile_map->get_neighbor_cell(coords, TileSet::CellNeighbor(i));
@@ -2612,8 +2612,8 @@ Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_terrains(const Map
 	Set<Vector2i> to_replace;
 
 	// Add the central tiles to the one to replace. TODO: maybe change that.
-	for (Map<Vector2i, TerrainsTilePattern>::Element *E_to_paint = p_to_paint.front(); E_to_paint; E_to_paint = E_to_paint->next()) {
-		to_replace.insert(E_to_paint->key());
+	for (const KeyValue<Vector2i, TerrainsTilePattern> &E_to_paint : p_to_paint) {
+		to_replace.insert(E_to_paint.key);
 	}
 
 	// Add the constraints from the surroundings of the modified areas.
@@ -2627,9 +2627,9 @@ Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_terrains(const Map
 		Map<Constraint, Set<Vector2i>> source_tiles_of_constraint;
 		for (Set<Constraint>::Element *E = removed_cells_constraints_set.front(); E; E = E->next()) {
 			Map<Vector2i, TileSet::CellNeighbor> sources_of_constraint = E->get().get_overlapping_coords_and_peering_bits();
-			for (Map<Vector2i, TileSet::CellNeighbor>::Element *E_source_tile_of_constraint = sources_of_constraint.front(); E_source_tile_of_constraint; E_source_tile_of_constraint = E_source_tile_of_constraint->next()) {
-				if (potential_to_replace.has(E_source_tile_of_constraint->key())) {
-					source_tiles_of_constraint[E->get()].insert(E_source_tile_of_constraint->key());
+			for (const KeyValue<Vector2i, TileSet::CellNeighbor> &E_source_tile_of_constraint : sources_of_constraint) {
+				if (potential_to_replace.has(E_source_tile_of_constraint.key)) {
+					source_tiles_of_constraint[E->get()].insert(E_source_tile_of_constraint.key);
 				}
 			}
 		}
@@ -2646,8 +2646,8 @@ Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_terrains(const Map
 					potential_to_replace.erase(to_add_to_remove);
 					to_replace.insert(to_add_to_remove);
 					to_replace_modified = true;
-					for (Map<Constraint, Set<Vector2i>>::Element *E_source_tiles_of_constraint = source_tiles_of_constraint.front(); E_source_tiles_of_constraint; E_source_tiles_of_constraint = E_source_tiles_of_constraint->next()) {
-						E_source_tiles_of_constraint->get().erase(to_add_to_remove);
+					for (KeyValue<Constraint, Set<Vector2i>> &E_source_tiles_of_constraint : source_tiles_of_constraint) {
+						E_source_tiles_of_constraint.value.erase(to_add_to_remove);
 					}
 					break;
 				}
@@ -2665,13 +2665,13 @@ Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_terrains(const Map
 	Map<Vector2i, TerrainsTilePattern> wfc_output = _wave_function_collapse(to_replace, p_terrain_set, constraints);
 
 	// Use the WFC run for the output.
-	for (Map<Vector2i, TerrainsTilePattern>::Element *E = wfc_output.front(); E; E = E->next()) {
-		output[E->key()] = _get_random_tile_from_pattern(p_terrain_set, E->get());
+	for (const KeyValue<Vector2i, TerrainsTilePattern> &E : wfc_output) {
+		output[E.key] = _get_random_tile_from_pattern(p_terrain_set, E.value);
 	}
 
 	// Override the WFC results to make sure at least the painted tiles are actually painted.
-	for (Map<Vector2i, TerrainsTilePattern>::Element *E_to_paint = p_to_paint.front(); E_to_paint; E_to_paint = E_to_paint->next()) {
-		output[E_to_paint->key()] = _get_random_tile_from_pattern(p_terrain_set, E_to_paint->get());
+	for (const KeyValue<Vector2i, TerrainsTilePattern> &E_to_paint : p_to_paint) {
+		output[E_to_paint.key] = _get_random_tile_from_pattern(p_terrain_set, E_to_paint.value);
 	}
 
 	return output;
@@ -2749,9 +2749,9 @@ void TileMapEditorTerrainsPlugin::_stop_dragging() {
 		} break;
 		case DRAG_TYPE_PAINT: {
 			undo_redo->create_action(TTR("Paint terrain"));
-			for (Map<Vector2i, TileMapCell>::Element *E = drag_modified.front(); E; E = E->next()) {
-				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E->key(), tile_map->get_cell_source_id(tile_map_layer, E->key()), tile_map->get_cell_atlas_coords(tile_map_layer, E->key()), tile_map->get_cell_alternative_tile(tile_map_layer, E->key()));
-				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+			for (const KeyValue<Vector2i, TileMapCell> &E : drag_modified) {
+				undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, tile_map->get_cell_source_id(tile_map_layer, E.key), tile_map->get_cell_atlas_coords(tile_map_layer, E.key), tile_map->get_cell_alternative_tile(tile_map_layer, E.key));
+				undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 			}
 			undo_redo->commit_action(false);
 		} break;
@@ -2825,11 +2825,11 @@ bool TileMapEditorTerrainsPlugin::forward_canvas_gui_input(const Ref<InputEvent>
 						to_draw[line[i]] = selected_terrains_tile_pattern;
 					}
 					Map<Vector2i, TileMapCell> modified = _draw_terrains(to_draw, selected_terrain_set);
-					for (Map<Vector2i, TileMapCell>::Element *E = modified.front(); E; E = E->next()) {
-						if (!drag_modified.has(E->key())) {
-							drag_modified[E->key()] = tile_map->get_cell(tile_map_layer, E->key());
+					for (const KeyValue<Vector2i, TileMapCell> &E : modified) {
+						if (!drag_modified.has(E.key)) {
+							drag_modified[E.key] = tile_map->get_cell(tile_map_layer, E.key);
 						}
-						tile_map->set_cell(tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+						tile_map->set_cell(tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 					}
 				}
 			} break;
@@ -2864,9 +2864,9 @@ bool TileMapEditorTerrainsPlugin::forward_canvas_gui_input(const Ref<InputEvent>
 						terrains_to_draw[tile_map->world_to_map(mpos)] = selected_terrains_tile_pattern;
 
 						Map<Vector2i, TileMapCell> to_draw = _draw_terrains(terrains_to_draw, selected_terrain_set);
-						for (Map<Vector2i, TileMapCell>::Element *E = to_draw.front(); E; E = E->next()) {
-							drag_modified[E->key()] = tile_map->get_cell(tile_map_layer, E->key());
-							tile_map->set_cell(tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile);
+						for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
+							drag_modified[E.key] = tile_map->get_cell(tile_map_layer, E.key);
+							tile_map->set_cell(tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
 						}
 					}
 				}

+ 5 - 5
editor/plugins/tiles/tile_set_atlas_source_editor.cpp

@@ -674,9 +674,9 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
 #undef ADD_TILE_DATA_EDITOR
 
 	// Add tile data editors as children.
-	for (Map<String, TileDataEditor *>::Element *E = tile_data_editors.front(); E; E = E->next()) {
+	for (KeyValue<String, TileDataEditor *> &E : tile_data_editors) {
 		// Tile Data Editor.
-		TileDataEditor *tile_data_editor = E->get();
+		TileDataEditor *tile_data_editor = E.value;
 		if (!tile_data_editor->is_inside_tree()) {
 			tile_data_painting_editor_container->add_child(tile_data_editor);
 		}
@@ -716,9 +716,9 @@ void TileSetAtlasSourceEditor::_update_current_tile_data_editor() {
 	}
 
 	// Hide all editors but the current one.
-	for (Map<String, TileDataEditor *>::Element *E = tile_data_editors.front(); E; E = E->next()) {
-		E->get()->hide();
-		E->get()->get_toolbar()->hide();
+	for (const KeyValue<String, TileDataEditor *> &E : tile_data_editors) {
+		E.value->hide();
+		E.value->get_toolbar()->hide();
 	}
 	if (tile_data_editors.has(property)) {
 		current_tile_data_editor = tile_data_editors[property];

+ 7 - 7
editor/plugins/visual_shader_editor_plugin.cpp

@@ -123,9 +123,9 @@ void VisualShaderGraphPlugin::set_connections(List<VisualShader::Connection> &p_
 
 void VisualShaderGraphPlugin::show_port_preview(VisualShader::Type p_type, int p_node_id, int p_port_id) {
 	if (visual_shader->get_shader_type() == p_type && links.has(p_node_id) && links[p_node_id].output_ports.has(p_port_id)) {
-		for (Map<int, Port>::Element *E = links[p_node_id].output_ports.front(); E; E = E->next()) {
-			if (E->value().preview_button != nullptr) {
-				E->value().preview_button->set_pressed(false);
+		for (const KeyValue<int, Port> &E : links[p_node_id].output_ports) {
+			if (E.value.preview_button != nullptr) {
+				E.value.preview_button->set_pressed(false);
 			}
 		}
 
@@ -264,11 +264,11 @@ void VisualShaderGraphPlugin::register_curve_editor(int p_node_id, int p_index,
 }
 
 void VisualShaderGraphPlugin::update_uniform_refs() {
-	for (Map<int, Link>::Element *E = links.front(); E; E = E->next()) {
-		VisualShaderNodeUniformRef *ref = Object::cast_to<VisualShaderNodeUniformRef>(E->get().visual_node);
+	for (KeyValue<int, Link> &E : links) {
+		VisualShaderNodeUniformRef *ref = Object::cast_to<VisualShaderNodeUniformRef>(E.value.visual_node);
 		if (ref) {
-			remove_node(E->get().type, E->key());
-			add_node(E->get().type, E->key());
+			remove_node(E.value.type, E.key);
+			add_node(E.value.type, E.key);
 		}
 	}
 }

+ 3 - 3
editor/progress_dialog.cpp

@@ -63,9 +63,9 @@ void BackgroundProgress::_add_task(const String &p_task, const String &p_label,
 void BackgroundProgress::_update() {
 	_THREAD_SAFE_METHOD_
 
-	for (Map<String, int>::Element *E = updates.front(); E; E = E->next()) {
-		if (tasks.has(E->key())) {
-			_task_step(E->key(), E->get());
+	for (const KeyValue<String, int> &E : updates) {
+		if (tasks.has(E.key)) {
+			_task_step(E.key, E.value);
 		}
 	}
 

+ 4 - 4
editor/scene_tree_dock.cpp

@@ -517,8 +517,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
 
 				editor_data->get_undo_redo().add_do_method(paste_parent, "add_child", dup);
 
-				for (Map<const Node *, Node *>::Element *E2 = duplimap.front(); E2; E2 = E2->next()) {
-					Node *d = E2->value();
+				for (KeyValue<const Node *, Node *> &E2 : duplimap) {
+					Node *d = E2.value;
 					editor_data->get_undo_redo().add_do_method(d, "set_owner", owner);
 				}
 
@@ -848,8 +848,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
 				break;
 			}
 			Ref<MultiNodeEdit> mne = memnew(MultiNodeEdit);
-			for (const Map<Node *, Object *>::Element *E = editor_selection->get_selection().front(); E; E = E->next()) {
-				mne->add_node(root->get_path_to(E->key()));
+			for (const KeyValue<Node *, Object *> &E : editor_selection->get_selection()) {
+				mne->add_node(root->get_path_to(E.key));
 			}
 
 			EditorNode::get_singleton()->push_item(mne.ptr());

+ 2 - 2
editor/script_create_dialog.cpp

@@ -425,8 +425,8 @@ void ScriptCreateDialog::_lang_changed(int l) {
 			templates[i].id = new_id;
 		}
 		// Disable overridden
-		for (Map<String, Vector<int>>::Element *E = template_overrides.front(); E; E = E->next()) {
-			const Vector<int> &overrides = E->get();
+		for (const KeyValue<String, Vector<int>> &E : template_overrides) {
+			const Vector<int> &overrides = E.value;
 
 			if (overrides.size() == 1) {
 				continue; // doesn't override anything

+ 2 - 2
editor/settings_config_dialog.cpp

@@ -382,8 +382,8 @@ void EditorSettingsDialog::_update_shortcuts() {
 	}
 
 	// remove sections with no shortcuts
-	for (Map<String, TreeItem *>::Element *E = sections.front(); E; E = E->next()) {
-		TreeItem *section = E->get();
+	for (KeyValue<String, TreeItem *> &E : sections) {
+		TreeItem *section = E.value;
 		if (section->get_first_child() == nullptr) {
 			root->remove_child(section);
 		}

+ 2 - 2
modules/bullet/bullet_physics_server.cpp

@@ -1404,8 +1404,8 @@ void BulletPhysicsServer3D::free(RID p_rid) {
 		ShapeBullet *shape = shape_owner.get_or_null(p_rid);
 
 		// Notify the shape is configured
-		for (Map<ShapeOwnerBullet *, int>::Element *element = shape->get_owners().front(); element; element = element->next()) {
-			static_cast<ShapeOwnerBullet *>(element->key())->remove_shape_full(shape);
+		for (const KeyValue<ShapeOwnerBullet *, int> &element : shape->get_owners()) {
+			static_cast<ShapeOwnerBullet *>(element.key)->remove_shape_full(shape);
 		}
 
 		shape_owner.free(p_rid);

+ 2 - 2
modules/bullet/shape_bullet.cpp

@@ -63,8 +63,8 @@ btCollisionShape *ShapeBullet::prepare(btCollisionShape *p_btShape) const {
 }
 
 void ShapeBullet::notifyShapeChanged() {
-	for (Map<ShapeOwnerBullet *, int>::Element *E = owners.front(); E; E = E->next()) {
-		ShapeOwnerBullet *owner = static_cast<ShapeOwnerBullet *>(E->key());
+	for (const KeyValue<ShapeOwnerBullet *, int> &E : owners) {
+		ShapeOwnerBullet *owner = static_cast<ShapeOwnerBullet *>(E.key);
 		owner->shape_changed(owner->find_shape(this));
 	}
 }

+ 4 - 4
modules/csg/csg.cpp

@@ -258,8 +258,8 @@ void CSGBrush::build_from_faces(const Vector<Vector3> &p_vertices, const Vector<
 	}
 
 	materials.resize(material_map.size());
-	for (Map<Ref<Material>, int>::Element *E = material_map.front(); E; E = E->next()) {
-		materials.write[E->get()] = E->key();
+	for (const KeyValue<Ref<Material>, int> &E : material_map) {
+		materials.write[E.value] = E.key;
 	}
 
 	_regen_face_aabbs();
@@ -457,8 +457,8 @@ void CSGBrushOperation::merge_brushes(Operation p_operation, const CSGBrush &p_b
 
 	// Update the list of materials.
 	r_merged_brush.materials.resize(mesh_merge.materials.size());
-	for (const Map<Ref<Material>, int>::Element *E = mesh_merge.materials.front(); E; E = E->next()) {
-		r_merged_brush.materials.write[E->get()] = E->key();
+	for (const KeyValue<Ref<Material>, int> &E : mesh_merge.materials) {
+		r_merged_brush.materials.write[E.value] = E.key;
 	}
 }
 

+ 3 - 3
modules/fbx/data/fbx_skeleton.cpp

@@ -98,9 +98,9 @@ void FBXSkeleton::init_skeleton(const ImportState &state) {
 
 	ERR_FAIL_COND_MSG(skeleton->get_bone_count() != bone_count, "Not all bones got added, is the file corrupted?");
 
-	for (Map<int, Ref<FBXBone>>::Element *bone_element = bone_map.front(); bone_element; bone_element = bone_element->next()) {
-		const Ref<FBXBone> bone = bone_element->value();
-		int bone_index = bone_element->key();
+	for (const KeyValue<int, Ref<FBXBone>> &bone_element : bone_map) {
+		const Ref<FBXBone> bone = bone_element.value;
+		int bone_index = bone_element.key;
 		print_verbose("working on bone: " + itos(bone_index) + " bone name:" + bone->bone_name);
 
 		skeleton->set_bone_rest(bone->godot_bone_id, get_unscaled_transform(bone->node->pivot_transform->LocalTransform, state.scale));

+ 17 - 17
modules/fbx/editor_scene_importer_fbx.cpp

@@ -567,8 +567,8 @@ Node3D *EditorSceneImporterFBX::_generate_scene(
 		// this means that the nodes from maya kLocators will be preserved as bones
 		// in the same rig without having to match this across skeletons and merge by detection
 		// we can just merge and undo any parent transforms
-		for (Map<uint64_t, Ref<FBXBone>>::Element *bone_element = state.fbx_bone_map.front(); bone_element; bone_element = bone_element->next()) {
-			Ref<FBXBone> bone = bone_element->value();
+		for (KeyValue<uint64_t, Ref<FBXBone>> &bone_element : state.fbx_bone_map) {
+			Ref<FBXBone> bone = bone_element.value;
 			Ref<FBXSkeleton> fbx_skeleton_inst;
 
 			uint64_t armature_id = bone->armature_id;
@@ -609,8 +609,8 @@ Node3D *EditorSceneImporterFBX::_generate_scene(
 		}
 
 		// setup skeleton instances if required :)
-		for (Map<uint64_t, Ref<FBXSkeleton>>::Element *skeleton_node = state.skeleton_map.front(); skeleton_node; skeleton_node = skeleton_node->next()) {
-			Ref<FBXSkeleton> &skeleton = skeleton_node->value();
+		for (KeyValue<uint64_t, Ref<FBXSkeleton>> &skeleton_node : state.skeleton_map) {
+			Ref<FBXSkeleton> &skeleton = skeleton_node.value;
 			skeleton->init_skeleton(state);
 
 			ERR_CONTINUE_MSG(skeleton->fbx_node.is_null(), "invalid fbx target map, missing skeleton");
@@ -699,9 +699,9 @@ Node3D *EditorSceneImporterFBX::_generate_scene(
 		}
 	}
 
-	for (Map<uint64_t, Ref<FBXMeshData>>::Element *mesh_data = state.renderer_mesh_data.front(); mesh_data; mesh_data = mesh_data->next()) {
-		const uint64_t mesh_id = mesh_data->key();
-		Ref<FBXMeshData> mesh = mesh_data->value();
+	for (KeyValue<uint64_t, Ref<FBXMeshData>> &mesh_data : state.renderer_mesh_data) {
+		const uint64_t mesh_id = mesh_data.key;
+		Ref<FBXMeshData> mesh = mesh_data.value;
 
 		const FBXDocParser::MeshGeometry *mesh_geometry = p_document->GetObject(mesh_id)->Get<FBXDocParser::MeshGeometry>();
 
@@ -765,9 +765,9 @@ Node3D *EditorSceneImporterFBX::_generate_scene(
 	}
 
 	// mesh data iteration for populating skeleton mapping
-	for (Map<uint64_t, Ref<FBXMeshData>>::Element *mesh_data = state.renderer_mesh_data.front(); mesh_data; mesh_data = mesh_data->next()) {
-		Ref<FBXMeshData> mesh = mesh_data->value();
-		const uint64_t mesh_id = mesh_data->key();
+	for (KeyValue<uint64_t, Ref<FBXMeshData>> &mesh_data : state.renderer_mesh_data) {
+		Ref<FBXMeshData> mesh = mesh_data.value;
+		const uint64_t mesh_id = mesh_data.key;
 		EditorSceneImporterMeshNode3D *mesh_instance = mesh->godot_mesh_instance;
 		const int mesh_weights = mesh->max_weight_count;
 		Ref<FBXSkeleton> skeleton;
@@ -1004,13 +1004,13 @@ Node3D *EditorSceneImporterFBX::_generate_scene(
 
 					// target id, [ track name, [time index, vector] ]
 					//std::map<uint64_t, std::map<StringName, FBXTrack > > AnimCurveNodes;
-					for (Map<uint64_t, Map<StringName, FBXTrack>>::Element *track = AnimCurveNodes.front(); track; track = track->next()) {
+					for (KeyValue<uint64_t, Map<StringName, FBXTrack>> &track : AnimCurveNodes) {
 						// 5 tracks
 						// current track index
 						// track count is 5
 						// track count is 5.
 						// next track id is 5.
-						const uint64_t target_id = track->key();
+						const uint64_t target_id = track.key;
 						int track_idx = animation->add_track(Animation::TYPE_TRANSFORM3D);
 
 						// animation->track_set_path(track_idx, node_path);
@@ -1072,7 +1072,7 @@ Node3D *EditorSceneImporterFBX::_generate_scene(
 						const FBXDocParser::Model *model = target_node->fbx_model;
 						const FBXDocParser::PropertyTable *props = dynamic_cast<const FBXDocParser::PropertyTable *>(model);
 
-						Map<StringName, FBXTrack> &track_data = track->value();
+						Map<StringName, FBXTrack> &track_data = track.value;
 						FBXTrack &translation_keys = track_data[StringName("T")];
 						FBXTrack &rotation_keys = track_data[StringName("R")];
 						FBXTrack &scale_keys = track_data[StringName("S")];
@@ -1259,15 +1259,15 @@ Node3D *EditorSceneImporterFBX::_generate_scene(
 	state.fbx_target_map.clear();
 	state.fbx_node_list.clear();
 
-	for (Map<uint64_t, Ref<FBXBone>>::Element *element = state.fbx_bone_map.front(); element; element = element->next()) {
-		Ref<FBXBone> bone = element->value();
+	for (KeyValue<uint64_t, Ref<FBXBone>> &element : state.fbx_bone_map) {
+		Ref<FBXBone> bone = element.value;
 		bone->parent_bone.unref();
 		bone->node.unref();
 		bone->fbx_skeleton.unref();
 	}
 
-	for (Map<uint64_t, Ref<FBXSkeleton>>::Element *element = state.skeleton_map.front(); element; element = element->next()) {
-		Ref<FBXSkeleton> skel = element->value();
+	for (KeyValue<uint64_t, Ref<FBXSkeleton>> &element : state.skeleton_map) {
+		Ref<FBXSkeleton> skel = element.value;
 		skel->fbx_node.unref();
 		skel->skeleton_bones.clear();
 	}

+ 3 - 3
modules/fbx/tools/validation_tools.h

@@ -53,9 +53,9 @@ protected:
 			String csv_header = "file_path, error message, extra data\n";
 			massive_log_file += csv_header;
 
-			for (Map<String, LocalVector<String>>::Element *element = validation_entries.front(); element; element = element->next()) {
-				for (unsigned int x = 0; x < element->value().size(); x++) {
-					const String &line_entry = element->key() + ", " + element->value()[x].c_escape() + "\n";
+			for (const KeyValue<String, LocalVector<String>> &element : validation_entries) {
+				for (unsigned int x = 0; x < element.value.size(); x++) {
+					const String &line_entry = element.key + ", " + element.value[x].c_escape() + "\n";
 					massive_log_file += line_entry;
 				}
 			}

+ 9 - 9
modules/gdnative/gdnative_library_editor_plugin.cpp

@@ -38,9 +38,9 @@ void GDNativeLibraryEditor::edit(Ref<GDNativeLibrary> p_library) {
 	library = p_library;
 	Ref<ConfigFile> config = p_library->get_config_file();
 
-	for (Map<String, NativePlatformConfig>::Element *E = platforms.front(); E; E = E->next()) {
-		for (List<String>::Element *it = E->value().entries.front(); it; it = it->next()) {
-			String target = E->key() + "." + it->get();
+	for (KeyValue<String, NativePlatformConfig> &E : platforms) {
+		for (List<String>::Element *it = E.value.entries.front(); it; it = it->next()) {
+			String target = E.key + "." + it->get();
 			TargetConfig ecfg;
 			ecfg.library = config->get_value("entry", target, "");
 			ecfg.dependencies = config->get_value("dependencies", target, Array());
@@ -245,9 +245,9 @@ void GDNativeLibraryEditor::_translate_to_config_file() {
 		config->erase_section("entry");
 		config->erase_section("dependencies");
 
-		for (Map<String, NativePlatformConfig>::Element *E = platforms.front(); E; E = E->next()) {
-			for (List<String>::Element *it = E->value().entries.front(); it; it = it->next()) {
-				String target = E->key() + "." + it->get();
+		for (KeyValue<String, NativePlatformConfig> &E : platforms) {
+			for (List<String>::Element *it = E.value.entries.front(); it; it = it->next()) {
+				String target = E.key + "." + it->get();
 				if (entry_configs[target].library.is_empty() && entry_configs[target].dependencies.is_empty()) {
 					continue;
 				}
@@ -341,9 +341,9 @@ GDNativeLibraryEditor::GDNativeLibraryEditor() {
 	filter_list->set_hide_on_checkable_item_selection(false);
 
 	int idx = 0;
-	for (Map<String, NativePlatformConfig>::Element *E = platforms.front(); E; E = E->next()) {
-		filter_list->add_check_item(E->get().name, idx);
-		filter_list->set_item_metadata(idx, E->key());
+	for (const KeyValue<String, NativePlatformConfig> &E : platforms) {
+		filter_list->add_check_item(E.value.name, idx);
+		filter_list->set_item_metadata(idx, E.key);
 		filter_list->set_item_checked(idx, true);
 		idx += 1;
 	}

+ 2 - 2
modules/gdnative/nativescript/api_generator.cpp

@@ -223,8 +223,8 @@ List<ClassAPI> generate_c_api_classes() {
 				enum_api_map[enum_name] = enum_api;
 			}
 		}
-		for (const Map<StringName, EnumAPI>::Element *E = enum_api_map.front(); E; E = E->next()) {
-			global_constants_api.enums.push_back(E->get());
+		for (const KeyValue<StringName, EnumAPI> &E : enum_api_map) {
+			global_constants_api.enums.push_back(E.value);
 		}
 		global_constants_api.constants.sort_custom<ConstantAPIComparator>();
 		api.push_back(global_constants_api);

+ 62 - 62
modules/gdnative/nativescript/nativescript.cpp

@@ -360,8 +360,8 @@ void NativeScript::get_script_signal_list(List<MethodInfo> *r_signals) const {
 	Set<MethodInfo> signals_;
 
 	while (script_data) {
-		for (Map<StringName, NativeScriptDesc::Signal>::Element *S = script_data->signals_.front(); S; S = S->next()) {
-			signals_.insert(S->get().signal);
+		for (const KeyValue<StringName, NativeScriptDesc::Signal> &S : script_data->signals_) {
+			signals_.insert(S.value.signal);
 		}
 
 		script_data = script_data->base_data;
@@ -401,8 +401,8 @@ void NativeScript::get_script_method_list(List<MethodInfo> *p_list) const {
 	Set<MethodInfo> methods;
 
 	while (script_data) {
-		for (Map<StringName, NativeScriptDesc::Method>::Element *E = script_data->methods.front(); E; E = E->next()) {
-			methods.insert(E->get().info);
+		for (const KeyValue<StringName, NativeScriptDesc::Method> &E : script_data->methods) {
+			methods.insert(E.value.info);
 		}
 
 		script_data = script_data->base_data;
@@ -857,9 +857,9 @@ NativeScriptLanguage *NativeScriptLanguage::singleton;
 void NativeScriptLanguage::_unload_stuff(bool p_reload) {
 	Map<String, Ref<GDNative>> erase_and_unload;
 
-	for (Map<String, Map<StringName, NativeScriptDesc>>::Element *L = library_classes.front(); L; L = L->next()) {
-		String lib_path = L->key();
-		Map<StringName, NativeScriptDesc> classes = L->get();
+	for (KeyValue<String, Map<StringName, NativeScriptDesc>> &L : library_classes) {
+		String lib_path = L.key;
+		Map<StringName, NativeScriptDesc> classes = L.value;
 
 		if (p_reload) {
 			Map<String, Ref<GDNative>>::Element *E = library_gdnatives.find(lib_path);
@@ -890,9 +890,9 @@ void NativeScriptLanguage::_unload_stuff(bool p_reload) {
 			gdn = E->get();
 		}
 
-		for (Map<StringName, NativeScriptDesc>::Element *C = classes.front(); C; C = C->next()) {
+		for (KeyValue<StringName, NativeScriptDesc> &C : classes) {
 			// free property stuff first
-			for (OrderedHashMap<StringName, NativeScriptDesc::Property>::Element P = C->get().properties.front(); P; P = P.next()) {
+			for (OrderedHashMap<StringName, NativeScriptDesc::Property>::Element P = C.value.properties.front(); P; P = P.next()) {
 				if (P.get().getter.free_func) {
 					P.get().getter.free_func(P.get().getter.method_data);
 				}
@@ -903,28 +903,28 @@ void NativeScriptLanguage::_unload_stuff(bool p_reload) {
 			}
 
 			// free method stuff
-			for (Map<StringName, NativeScriptDesc::Method>::Element *M = C->get().methods.front(); M; M = M->next()) {
-				if (M->get().method.free_func) {
-					M->get().method.free_func(M->get().method.method_data);
+			for (const KeyValue<StringName, NativeScriptDesc::Method> &M : C.value.methods) {
+				if (M.value.method.free_func) {
+					M.value.method.free_func(M.value.method.method_data);
 				}
 			}
 
 			// free constructor/destructor
-			if (C->get().create_func.free_func) {
-				C->get().create_func.free_func(C->get().create_func.method_data);
+			if (C.value.create_func.free_func) {
+				C.value.create_func.free_func(C.value.create_func.method_data);
 			}
 
-			if (C->get().destroy_func.free_func) {
-				C->get().destroy_func.free_func(C->get().destroy_func.method_data);
+			if (C.value.destroy_func.free_func) {
+				C.value.destroy_func.free_func(C.value.destroy_func.method_data);
 			}
 		}
 
 		erase_and_unload.insert(lib_path, gdn);
 	}
 
-	for (Map<String, Ref<GDNative>>::Element *E = erase_and_unload.front(); E; E = E->next()) {
-		String lib_path = E->key();
-		Ref<GDNative> gdn = E->get();
+	for (KeyValue<String, Ref<GDNative>> &E : erase_and_unload) {
+		String lib_path = E.key;
+		Ref<GDNative> gdn = E.value;
 
 		library_classes.erase(lib_path);
 
@@ -957,8 +957,8 @@ NativeScriptLanguage::NativeScriptLanguage() {
 }
 
 NativeScriptLanguage::~NativeScriptLanguage() {
-	for (Map<String, Ref<GDNative>>::Element *L = NSL->library_gdnatives.front(); L; L = L->next()) {
-		Ref<GDNative> lib = L->get();
+	for (KeyValue<String, Ref<GDNative>> &L : NSL->library_gdnatives) {
+		Ref<GDNative> lib = L.value;
 		// only shut down valid libs, duh!
 		if (lib.is_valid()) {
 			// If it's a singleton-library then the gdnative module
@@ -1157,15 +1157,15 @@ int NativeScriptLanguage::profiling_get_accumulated_data(ProfilingInfo *p_info_a
 
 	int current = 0;
 
-	for (Map<StringName, ProfileData>::Element *d = profile_data.front(); d; d = d->next()) {
+	for (const KeyValue<StringName, ProfileData> &d : profile_data) {
 		if (current >= p_info_max) {
 			break;
 		}
 
-		p_info_arr[current].call_count = d->get().call_count;
-		p_info_arr[current].self_time = d->get().self_time;
-		p_info_arr[current].total_time = d->get().total_time;
-		p_info_arr[current].signature = d->get().signature;
+		p_info_arr[current].call_count = d.value.call_count;
+		p_info_arr[current].self_time = d.value.self_time;
+		p_info_arr[current].total_time = d.value.total_time;
+		p_info_arr[current].signature = d.value.signature;
 		current++;
 	}
 
@@ -1181,16 +1181,16 @@ int NativeScriptLanguage::profiling_get_frame_data(ProfilingInfo *p_info_arr, in
 
 	int current = 0;
 
-	for (Map<StringName, ProfileData>::Element *d = profile_data.front(); d; d = d->next()) {
+	for (const KeyValue<StringName, ProfileData> &d : profile_data) {
 		if (current >= p_info_max) {
 			break;
 		}
 
-		if (d->get().last_frame_call_count) {
-			p_info_arr[current].call_count = d->get().last_frame_call_count;
-			p_info_arr[current].self_time = d->get().last_frame_self_time;
-			p_info_arr[current].total_time = d->get().last_frame_total_time;
-			p_info_arr[current].signature = d->get().signature;
+		if (d.value.last_frame_call_count) {
+			p_info_arr[current].call_count = d.value.last_frame_call_count;
+			p_info_arr[current].self_time = d.value.last_frame_self_time;
+			p_info_arr[current].total_time = d.value.last_frame_total_time;
+			p_info_arr[current].signature = d.value.signature;
 			current++;
 		}
 	}
@@ -1503,9 +1503,9 @@ void NativeScriptLanguage::unregister_script(NativeScript *script) {
 				if (L) {
 					Map<StringName, NativeScriptDesc> classes = L->get();
 
-					for (Map<StringName, NativeScriptDesc>::Element *C = classes.front(); C; C = C->next()) {
+					for (KeyValue<StringName, NativeScriptDesc> &C : classes) {
 						// free property stuff first
-						for (OrderedHashMap<StringName, NativeScriptDesc::Property>::Element P = C->get().properties.front(); P; P = P.next()) {
+						for (OrderedHashMap<StringName, NativeScriptDesc::Property>::Element P = C.value.properties.front(); P; P = P.next()) {
 							if (P.get().getter.free_func) {
 								P.get().getter.free_func(P.get().getter.method_data);
 							}
@@ -1516,19 +1516,19 @@ void NativeScriptLanguage::unregister_script(NativeScript *script) {
 						}
 
 						// free method stuff
-						for (Map<StringName, NativeScriptDesc::Method>::Element *M = C->get().methods.front(); M; M = M->next()) {
-							if (M->get().method.free_func) {
-								M->get().method.free_func(M->get().method.method_data);
+						for (const KeyValue<StringName, NativeScriptDesc::Method> &M : C.value.methods) {
+							if (M.value.method.free_func) {
+								M.value.method.free_func(M.value.method.method_data);
 							}
 						}
 
 						// free constructor/destructor
-						if (C->get().create_func.free_func) {
-							C->get().create_func.free_func(C->get().create_func.method_data);
+						if (C.value.create_func.free_func) {
+							C.value.create_func.free_func(C.value.create_func.method_data);
 						}
 
-						if (C->get().destroy_func.free_func) {
-							C->get().destroy_func.free_func(C->get().destroy_func.method_data);
+						if (C.value.destroy_func.free_func) {
+							C.value.destroy_func.free_func(C.value.destroy_func.method_data);
 						}
 					}
 
@@ -1548,14 +1548,14 @@ void NativeScriptLanguage::unregister_script(NativeScript *script) {
 
 void NativeScriptLanguage::call_libraries_cb(const StringName &name) {
 	// library_gdnatives is modified only from the main thread, so it's safe not to use mutex here
-	for (Map<String, Ref<GDNative>>::Element *L = library_gdnatives.front(); L; L = L->next()) {
-		if (L->get().is_null()) {
+	for (KeyValue<String, Ref<GDNative>> &L : library_gdnatives) {
+		if (L.value.is_null()) {
 			continue;
 		}
 
-		if (L->get()->is_initialized()) {
+		if (L.value->is_initialized()) {
 			void *proc_ptr;
-			Error err = L->get()->get_symbol(L->get()->get_library()->get_symbol_prefix() + name, proc_ptr);
+			Error err = L.value->get_symbol(L.value->get_library()->get_symbol_prefix() + name, proc_ptr);
 
 			if (!err) {
 				((void (*)())proc_ptr)();
@@ -1584,13 +1584,13 @@ void NativeScriptLanguage::frame() {
 	{
 		MutexLock lock(mutex);
 
-		for (Map<StringName, ProfileData>::Element *d = profile_data.front(); d; d = d->next()) {
-			d->get().last_frame_call_count = d->get().frame_call_count;
-			d->get().last_frame_self_time = d->get().frame_self_time;
-			d->get().last_frame_total_time = d->get().frame_total_time;
-			d->get().frame_call_count = 0;
-			d->get().frame_self_time = 0;
-			d->get().frame_total_time = 0;
+		for (KeyValue<StringName, ProfileData> &d : profile_data) {
+			d.value.last_frame_call_count = d.value.frame_call_count;
+			d.value.last_frame_self_time = d.value.frame_self_time;
+			d.value.last_frame_total_time = d.value.frame_total_time;
+			d.value.frame_call_count = 0;
+			d.value.frame_self_time = 0;
+			d.value.frame_total_time = 0;
 		}
 	}
 #endif
@@ -1651,8 +1651,8 @@ void NativeReloadNode::_notification(int p_what) {
 			MutexLock lock(NSL->mutex);
 			NSL->_unload_stuff(true);
 
-			for (Map<String, Ref<GDNative>>::Element *L = NSL->library_gdnatives.front(); L; L = L->next()) {
-				Ref<GDNative> gdn = L->get();
+			for (KeyValue<String, Ref<GDNative>> &L : NSL->library_gdnatives) {
+				Ref<GDNative> gdn = L.value;
 
 				if (gdn.is_null()) {
 					continue;
@@ -1685,8 +1685,8 @@ void NativeReloadNode::_notification(int p_what) {
 			MutexLock lock(NSL->mutex);
 
 			Set<StringName> libs_to_remove;
-			for (Map<String, Ref<GDNative>>::Element *L = NSL->library_gdnatives.front(); L; L = L->next()) {
-				Ref<GDNative> gdn = L->get();
+			for (KeyValue<String, Ref<GDNative>> &L : NSL->library_gdnatives) {
+				Ref<GDNative> gdn = L.value;
 
 				if (gdn.is_null()) {
 					continue;
@@ -1703,24 +1703,24 @@ void NativeReloadNode::_notification(int p_what) {
 				}
 
 				if (!gdn->initialize()) {
-					libs_to_remove.insert(L->key());
+					libs_to_remove.insert(L.key);
 					continue;
 				}
 
-				NSL->library_classes.insert(L->key(), Map<StringName, NativeScriptDesc>());
+				NSL->library_classes.insert(L.key, Map<StringName, NativeScriptDesc>());
 
 				// here the library registers all the classes and stuff.
 
 				void *proc_ptr;
 				Error err = gdn->get_symbol(gdn->get_library()->get_symbol_prefix() + "nativescript_init", proc_ptr);
 				if (err != OK) {
-					ERR_PRINT(String("No godot_nativescript_init in \"" + L->key() + "\" found").utf8().get_data());
+					ERR_PRINT(String("No godot_nativescript_init in \"" + L.key + "\" found").utf8().get_data());
 				} else {
-					((void (*)(void *))proc_ptr)((void *)&L->key());
+					((void (*)(void *))proc_ptr)((void *)&L.key);
 				}
 
-				for (Map<String, Set<NativeScript *>>::Element *U = NSL->library_script_users.front(); U; U = U->next()) {
-					for (Set<NativeScript *>::Element *S = U->get().front(); S; S = S->next()) {
+				for (KeyValue<String, Set<NativeScript *>> &U : NSL->library_script_users) {
+					for (Set<NativeScript *>::Element *S = U.value.front(); S; S = S->next()) {
 						NativeScript *script = S->get();
 
 						if (script->placeholders.size() == 0) {

+ 74 - 74
modules/gdscript/gdscript.cpp

@@ -122,8 +122,8 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco
 	instance->owner_id = p_owner->get_instance_id();
 #ifdef DEBUG_ENABLED
 	//needed for hot reloading
-	for (Map<StringName, MemberInfo>::Element *E = member_indices.front(); E; E = E->next()) {
-		instance->member_indices_cache[E->key()] = E->get().index;
+	for (const KeyValue<StringName, MemberInfo> &E : member_indices) {
+		instance->member_indices_cache[E.key] = E.value.index;
 	}
 #endif
 	instance->owner->set_script_instance(instance);
@@ -253,10 +253,10 @@ void GDScript::_placeholder_erased(PlaceHolderScriptInstance *p_placeholder) {
 void GDScript::_get_script_method_list(List<MethodInfo> *r_list, bool p_include_base) const {
 	const GDScript *current = this;
 	while (current) {
-		for (const Map<StringName, GDScriptFunction *>::Element *E = current->member_functions.front(); E; E = E->next()) {
-			GDScriptFunction *func = E->get();
+		for (const KeyValue<StringName, GDScriptFunction *> &E : current->member_functions) {
+			GDScriptFunction *func = E.value;
 			MethodInfo mi;
-			mi.name = E->key();
+			mi.name = E.key;
 			for (int i = 0; i < func->get_argument_count(); i++) {
 				PropertyInfo arginfo = func->get_argument_type(i);
 #ifdef TOOLS_ENABLED
@@ -286,11 +286,11 @@ void GDScript::_get_script_property_list(List<PropertyInfo> *r_list, bool p_incl
 
 	while (sptr) {
 		Vector<_GDScriptMemberSort> msort;
-		for (Map<StringName, PropertyInfo>::Element *E = sptr->member_info.front(); E; E = E->next()) {
+		for (const KeyValue<StringName, PropertyInfo> &E : sptr->member_info) {
 			_GDScriptMemberSort ms;
-			ERR_CONTINUE(!sptr->member_indices.has(E->key()));
-			ms.index = sptr->member_indices[E->key()].index;
-			ms.name = E->key();
+			ERR_CONTINUE(!sptr->member_indices.has(E.key));
+			ms.index = sptr->member_indices[E.key].index;
+			ms.name = E.key;
 			msort.push_back(ms);
 		}
 
@@ -412,8 +412,8 @@ void GDScript::_update_exports_values(Map<StringName, Variant> &values, List<Pro
 		base_cache->_update_exports_values(values, propnames);
 	}
 
-	for (Map<StringName, Variant>::Element *E = member_default_values_cache.front(); E; E = E->next()) {
-		values[E->key()] = E->get();
+	for (const KeyValue<StringName, Variant> &E : member_default_values_cache) {
+		values[E.key] = E.value;
 	}
 
 	for (const PropertyInfo &E : members_cache) {
@@ -471,9 +471,9 @@ void GDScript::_update_doc() {
 	doc.description = doc_description;
 	doc.tutorials = doc_tutorials;
 
-	for (Map<String, DocData::EnumDoc>::Element *E = doc_enums.front(); E; E = E->next()) {
-		if (E->value().description != "") {
-			doc.enums[E->key()] = E->value().description;
+	for (const KeyValue<String, DocData::EnumDoc> &E : doc_enums) {
+		if (E.value.description != "") {
+			doc.enums[E.key] = E.value.description;
 		}
 	}
 
@@ -552,29 +552,29 @@ void GDScript::_update_doc() {
 		doc.signals.push_back(signal_doc);
 	}
 
-	for (Map<StringName, Variant>::Element *E = constants.front(); E; E = E->next()) {
-		if (subclasses.has(E->key())) {
+	for (const KeyValue<StringName, Variant> &E : constants) {
+		if (subclasses.has(E.key)) {
 			continue;
 		}
 
 		// Enums.
 		bool is_enum = false;
-		if (E->value().get_type() == Variant::DICTIONARY) {
-			if (doc_enums.has(E->key())) {
+		if (E.value.get_type() == Variant::DICTIONARY) {
+			if (doc_enums.has(E.key)) {
 				is_enum = true;
-				for (int i = 0; i < doc_enums[E->key()].values.size(); i++) {
-					doc_enums[E->key()].values.write[i].enumeration = E->key();
-					doc.constants.push_back(doc_enums[E->key()].values[i]);
+				for (int i = 0; i < doc_enums[E.key].values.size(); i++) {
+					doc_enums[E.key].values.write[i].enumeration = E.key;
+					doc.constants.push_back(doc_enums[E.key].values[i]);
 				}
 			}
 		}
 		if (!is_enum && doc_enums.has("@unnamed_enums")) {
 			for (int i = 0; i < doc_enums["@unnamed_enums"].values.size(); i++) {
-				if (E->key() == doc_enums["@unnamed_enums"].values[i].name) {
+				if (E.key == doc_enums["@unnamed_enums"].values[i].name) {
 					is_enum = true;
 					DocData::ConstantDoc constant_doc;
 					constant_doc.enumeration = "@unnamed_enums";
-					DocData::constant_doc_from_variant(constant_doc, E->key(), E->value(), doc_enums["@unnamed_enums"].values[i].description);
+					DocData::constant_doc_from_variant(constant_doc, E.key, E.value, doc_enums["@unnamed_enums"].values[i].description);
 					doc.constants.push_back(constant_doc);
 					break;
 				}
@@ -583,16 +583,16 @@ void GDScript::_update_doc() {
 		if (!is_enum) {
 			DocData::ConstantDoc constant_doc;
 			String doc_description;
-			if (doc_constants.has(E->key())) {
-				doc_description = doc_constants[E->key()];
+			if (doc_constants.has(E.key)) {
+				doc_description = doc_constants[E.key];
 			}
-			DocData::constant_doc_from_variant(constant_doc, E->key(), E->value(), doc_description);
+			DocData::constant_doc_from_variant(constant_doc, E.key, E.value, doc_description);
 			doc.constants.push_back(constant_doc);
 		}
 	}
 
-	for (Map<StringName, Ref<GDScript>>::Element *E = subclasses.front(); E; E = E->next()) {
-		E->get()->_update_doc();
+	for (KeyValue<StringName, Ref<GDScript>> &E : subclasses) {
+		E.value->_update_doc();
 	}
 
 	_add_doc(doc);
@@ -784,8 +784,8 @@ void GDScript::update_exports() {
 
 void GDScript::_set_subclass_path(Ref<GDScript> &p_sc, const String &p_path) {
 	p_sc->path = p_path;
-	for (Map<StringName, Ref<GDScript>>::Element *E = p_sc->subclasses.front(); E; E = E->next()) {
-		_set_subclass_path(E->get(), p_path);
+	for (KeyValue<StringName, Ref<GDScript>> &E : p_sc->subclasses) {
+		_set_subclass_path(E.value, p_path);
 	}
 }
 
@@ -886,8 +886,8 @@ Error GDScript::reload(bool p_keep_state) {
 
 	valid = true;
 
-	for (Map<StringName, Ref<GDScript>>::Element *E = subclasses.front(); E; E = E->next()) {
-		_set_subclass_path(E->get(), path);
+	for (KeyValue<StringName, Ref<GDScript>> &E : subclasses) {
+		_set_subclass_path(E.value, path);
 	}
 
 	_init_rpc_methods_properties();
@@ -901,8 +901,8 @@ ScriptLanguage *GDScript::get_language() const {
 
 void GDScript::get_constants(Map<StringName, Variant> *p_constants) {
 	if (p_constants) {
-		for (Map<StringName, Variant>::Element *E = constants.front(); E; E = E->next()) {
-			(*p_constants)[E->key()] = E->value();
+		for (const KeyValue<StringName, Variant> &E : constants) {
+			(*p_constants)[E.key] = E.value;
 		}
 	}
 }
@@ -1032,9 +1032,9 @@ const Map<StringName, GDScriptFunction *> &GDScript::debug_get_member_functions(
 }
 
 StringName GDScript::debug_get_member_by_index(int p_idx) const {
-	for (const Map<StringName, MemberInfo>::Element *E = member_indices.front(); E; E = E->next()) {
-		if (E->get().index == p_idx) {
-			return E->key();
+	for (const KeyValue<StringName, MemberInfo> &E : member_indices) {
+		if (E.value.index == p_idx) {
+			return E.key;
 		}
 	}
 
@@ -1079,12 +1079,12 @@ bool GDScript::has_script_signal(const StringName &p_signal) const {
 }
 
 void GDScript::_get_script_signal_list(List<MethodInfo> *r_list, bool p_include_base) const {
-	for (const Map<StringName, Vector<StringName>>::Element *E = _signals.front(); E; E = E->next()) {
+	for (const KeyValue<StringName, Vector<StringName>> &E : _signals) {
 		MethodInfo mi;
-		mi.name = E->key();
-		for (int i = 0; i < E->get().size(); i++) {
+		mi.name = E.key;
+		for (int i = 0; i < E.value.size(); i++) {
 			PropertyInfo arg;
-			arg.name = E->get()[i];
+			arg.name = E.value[i];
 			mi.arguments.push_back(arg);
 		}
 		r_list->push_back(mi);
@@ -1142,11 +1142,11 @@ void GDScript::_save_orphaned_subclasses() {
 	};
 	Vector<ClassRefWithName> weak_subclasses;
 	// collect subclasses ObjectID and name
-	for (Map<StringName, Ref<GDScript>>::Element *E = subclasses.front(); E; E = E->next()) {
-		E->get()->_owner = nullptr; //bye, you are no longer owned cause I died
+	for (KeyValue<StringName, Ref<GDScript>> &E : subclasses) {
+		E.value->_owner = nullptr; //bye, you are no longer owned cause I died
 		ClassRefWithName subclass;
-		subclass.id = E->get()->get_instance_id();
-		subclass.fully_qualified_name = E->get()->fully_qualified_name;
+		subclass.id = E.value->get_instance_id();
+		subclass.fully_qualified_name = E.value->fully_qualified_name;
 		weak_subclasses.push_back(subclass);
 	}
 
@@ -1178,10 +1178,10 @@ void GDScript::_init_rpc_methods_properties() {
 	Map<StringName, Ref<GDScript>>::Element *sub_E = subclasses.front();
 	while (cscript) {
 		// RPC Methods
-		for (Map<StringName, GDScriptFunction *>::Element *E = cscript->member_functions.front(); E; E = E->next()) {
-			Multiplayer::RPCConfig config = E->get()->get_rpc_config();
+		for (KeyValue<StringName, GDScriptFunction *> &E : cscript->member_functions) {
+			Multiplayer::RPCConfig config = E.value->get_rpc_config();
 			if (config.rpc_mode != Multiplayer::RPC_MODE_DISABLED) {
-				config.name = E->get()->get_name();
+				config.name = E.value->get_name();
 				if (rpc_functions.find(config) == -1) {
 					rpc_functions.push_back(config);
 				}
@@ -1215,8 +1215,8 @@ GDScript::~GDScript() {
 		}
 	}
 
-	for (Map<StringName, GDScriptFunction *>::Element *E = member_functions.front(); E; E = E->next()) {
-		memdelete(E->get());
+	for (const KeyValue<StringName, GDScriptFunction *> &E : member_functions) {
+		memdelete(E.value);
 	}
 
 	if (GDScriptCache::singleton) { // Cache may have been already destroyed at engine shutdown.
@@ -1442,11 +1442,11 @@ void GDScriptInstance::get_property_list(List<PropertyInfo> *p_properties) const
 		//instance a fake script for editing the values
 
 		Vector<_GDScriptMemberSort> msort;
-		for (Map<StringName, PropertyInfo>::Element *F = sptr->member_info.front(); F; F = F->next()) {
+		for (const KeyValue<StringName, PropertyInfo> &F : sptr->member_info) {
 			_GDScriptMemberSort ms;
-			ERR_CONTINUE(!sptr->member_indices.has(F->key()));
-			ms.index = sptr->member_indices[F->key()].index;
-			ms.name = F->key();
+			ERR_CONTINUE(!sptr->member_indices.has(F.key));
+			ms.index = sptr->member_indices[F.key].index;
+			ms.name = F.key;
 			msort.push_back(ms);
 		}
 
@@ -1467,11 +1467,11 @@ void GDScriptInstance::get_property_list(List<PropertyInfo> *p_properties) const
 void GDScriptInstance::get_method_list(List<MethodInfo> *p_list) const {
 	const GDScript *sptr = script.ptr();
 	while (sptr) {
-		for (Map<StringName, GDScriptFunction *>::Element *E = sptr->member_functions.front(); E; E = E->next()) {
+		for (const KeyValue<StringName, GDScriptFunction *> &E : sptr->member_functions) {
 			MethodInfo mi;
-			mi.name = E->key();
+			mi.name = E.key;
 			mi.flags |= METHOD_FLAG_FROM_SCRIPT;
-			for (int i = 0; i < E->get()->get_argument_count(); i++) {
+			for (int i = 0; i < E.value->get_argument_count(); i++) {
 				mi.arguments.push_back(PropertyInfo(Variant::NIL, "arg" + itos(i)));
 			}
 			p_list->push_back(mi);
@@ -1569,10 +1569,10 @@ void GDScriptInstance::reload_members() {
 	new_members.resize(script->member_indices.size());
 
 	//pass the values to the new indices
-	for (Map<StringName, GDScript::MemberInfo>::Element *E = script->member_indices.front(); E; E = E->next()) {
-		if (member_indices_cache.has(E->key())) {
-			Variant value = members[member_indices_cache[E->key()]];
-			new_members.write[E->get().index] = value;
+	for (KeyValue<StringName, GDScript::MemberInfo> &E : script->member_indices) {
+		if (member_indices_cache.has(E.key)) {
+			Variant value = members[member_indices_cache[E.key]];
+			new_members.write[E.value.index] = value;
 		}
 	}
 
@@ -1581,8 +1581,8 @@ void GDScriptInstance::reload_members() {
 
 	//pass the values to the new indices
 	member_indices_cache.clear();
-	for (Map<StringName, GDScript::MemberInfo>::Element *E = script->member_indices.front(); E; E = E->next()) {
-		member_indices_cache[E->key()] = E->get().index;
+	for (const KeyValue<StringName, GDScript::MemberInfo> &E : script->member_indices) {
+		member_indices_cache[E.key] = E.value.index;
 	}
 
 #endif
@@ -1890,21 +1890,21 @@ void GDScriptLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_so
 
 #endif
 
-			for (Map<ObjectID, List<Pair<StringName, Variant>>>::Element *F = script->pending_reload_state.front(); F; F = F->next()) {
-				map[F->key()] = F->get(); //pending to reload, use this one instead
+			for (const KeyValue<ObjectID, List<Pair<StringName, Variant>>> &F : script->pending_reload_state) {
+				map[F.key] = F.value; //pending to reload, use this one instead
 			}
 		}
 	}
 
-	for (Map<Ref<GDScript>, Map<ObjectID, List<Pair<StringName, Variant>>>>::Element *E = to_reload.front(); E; E = E->next()) {
-		Ref<GDScript> scr = E->key();
+	for (KeyValue<Ref<GDScript>, Map<ObjectID, List<Pair<StringName, Variant>>>> &E : to_reload) {
+		Ref<GDScript> scr = E.key;
 		scr->reload(p_soft_reload);
 
 		//restore state if saved
-		for (Map<ObjectID, List<Pair<StringName, Variant>>>::Element *F = E->get().front(); F; F = F->next()) {
-			List<Pair<StringName, Variant>> &saved_state = F->get();
+		for (KeyValue<ObjectID, List<Pair<StringName, Variant>>> &F : E.value) {
+			List<Pair<StringName, Variant>> &saved_state = F.value;
 
-			Object *obj = ObjectDB::get_instance(F->key());
+			Object *obj = ObjectDB::get_instance(F.key);
 			if (!obj) {
 				continue;
 			}
@@ -2210,15 +2210,15 @@ GDScriptLanguage::~GDScriptLanguage() {
 		// is not the same as before).
 		script->reference();
 
-		for (Map<StringName, GDScriptFunction *>::Element *E = script->member_functions.front(); E; E = E->next()) {
-			GDScriptFunction *func = E->get();
+		for (KeyValue<StringName, GDScriptFunction *> &E : script->member_functions) {
+			GDScriptFunction *func = E.value;
 			for (int i = 0; i < func->argument_types.size(); i++) {
 				func->argument_types.write[i].script_type_ref = Ref<Script>();
 			}
 			func->return_type.script_type_ref = Ref<Script>();
 		}
-		for (Map<StringName, GDScript::MemberInfo>::Element *E = script->member_indices.front(); E; E = E->next()) {
-			E->get().data_type.script_type_ref = Ref<Script>();
+		for (KeyValue<StringName, GDScript::MemberInfo> &E : script->member_indices) {
+			E.value.data_type.script_type_ref = Ref<Script>();
 		}
 
 		s = s->next();

+ 3 - 3
modules/gdscript/gdscript_analyzer.cpp

@@ -2270,10 +2270,10 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool is_awa
 
 	if (get_function_signature(p_call, base_type, p_call->function_name, return_type, par_types, default_arg_count, is_static, is_vararg)) {
 		// If the function require typed arrays we must make literals be typed.
-		for (Map<int, GDScriptParser::ArrayNode *>::Element *E = arrays.front(); E; E = E->next()) {
-			int index = E->key();
+		for (const KeyValue<int, GDScriptParser::ArrayNode *> &E : arrays) {
+			int index = E.key;
 			if (index < par_types.size() && par_types[index].has_container_element_type()) {
-				update_array_literal_element_type(par_types[index], E->get());
+				update_array_literal_element_type(par_types[index], E.value);
 			}
 		}
 		validate_call_arg(par_types, default_arg_count, is_vararg, p_call);

+ 28 - 28
modules/gdscript/gdscript_byte_codegen.cpp

@@ -209,8 +209,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 	if (name_map.size()) {
 		function->global_names.resize(name_map.size());
 		function->_global_names_ptr = &function->global_names[0];
-		for (Map<StringName, int>::Element *E = name_map.front(); E; E = E->next()) {
-			function->global_names.write[E->get()] = E->key();
+		for (const KeyValue<StringName, int> &E : name_map) {
+			function->global_names.write[E.value] = E.key;
 		}
 		function->_global_names_count = function->global_names.size();
 
@@ -241,8 +241,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->operator_funcs.resize(operator_func_map.size());
 		function->_operator_funcs_count = function->operator_funcs.size();
 		function->_operator_funcs_ptr = function->operator_funcs.ptr();
-		for (const Map<Variant::ValidatedOperatorEvaluator, int>::Element *E = operator_func_map.front(); E; E = E->next()) {
-			function->operator_funcs.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedOperatorEvaluator, int> &E : operator_func_map) {
+			function->operator_funcs.write[E.value] = E.key;
 		}
 	} else {
 		function->_operator_funcs_count = 0;
@@ -253,8 +253,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->setters.resize(setters_map.size());
 		function->_setters_count = function->setters.size();
 		function->_setters_ptr = function->setters.ptr();
-		for (const Map<Variant::ValidatedSetter, int>::Element *E = setters_map.front(); E; E = E->next()) {
-			function->setters.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedSetter, int> &E : setters_map) {
+			function->setters.write[E.value] = E.key;
 		}
 	} else {
 		function->_setters_count = 0;
@@ -265,8 +265,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->getters.resize(getters_map.size());
 		function->_getters_count = function->getters.size();
 		function->_getters_ptr = function->getters.ptr();
-		for (const Map<Variant::ValidatedGetter, int>::Element *E = getters_map.front(); E; E = E->next()) {
-			function->getters.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedGetter, int> &E : getters_map) {
+			function->getters.write[E.value] = E.key;
 		}
 	} else {
 		function->_getters_count = 0;
@@ -277,8 +277,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->keyed_setters.resize(keyed_setters_map.size());
 		function->_keyed_setters_count = function->keyed_setters.size();
 		function->_keyed_setters_ptr = function->keyed_setters.ptr();
-		for (const Map<Variant::ValidatedKeyedSetter, int>::Element *E = keyed_setters_map.front(); E; E = E->next()) {
-			function->keyed_setters.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedKeyedSetter, int> &E : keyed_setters_map) {
+			function->keyed_setters.write[E.value] = E.key;
 		}
 	} else {
 		function->_keyed_setters_count = 0;
@@ -289,8 +289,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->keyed_getters.resize(keyed_getters_map.size());
 		function->_keyed_getters_count = function->keyed_getters.size();
 		function->_keyed_getters_ptr = function->keyed_getters.ptr();
-		for (const Map<Variant::ValidatedKeyedGetter, int>::Element *E = keyed_getters_map.front(); E; E = E->next()) {
-			function->keyed_getters.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedKeyedGetter, int> &E : keyed_getters_map) {
+			function->keyed_getters.write[E.value] = E.key;
 		}
 	} else {
 		function->_keyed_getters_count = 0;
@@ -301,8 +301,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->indexed_setters.resize(indexed_setters_map.size());
 		function->_indexed_setters_count = function->indexed_setters.size();
 		function->_indexed_setters_ptr = function->indexed_setters.ptr();
-		for (const Map<Variant::ValidatedIndexedSetter, int>::Element *E = indexed_setters_map.front(); E; E = E->next()) {
-			function->indexed_setters.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedIndexedSetter, int> &E : indexed_setters_map) {
+			function->indexed_setters.write[E.value] = E.key;
 		}
 	} else {
 		function->_indexed_setters_count = 0;
@@ -313,8 +313,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->indexed_getters.resize(indexed_getters_map.size());
 		function->_indexed_getters_count = function->indexed_getters.size();
 		function->_indexed_getters_ptr = function->indexed_getters.ptr();
-		for (const Map<Variant::ValidatedIndexedGetter, int>::Element *E = indexed_getters_map.front(); E; E = E->next()) {
-			function->indexed_getters.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedIndexedGetter, int> &E : indexed_getters_map) {
+			function->indexed_getters.write[E.value] = E.key;
 		}
 	} else {
 		function->_indexed_getters_count = 0;
@@ -325,8 +325,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->builtin_methods.resize(builtin_method_map.size());
 		function->_builtin_methods_ptr = function->builtin_methods.ptr();
 		function->_builtin_methods_count = builtin_method_map.size();
-		for (const Map<Variant::ValidatedBuiltInMethod, int>::Element *E = builtin_method_map.front(); E; E = E->next()) {
-			function->builtin_methods.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedBuiltInMethod, int> &E : builtin_method_map) {
+			function->builtin_methods.write[E.value] = E.key;
 		}
 	} else {
 		function->_builtin_methods_ptr = nullptr;
@@ -337,8 +337,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->constructors.resize(constructors_map.size());
 		function->_constructors_ptr = function->constructors.ptr();
 		function->_constructors_count = constructors_map.size();
-		for (const Map<Variant::ValidatedConstructor, int>::Element *E = constructors_map.front(); E; E = E->next()) {
-			function->constructors.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedConstructor, int> &E : constructors_map) {
+			function->constructors.write[E.value] = E.key;
 		}
 	} else {
 		function->_constructors_ptr = nullptr;
@@ -349,8 +349,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->utilities.resize(utilities_map.size());
 		function->_utilities_ptr = function->utilities.ptr();
 		function->_utilities_count = utilities_map.size();
-		for (const Map<Variant::ValidatedUtilityFunction, int>::Element *E = utilities_map.front(); E; E = E->next()) {
-			function->utilities.write[E->get()] = E->key();
+		for (const KeyValue<Variant::ValidatedUtilityFunction, int> &E : utilities_map) {
+			function->utilities.write[E.value] = E.key;
 		}
 	} else {
 		function->_utilities_ptr = nullptr;
@@ -361,8 +361,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->gds_utilities.resize(gds_utilities_map.size());
 		function->_gds_utilities_ptr = function->gds_utilities.ptr();
 		function->_gds_utilities_count = gds_utilities_map.size();
-		for (const Map<GDScriptUtilityFunctions::FunctionPtr, int>::Element *E = gds_utilities_map.front(); E; E = E->next()) {
-			function->gds_utilities.write[E->get()] = E->key();
+		for (const KeyValue<GDScriptUtilityFunctions::FunctionPtr, int> &E : gds_utilities_map) {
+			function->gds_utilities.write[E.value] = E.key;
 		}
 	} else {
 		function->_gds_utilities_ptr = nullptr;
@@ -373,8 +373,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->methods.resize(method_bind_map.size());
 		function->_methods_ptr = function->methods.ptrw();
 		function->_methods_count = method_bind_map.size();
-		for (const Map<MethodBind *, int>::Element *E = method_bind_map.front(); E; E = E->next()) {
-			function->methods.write[E->get()] = E->key();
+		for (const KeyValue<MethodBind *, int> &E : method_bind_map) {
+			function->methods.write[E.value] = E.key;
 		}
 	} else {
 		function->_methods_ptr = nullptr;
@@ -385,8 +385,8 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 		function->lambdas.resize(lambdas_map.size());
 		function->_lambdas_ptr = function->lambdas.ptrw();
 		function->_lambdas_count = lambdas_map.size();
-		for (const Map<GDScriptFunction *, int>::Element *E = lambdas_map.front(); E; E = E->next()) {
-			function->lambdas.write[E->get()] = E->key();
+		for (const KeyValue<GDScriptFunction *, int> &E : lambdas_map) {
+			function->lambdas.write[E.value] = E.key;
 		}
 	} else {
 		function->_lambdas_ptr = nullptr;

+ 3 - 3
modules/gdscript/gdscript_byte_codegen.h

@@ -153,12 +153,12 @@ class GDScriptByteCodeGenerator : public GDScriptCodeGenerator {
 #endif
 		locals.resize(current_locals);
 		if (debug_stack) {
-			for (Map<StringName, int>::Element *E = block_identifiers.front(); E; E = E->next()) {
+			for (const KeyValue<StringName, int> &E : block_identifiers) {
 				GDScriptFunction::StackDebug sd;
 				sd.added = false;
-				sd.identifier = E->key();
+				sd.identifier = E.key;
 				sd.line = current_line;
-				sd.pos = E->get();
+				sd.pos = E.value;
 				stack_debug.push_back(sd);
 			}
 			block_identifiers = block_identifier_stack.back()->get();

+ 4 - 4
modules/gdscript/gdscript_compiler.cpp

@@ -2193,8 +2193,8 @@ Error GDScriptCompiler::_parse_class_level(GDScript *p_script, const GDScriptPar
 	p_script->_base = nullptr;
 	p_script->members.clear();
 	p_script->constants.clear();
-	for (Map<StringName, GDScriptFunction *>::Element *E = p_script->member_functions.front(); E; E = E->next()) {
-		memdelete(E->get());
+	for (const KeyValue<StringName, GDScriptFunction *> &E : p_script->member_functions) {
+		memdelete(E.value);
 	}
 	p_script->member_functions.clear();
 	p_script->member_indices.clear();
@@ -2519,8 +2519,8 @@ Error GDScriptCompiler::_parse_class_blocks(GDScript *p_script, const GDScriptPa
 					instance->owner = E->get();
 
 					//needed for hot reloading
-					for (Map<StringName, GDScript::MemberInfo>::Element *F = p_script->member_indices.front(); F; F = F->next()) {
-						instance->member_indices_cache[F->key()] = F->get().index;
+					for (const KeyValue<StringName, GDScript::MemberInfo> &F : p_script->member_indices) {
+						instance->member_indices_cache[F.key] = F.value.index;
 					}
 					instance->owner->set_script_instance(instance);
 

+ 19 - 19
modules/gdscript/gdscript_editor.cpp

@@ -173,8 +173,8 @@ bool GDScriptLanguage::validate(const String &p_script, const String &p_path, Li
 
 		get_function_names_recursively(cl, "", funcs);
 
-		for (Map<int, String>::Element *E = funcs.front(); E; E = E->next()) {
-			r_functions->push_back(E->get() + ":" + itos(E->key()));
+		for (const KeyValue<int, String> &E : funcs) {
+			r_functions->push_back(E.value + ":" + itos(E.key));
 		}
 	}
 
@@ -344,9 +344,9 @@ void GDScriptLanguage::debug_get_stack_level_members(int p_level, List<String> *
 
 	const Map<StringName, GDScript::MemberInfo> &mi = script->debug_get_member_indices();
 
-	for (const Map<StringName, GDScript::MemberInfo>::Element *E = mi.front(); E; E = E->next()) {
-		p_members->push_back(E->key());
-		p_values->push_back(instance->debug_get_member_by_index(E->get().index));
+	for (const KeyValue<StringName, GDScript::MemberInfo> &E : mi) {
+		p_members->push_back(E.key);
+		p_values->push_back(instance->debug_get_member_by_index(E.value.index));
 	}
 }
 
@@ -370,14 +370,14 @@ void GDScriptLanguage::debug_get_globals(List<String> *p_globals, List<Variant>
 	List<Pair<String, Variant>> cinfo;
 	get_public_constants(&cinfo);
 
-	for (const Map<StringName, int>::Element *E = name_idx.front(); E; E = E->next()) {
-		if (ClassDB::class_exists(E->key()) || Engine::get_singleton()->has_singleton(E->key())) {
+	for (const KeyValue<StringName, int> &E : name_idx) {
+		if (ClassDB::class_exists(E.key) || Engine::get_singleton()->has_singleton(E.key)) {
 			continue;
 		}
 
 		bool is_script_constant = false;
 		for (List<Pair<String, Variant>>::Element *CE = cinfo.front(); CE; CE = CE->next()) {
-			if (CE->get().first == E->key()) {
+			if (CE->get().first == E.key) {
 				is_script_constant = true;
 				break;
 			}
@@ -386,7 +386,7 @@ void GDScriptLanguage::debug_get_globals(List<String> *p_globals, List<Variant>
 			continue;
 		}
 
-		const Variant &var = globals[E->value()];
+		const Variant &var = globals[E.value];
 		if (Object *obj = var) {
 			if (Object::cast_to<GDScriptNativeClass>(obj)) {
 				continue;
@@ -395,7 +395,7 @@ void GDScriptLanguage::debug_get_globals(List<String> *p_globals, List<Variant>
 
 		bool skip = false;
 		for (int i = 0; i < CoreConstants::get_global_constant_count(); i++) {
-			if (E->key() == CoreConstants::get_global_constant_name(i)) {
+			if (E.key == CoreConstants::get_global_constant_name(i)) {
 				skip = true;
 				break;
 			}
@@ -404,7 +404,7 @@ void GDScriptLanguage::debug_get_globals(List<String> *p_globals, List<Variant>
 			continue;
 		}
 
-		p_globals->push_back(E->key());
+		p_globals->push_back(E.key);
 		p_values->push_back(var);
 	}
 }
@@ -875,8 +875,8 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
 						}
 						Map<StringName, Variant> constants;
 						scr->get_constants(&constants);
-						for (Map<StringName, Variant>::Element *E = constants.front(); E; E = E->next()) {
-							ScriptCodeCompletionOption option(E->key().operator String(), ScriptCodeCompletionOption::KIND_CONSTANT);
+						for (const KeyValue<StringName, Variant> &E : constants) {
+							ScriptCodeCompletionOption option(E.key.operator String(), ScriptCodeCompletionOption::KIND_CONSTANT);
 							r_result.insert(option.display, option);
 						}
 
@@ -1099,12 +1099,12 @@ static void _find_identifiers(GDScriptParser::CompletionContext &p_context, bool
 	}
 
 	// Native classes and global constants.
-	for (const Map<StringName, int>::Element *E = GDScriptLanguage::get_singleton()->get_global_map().front(); E; E = E->next()) {
+	for (const KeyValue<StringName, int> &E : GDScriptLanguage::get_singleton()->get_global_map()) {
 		ScriptCodeCompletionOption option;
-		if (ClassDB::class_exists(E->key()) || Engine::get_singleton()->has_singleton(E->key())) {
-			option = ScriptCodeCompletionOption(E->key().operator String(), ScriptCodeCompletionOption::KIND_CLASS);
+		if (ClassDB::class_exists(E.key) || Engine::get_singleton()->has_singleton(E.key)) {
+			option = ScriptCodeCompletionOption(E.key.operator String(), ScriptCodeCompletionOption::KIND_CLASS);
 		} else {
-			option = ScriptCodeCompletionOption(E->key().operator String(), ScriptCodeCompletionOption::KIND_CONSTANT);
+			option = ScriptCodeCompletionOption(E.key.operator String(), ScriptCodeCompletionOption::KIND_CONSTANT);
 		}
 		r_result.insert(option.display, option);
 	}
@@ -2680,8 +2680,8 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c
 		} break;
 	}
 
-	for (Map<String, ScriptCodeCompletionOption>::Element *E = options.front(); E; E = E->next()) {
-		r_options->push_back(E->get());
+	for (const KeyValue<String, ScriptCodeCompletionOption> &E : options) {
+		r_options->push_back(E.value);
 	}
 
 	return OK;

+ 4 - 4
modules/gdscript/gdscript_function.cpp

@@ -120,11 +120,11 @@ void GDScriptFunction::debug_get_stack_member_state(int p_line, List<Pair<String
 	}
 
 	List<_GDFKCS> stackpositions;
-	for (Map<StringName, _GDFKC>::Element *E = sdmap.front(); E; E = E->next()) {
+	for (const KeyValue<StringName, _GDFKC> &E : sdmap) {
 		_GDFKCS spp;
-		spp.id = E->key();
-		spp.order = E->get().order;
-		spp.pos = E->get().pos.back()->get();
+		spp.id = E.key;
+		spp.order = E.value.order;
+		spp.pos = E.value.pos.back()->get();
 		stackpositions.push_back(spp);
 	}
 

+ 3 - 3
modules/gdscript/gdscript_parser.cpp

@@ -582,9 +582,9 @@ void GDScriptParser::parse_program() {
 	parse_class_body(true);
 
 #ifdef TOOLS_ENABLED
-	for (Map<int, GDScriptTokenizer::CommentData>::Element *E = tokenizer.get_comments().front(); E; E = E->next()) {
-		if (E->get().new_line && E->get().comment.begins_with("##")) {
-			class_doc_line = MIN(class_doc_line, E->key());
+	for (const KeyValue<int, GDScriptTokenizer::CommentData> &E : tokenizer.get_comments()) {
+		if (E.value.new_line && E.value.comment.begins_with("##")) {
+			class_doc_line = MIN(class_doc_line, E.key);
 		}
 	}
 	if (has_comment(class_doc_line)) {

+ 6 - 6
modules/gdscript/gdscript_utility_functions.cpp

@@ -317,9 +317,9 @@ struct GDScriptUtilityFunctionsDefinitions {
 				d["@subpath"] = cp;
 				d["@path"] = p->get_path();
 
-				for (Map<StringName, GDScript::MemberInfo>::Element *E = base->member_indices.front(); E; E = E->next()) {
-					if (!d.has(E->key())) {
-						d[E->key()] = ins->members[E->get().index];
+				for (const KeyValue<StringName, GDScript::MemberInfo> &E : base->member_indices) {
+					if (!d.has(E.key)) {
+						d[E.key] = ins->members[E.value.index];
 					}
 				}
 				*r_ret = d;
@@ -396,9 +396,9 @@ struct GDScriptUtilityFunctionsDefinitions {
 		GDScriptInstance *ins = static_cast<GDScriptInstance *>(static_cast<Object *>(*r_ret)->get_script_instance());
 		Ref<GDScript> gd_ref = ins->get_script();
 
-		for (Map<StringName, GDScript::MemberInfo>::Element *E = gd_ref->member_indices.front(); E; E = E->next()) {
-			if (d.has(E->key())) {
-				ins->members.write[E->get().index] = d[E->key()];
+		for (KeyValue<StringName, GDScript::MemberInfo> &E : gd_ref->member_indices) {
+			if (d.has(E.key)) {
+				ins->members.write[E.value.index] = d[E.key];
 			}
 		}
 	}

+ 2 - 2
modules/gdscript/gdscript_vm.cpp

@@ -531,8 +531,8 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
 
 	memnew_placement(&stack[ADDR_STACK_CLASS], Variant(script));
 
-	for (const Map<int, Variant::Type>::Element *E = temporary_slots.front(); E; E = E->next()) {
-		type_init_function_table[E->get()](&stack[E->key()]);
+	for (const KeyValue<int, Variant::Type> &E : temporary_slots) {
+		type_init_function_table[E.value](&stack[E.key]);
 	}
 
 	String err_text;

+ 4 - 4
modules/gdscript/language_server/gdscript_language_protocol.cpp

@@ -212,11 +212,11 @@ void GDScriptLanguageProtocol::initialized(const Variant &p_params) {
 	lsp::GodotCapabilities capabilities;
 
 	DocTools *doc = EditorHelp::get_doc_data();
-	for (Map<String, DocData::ClassDoc>::Element *E = doc->class_list.front(); E; E = E->next()) {
+	for (const KeyValue<String, DocData::ClassDoc> &E : doc->class_list) {
 		lsp::GodotNativeClassInfo gdclass;
-		gdclass.name = E->get().name;
-		gdclass.class_doc = &(E->get());
-		if (ClassDB::ClassInfo *ptr = ClassDB::classes.getptr(StringName(E->get().name))) {
+		gdclass.name = E.value.name;
+		gdclass.class_doc = &(E.value);
+		if (ClassDB::ClassInfo *ptr = ClassDB::classes.getptr(StringName(E.value.name))) {
 			gdclass.class_info = ptr;
 		}
 		capabilities.native_classes.push_back(gdclass);

+ 2 - 2
modules/gdscript/language_server/gdscript_text_document.cpp

@@ -217,8 +217,8 @@ Array GDScriptTextDocument::completion(const Dictionary &p_params) {
 	} else if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) {
 		arr = native_member_completions.duplicate();
 
-		for (Map<String, ExtendGDScriptParser *>::Element *E = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.front(); E; E = E->next()) {
-			ExtendGDScriptParser *script = E->get();
+		for (KeyValue<String, ExtendGDScriptParser *> &E : GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts) {
+			ExtendGDScriptParser *script = E.value;
 			const Array &items = script->get_member_completions();
 
 			const int start_size = arr.size();

+ 16 - 16
modules/gdscript/language_server/gdscript_workspace.cpp

@@ -261,9 +261,9 @@ Array GDScriptWorkspace::symbol(const Dictionary &p_params) {
 	String query = p_params["query"];
 	Array arr;
 	if (!query.is_empty()) {
-		for (Map<String, ExtendGDScriptParser *>::Element *E = scripts.front(); E; E = E->next()) {
+		for (const KeyValue<String, ExtendGDScriptParser *> &E : scripts) {
 			Vector<lsp::DocumentedSymbolInformation> script_symbols;
-			E->get()->get_symbols().symbol_tree_as_list(E->key(), script_symbols);
+			E.value->get_symbols().symbol_tree_as_list(E.key, script_symbols);
 			for (int i = 0; i < script_symbols.size(); ++i) {
 				if (query.is_subsequence_ofi(script_symbols[i].name)) {
 					lsp::DocumentedSymbolInformation symbol = script_symbols[i];
@@ -282,10 +282,10 @@ Error GDScriptWorkspace::initialize() {
 	}
 
 	DocTools *doc = EditorHelp::get_doc_data();
-	for (Map<String, DocData::ClassDoc>::Element *E = doc->class_list.front(); E; E = E->next()) {
-		const DocData::ClassDoc &class_data = E->value();
+	for (const KeyValue<String, DocData::ClassDoc> &E : doc->class_list) {
+		const DocData::ClassDoc &class_data = E.value;
 		lsp::DocumentSymbol class_symbol;
-		String class_name = E->key();
+		String class_name = E.key;
 		class_symbol.name = class_name;
 		class_symbol.native_class = class_name;
 		class_symbol.kind = lsp::SymbolKind::Class;
@@ -393,19 +393,19 @@ Error GDScriptWorkspace::initialize() {
 	reload_all_workspace_scripts();
 
 	if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) {
-		for (Map<StringName, lsp::DocumentSymbol>::Element *E = native_symbols.front(); E; E = E->next()) {
+		for (const KeyValue<StringName, lsp::DocumentSymbol> &E : native_symbols) {
 			ClassMembers members;
-			const lsp::DocumentSymbol &class_symbol = E->get();
+			const lsp::DocumentSymbol &class_symbol = E.value;
 			for (int i = 0; i < class_symbol.children.size(); i++) {
 				const lsp::DocumentSymbol &symbol = class_symbol.children[i];
 				members.set(symbol.name, &symbol);
 			}
-			native_members.set(E->key(), members);
+			native_members.set(E.key, members);
 		}
 
 		// cache member completions
-		for (Map<String, ExtendGDScriptParser *>::Element *S = scripts.front(); S; S = S->next()) {
-			S->get()->get_member_completions();
+		for (const KeyValue<String, ExtendGDScriptParser *> &S : scripts) {
+			S.value->get_member_completions();
 		}
 	}
 
@@ -685,8 +685,8 @@ void GDScriptWorkspace::resolve_related_symbols(const lsp::TextDocumentPositionP
 			class_ptr = native_members.next(class_ptr);
 		}
 
-		for (Map<String, ExtendGDScriptParser *>::Element *E = scripts.front(); E; E = E->next()) {
-			const ExtendGDScriptParser *script = E->get();
+		for (const KeyValue<String, ExtendGDScriptParser *> &E : scripts) {
+			const ExtendGDScriptParser *script = E.value;
 			const ClassMembers &members = script->get_members();
 			if (const lsp::DocumentSymbol *const *symbol = members.getptr(symbol_identifier)) {
 				r_list.push_back(*symbol);
@@ -786,12 +786,12 @@ GDScriptWorkspace::GDScriptWorkspace() {
 GDScriptWorkspace::~GDScriptWorkspace() {
 	Set<String> cached_parsers;
 
-	for (Map<String, ExtendGDScriptParser *>::Element *E = parse_results.front(); E; E = E->next()) {
-		cached_parsers.insert(E->key());
+	for (const KeyValue<String, ExtendGDScriptParser *> &E : parse_results) {
+		cached_parsers.insert(E.key);
 	}
 
-	for (Map<String, ExtendGDScriptParser *>::Element *E = scripts.front(); E; E = E->next()) {
-		cached_parsers.insert(E->key());
+	for (const KeyValue<String, ExtendGDScriptParser *> &E : scripts) {
+		cached_parsers.insert(E.key);
 	}
 
 	for (Set<String>::Element *E = cached_parsers.front(); E; E = E->next()) {

+ 5 - 5
modules/gdscript/language_server/lsp.hpp

@@ -277,15 +277,15 @@ struct WorkspaceEdit {
 		Dictionary dict;
 
 		Dictionary out_changes;
-		for (Map<String, Vector<TextEdit>>::Element *E = changes.front(); E; E = E->next()) {
+		for (const KeyValue<String, Vector<TextEdit>> &E : changes) {
 			Array edits;
-			for (int i = 0; i < E->get().size(); ++i) {
+			for (int i = 0; i < E.value.size(); ++i) {
 				Dictionary text_edit;
-				text_edit["range"] = E->get()[i].range.to_json();
-				text_edit["newText"] = E->get()[i].newText;
+				text_edit["range"] = E.value[i].range.to_json();
+				text_edit["newText"] = E.value[i].newText;
 				edits.push_back(text_edit);
 			}
-			out_changes[E->key()] = edits;
+			out_changes[E.key] = edits;
 		}
 		dict["changes"] = out_changes;
 

+ 2 - 2
modules/gdscript/tests/test_gdscript.cpp

@@ -172,8 +172,8 @@ static void test_compiler(const String &p_code, const String &p_script_path, con
 		return;
 	}
 
-	for (const Map<StringName, GDScriptFunction *>::Element *E = script->get_member_functions().front(); E; E = E->next()) {
-		const GDScriptFunction *func = E->value();
+	for (const KeyValue<StringName, GDScriptFunction *> &E : script->get_member_functions()) {
+		const GDScriptFunction *func = E.value;
 
 		String signature = "Disassembling " + func->get_name().operator String() + "(";
 		for (int i = 0; i < func->get_argument_count(); i++) {

+ 32 - 32
modules/gltf/gltf_document.cpp

@@ -4673,8 +4673,8 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) {
 		Array channels;
 		Array samplers;
 
-		for (Map<int, GLTFAnimation::Track>::Element *track_i = gltf_animation->get_tracks().front(); track_i; track_i = track_i->next()) {
-			GLTFAnimation::Track track = track_i->get();
+		for (KeyValue<int, GLTFAnimation::Track> &track_i : gltf_animation->get_tracks()) {
+			GLTFAnimation::Track track = track_i.value;
 			if (track.position_track.times.size()) {
 				Dictionary t;
 				t["sampler"] = samplers.size();
@@ -4690,7 +4690,7 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) {
 
 				Dictionary target;
 				target["path"] = "translation";
-				target["node"] = track_i->key();
+				target["node"] = track_i.key;
 
 				t["target"] = target;
 				channels.push_back(t);
@@ -4710,7 +4710,7 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) {
 
 				Dictionary target;
 				target["path"] = "rotation";
-				target["node"] = track_i->key();
+				target["node"] = track_i.key;
 
 				t["target"] = target;
 				channels.push_back(t);
@@ -4730,7 +4730,7 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) {
 
 				Dictionary target;
 				target["path"] = "scale";
-				target["node"] = track_i->key();
+				target["node"] = track_i.key;
 
 				t["target"] = target;
 				channels.push_back(t);
@@ -4809,7 +4809,7 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) {
 
 				Dictionary target;
 				target["path"] = "weights";
-				target["node"] = track_i->key();
+				target["node"] = track_i.key;
 
 				t["target"] = target;
 				channels.push_back(t);
@@ -5800,16 +5800,16 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap,
 
 	float length = 0.0;
 
-	for (Map<int, GLTFAnimation::Track>::Element *track_i = anim->get_tracks().front(); track_i; track_i = track_i->next()) {
-		const GLTFAnimation::Track &track = track_i->get();
+	for (const KeyValue<int, GLTFAnimation::Track> &track_i : anim->get_tracks()) {
+		const GLTFAnimation::Track &track = track_i.value;
 		//need to find the path: for skeletons, weight tracks will affect the mesh
 		NodePath node_path;
 		//for skeletons, transform tracks always affect bones
 		NodePath transform_node_path;
 
-		GLTFNodeIndex node_index = track_i->key();
+		GLTFNodeIndex node_index = track_i.key;
 
-		const Ref<GLTFNode> gltf_node = state->nodes[track_i->key()];
+		const Ref<GLTFNode> gltf_node = state->nodes[track_i.key];
 
 		Node *root = ap->get_parent();
 		ERR_FAIL_COND(root == nullptr);
@@ -5861,15 +5861,15 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap,
 			Vector3 base_scale = Vector3(1, 1, 1);
 
 			if (!track.rotation_track.values.size()) {
-				base_rot = state->nodes[track_i->key()]->rotation.normalized();
+				base_rot = state->nodes[track_i.key]->rotation.normalized();
 			}
 
 			if (!track.position_track.values.size()) {
-				base_pos = state->nodes[track_i->key()]->position;
+				base_pos = state->nodes[track_i.key]->position;
 			}
 
 			if (!track.scale_track.values.size()) {
-				base_scale = state->nodes[track_i->key()]->scale;
+				base_scale = state->nodes[track_i.key]->scale;
 			}
 
 			bool last = false;
@@ -6322,9 +6322,9 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap,
 			const Vector<String> node_suffix = String(orig_track_path).split(":position");
 			const NodePath path = node_suffix[0];
 			const Node *node = ap->get_parent()->get_node_or_null(path);
-			for (Map<GLTFNodeIndex, Node *>::Element *position_scene_node_i = state->scene_nodes.front(); position_scene_node_i; position_scene_node_i = position_scene_node_i->next()) {
-				if (position_scene_node_i->get() == node) {
-					GLTFNodeIndex node_index = position_scene_node_i->key();
+			for (const KeyValue<GLTFNodeIndex, Node *> &position_scene_node_i : state->scene_nodes) {
+				if (position_scene_node_i.value == node) {
+					GLTFNodeIndex node_index = position_scene_node_i.key;
 					Map<int, GLTFAnimation::Track>::Element *position_track_i = gltf_animation->get_tracks().find(node_index);
 					GLTFAnimation::Track track;
 					if (position_track_i) {
@@ -6338,9 +6338,9 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap,
 			const Vector<String> node_suffix = String(orig_track_path).split(":rotation_degrees");
 			const NodePath path = node_suffix[0];
 			const Node *node = ap->get_parent()->get_node_or_null(path);
-			for (Map<GLTFNodeIndex, Node *>::Element *rotation_degree_scene_node_i = state->scene_nodes.front(); rotation_degree_scene_node_i; rotation_degree_scene_node_i = rotation_degree_scene_node_i->next()) {
-				if (rotation_degree_scene_node_i->get() == node) {
-					GLTFNodeIndex node_index = rotation_degree_scene_node_i->key();
+			for (const KeyValue<GLTFNodeIndex, Node *> &rotation_degree_scene_node_i : state->scene_nodes) {
+				if (rotation_degree_scene_node_i.value == node) {
+					GLTFNodeIndex node_index = rotation_degree_scene_node_i.key;
 					Map<int, GLTFAnimation::Track>::Element *rotation_degree_track_i = gltf_animation->get_tracks().find(node_index);
 					GLTFAnimation::Track track;
 					if (rotation_degree_track_i) {
@@ -6354,9 +6354,9 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap,
 			const Vector<String> node_suffix = String(orig_track_path).split(":scale");
 			const NodePath path = node_suffix[0];
 			const Node *node = ap->get_parent()->get_node_or_null(path);
-			for (Map<GLTFNodeIndex, Node *>::Element *scale_scene_node_i = state->scene_nodes.front(); scale_scene_node_i; scale_scene_node_i = scale_scene_node_i->next()) {
-				if (scale_scene_node_i->get() == node) {
-					GLTFNodeIndex node_index = scale_scene_node_i->key();
+			for (const KeyValue<GLTFNodeIndex, Node *> &scale_scene_node_i : state->scene_nodes) {
+				if (scale_scene_node_i.value == node) {
+					GLTFNodeIndex node_index = scale_scene_node_i.key;
 					Map<int, GLTFAnimation::Track>::Element *scale_track_i = gltf_animation->get_tracks().find(node_index);
 					GLTFAnimation::Track track;
 					if (scale_track_i) {
@@ -6370,11 +6370,11 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap,
 			const Vector<String> node_suffix = String(orig_track_path).split(":transform");
 			const NodePath path = node_suffix[0];
 			const Node *node = ap->get_parent()->get_node_or_null(path);
-			for (Map<GLTFNodeIndex, Node *>::Element *transform_track_i = state->scene_nodes.front(); transform_track_i; transform_track_i = transform_track_i->next()) {
-				if (transform_track_i->get() == node) {
+			for (const KeyValue<GLTFNodeIndex, Node *> &transform_track_i : state->scene_nodes) {
+				if (transform_track_i.value == node) {
 					GLTFAnimation::Track track;
-					track = _convert_animation_track(state, track, animation, Transform3D(), track_i, transform_track_i->key());
-					gltf_animation->get_tracks().insert(transform_track_i->key(), track);
+					track = _convert_animation_track(state, track, animation, Transform3D(), track_i, transform_track_i.key);
+					gltf_animation->get_tracks().insert(transform_track_i.key, track);
 				}
 			}
 		} else if (String(orig_track_path).find(":blend_shapes/") != -1) {
@@ -6386,9 +6386,9 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap,
 			Ref<Mesh> mesh = mi->get_mesh();
 			ERR_CONTINUE(mesh.is_null());
 			int32_t mesh_index = -1;
-			for (Map<GLTFNodeIndex, Node *>::Element *mesh_track_i = state->scene_nodes.front(); mesh_track_i; mesh_track_i = mesh_track_i->next()) {
-				if (mesh_track_i->get() == node) {
-					mesh_index = mesh_track_i->key();
+			for (const KeyValue<GLTFNodeIndex, Node *> &mesh_track_i : state->scene_nodes) {
+				if (mesh_track_i.value == node) {
+					mesh_index = mesh_track_i.key;
 				}
 			}
 			ERR_CONTINUE(mesh_index == -1);
@@ -6469,9 +6469,9 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap,
 			for (int32_t node_i = 0; node_i < ap->get_parent()->get_child_count(); node_i++) {
 				const Node *child = ap->get_parent()->get_child(node_i);
 				const Node *node = child->get_node_or_null(orig_track_path);
-				for (Map<GLTFNodeIndex, Node *>::Element *scene_node_i = state->scene_nodes.front(); scene_node_i; scene_node_i = scene_node_i->next()) {
-					if (scene_node_i->get() == node) {
-						GLTFNodeIndex node_index = scene_node_i->key();
+				for (const KeyValue<GLTFNodeIndex, Node *> &scene_node_i : state->scene_nodes) {
+					if (scene_node_i.value == node) {
+						GLTFNodeIndex node_index = scene_node_i.key;
 						Map<int, GLTFAnimation::Track>::Element *node_track_i = gltf_animation->get_tracks().find(node_index);
 						GLTFAnimation::Track track;
 						if (node_track_i) {

+ 52 - 52
modules/gridmap/grid_map.cpp

@@ -420,8 +420,8 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
 	}
 
 	//erase navigation
-	for (Map<IndexKey, Octant::NavMesh>::Element *E = g.navmesh_ids.front(); E; E = E->next()) {
-		NavigationServer3D::get_singleton()->free(E->get().region);
+	for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) {
+		NavigationServer3D::get_singleton()->free(E.value.region);
 	}
 	g.navmesh_ids.clear();
 
@@ -512,15 +512,15 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
 
 	//update multimeshes, only if not baked
 	if (baked_meshes.size() == 0) {
-		for (Map<int, List<Pair<Transform3D, IndexKey>>>::Element *E = multimesh_items.front(); E; E = E->next()) {
+		for (const KeyValue<int, List<Pair<Transform3D, IndexKey>>> &E : multimesh_items) {
 			Octant::MultimeshInstance mmi;
 
 			RID mm = RS::get_singleton()->multimesh_create();
-			RS::get_singleton()->multimesh_allocate_data(mm, E->get().size(), RS::MULTIMESH_TRANSFORM_3D);
-			RS::get_singleton()->multimesh_set_mesh(mm, mesh_library->get_item_mesh(E->key())->get_rid());
+			RS::get_singleton()->multimesh_allocate_data(mm, E.value.size(), RS::MULTIMESH_TRANSFORM_3D);
+			RS::get_singleton()->multimesh_set_mesh(mm, mesh_library->get_item_mesh(E.key)->get_rid());
 
 			int idx = 0;
-			for (const Pair<Transform3D, IndexKey> &F : E->get()) {
+			for (const Pair<Transform3D, IndexKey> &F : E.value) {
 				RS::get_singleton()->multimesh_instance_set_transform(mm, idx, F.first);
 #ifdef TOOLS_ENABLED
 
@@ -567,9 +567,9 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
 }
 
 void GridMap::_reset_physic_bodies_collision_filters() {
-	for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) {
-		PhysicsServer3D::get_singleton()->body_set_collision_layer(E->get()->static_body, collision_layer);
-		PhysicsServer3D::get_singleton()->body_set_collision_mask(E->get()->static_body, collision_mask);
+	for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
+		PhysicsServer3D::get_singleton()->body_set_collision_layer(E.value->static_body, collision_layer);
+		PhysicsServer3D::get_singleton()->body_set_collision_mask(E.value->static_body, collision_mask);
 	}
 }
 
@@ -590,17 +590,17 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) {
 	}
 
 	if (bake_navigation && mesh_library.is_valid()) {
-		for (Map<IndexKey, Octant::NavMesh>::Element *F = g.navmesh_ids.front(); F; F = F->next()) {
-			if (cell_map.has(F->key()) && F->get().region.is_valid() == false) {
-				Ref<NavigationMesh> nm = mesh_library->get_item_navmesh(cell_map[F->key()].item);
+		for (KeyValue<IndexKey, Octant::NavMesh> &F : g.navmesh_ids) {
+			if (cell_map.has(F.key) && F.value.region.is_valid() == false) {
+				Ref<NavigationMesh> nm = mesh_library->get_item_navmesh(cell_map[F.key].item);
 				if (nm.is_valid()) {
 					RID region = NavigationServer3D::get_singleton()->region_create();
 					NavigationServer3D::get_singleton()->region_set_layers(region, navigation_layers);
 					NavigationServer3D::get_singleton()->region_set_navmesh(region, nm);
-					NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * F->get().xform);
+					NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * F.value.xform);
 					NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map());
 
-					F->get().region = region;
+					F.value.region = region;
 				}
 			}
 		}
@@ -621,10 +621,10 @@ void GridMap::_octant_exit_world(const OctantKey &p_key) {
 		RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, RID());
 	}
 
-	for (Map<IndexKey, Octant::NavMesh>::Element *F = g.navmesh_ids.front(); F; F = F->next()) {
-		if (F->get().region.is_valid()) {
-			NavigationServer3D::get_singleton()->free(F->get().region);
-			F->get().region = RID();
+	for (KeyValue<IndexKey, Octant::NavMesh> &F : g.navmesh_ids) {
+		if (F.value.region.is_valid()) {
+			NavigationServer3D::get_singleton()->free(F.value.region);
+			F.value.region = RID();
 		}
 	}
 }
@@ -643,8 +643,8 @@ void GridMap::_octant_clean_up(const OctantKey &p_key) {
 	PhysicsServer3D::get_singleton()->free(g.static_body);
 
 	// Erase navigation
-	for (Map<IndexKey, Octant::NavMesh>::Element *E = g.navmesh_ids.front(); E; E = E->next()) {
-		NavigationServer3D::get_singleton()->free(E->get().region);
+	for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) {
+		NavigationServer3D::get_singleton()->free(E.value.region);
 	}
 	g.navmesh_ids.clear();
 
@@ -662,8 +662,8 @@ void GridMap::_notification(int p_what) {
 		case NOTIFICATION_ENTER_WORLD: {
 			last_transform = get_global_transform();
 
-			for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) {
-				_octant_enter_world(E->key());
+			for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
+				_octant_enter_world(E.key);
 			}
 
 			for (int i = 0; i < baked_meshes.size(); i++) {
@@ -678,8 +678,8 @@ void GridMap::_notification(int p_what) {
 				break;
 			}
 			//update run
-			for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) {
-				_octant_transform(E->key());
+			for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
+				_octant_transform(E.key);
 			}
 
 			last_transform = new_xform;
@@ -689,8 +689,8 @@ void GridMap::_notification(int p_what) {
 			}
 		} break;
 		case NOTIFICATION_EXIT_WORLD: {
-			for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) {
-				_octant_exit_world(E->key());
+			for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
+				_octant_exit_world(E.key);
 			}
 
 			//_queue_octants_dirty(MAP_DIRTY_INSTANCES|MAP_DIRTY_TRANSFORMS);
@@ -712,8 +712,8 @@ void GridMap::_update_visibility() {
 		return;
 	}
 
-	for (Map<OctantKey, Octant *>::Element *e = octant_map.front(); e; e = e->next()) {
-		Octant *octant = e->value();
+	for (KeyValue<OctantKey, Octant *> &e : octant_map) {
+		Octant *octant = e.value;
 		for (int i = 0; i < octant->multimesh_instances.size(); i++) {
 			const Octant::MultimeshInstance &mi = octant->multimesh_instances[i];
 			RS::get_singleton()->instance_set_visible(mi.instance, is_visible_in_tree());
@@ -738,20 +738,20 @@ void GridMap::_recreate_octant_data() {
 	recreating_octants = true;
 	Map<IndexKey, Cell> cell_copy = cell_map;
 	_clear_internal();
-	for (Map<IndexKey, Cell>::Element *E = cell_copy.front(); E; E = E->next()) {
-		set_cell_item(Vector3i(E->key()), E->get().item, E->get().rot);
+	for (const KeyValue<IndexKey, Cell> &E : cell_copy) {
+		set_cell_item(Vector3i(E.key), E.value.item, E.value.rot);
 	}
 	recreating_octants = false;
 }
 
 void GridMap::_clear_internal() {
-	for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) {
+	for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
 		if (is_inside_world()) {
-			_octant_exit_world(E->key());
+			_octant_exit_world(E.key);
 		}
 
-		_octant_clean_up(E->key());
-		memdelete(E->get());
+		_octant_clean_up(E.key);
+		memdelete(E.value);
 	}
 
 	octant_map.clear();
@@ -773,9 +773,9 @@ void GridMap::_update_octants_callback() {
 	}
 
 	List<OctantKey> to_delete;
-	for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) {
-		if (_octant_update(E->key())) {
-			to_delete.push_back(E->key());
+	for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
+		if (_octant_update(E.key)) {
+			to_delete.push_back(E.key);
 		}
 	}
 
@@ -883,8 +883,8 @@ void GridMap::set_clip(bool p_enabled, bool p_clip_above, int p_floor, Vector3::
 	clip_above = p_clip_above;
 
 	//make it all update
-	for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) {
-		Octant *g = E->get();
+	for (KeyValue<OctantKey, Octant *> &E : octant_map) {
+		Octant *g = E.value;
 		g->dirty = true;
 	}
 	awaiting_update = true;
@@ -904,8 +904,8 @@ Array GridMap::get_used_cells() const {
 	Array a;
 	a.resize(cell_map.size());
 	int i = 0;
-	for (Map<IndexKey, Cell>::Element *E = cell_map.front(); E; E = E->next()) {
-		Vector3 p(E->key().x, E->key().y, E->key().z);
+	for (const KeyValue<IndexKey, Cell> &E : cell_map) {
+		Vector3 p(E.key.x, E.key.y, E.key.z);
 		a[i++] = p;
 	}
 
@@ -920,8 +920,8 @@ Array GridMap::get_meshes() {
 	Vector3 ofs = _get_offset();
 	Array meshes;
 
-	for (Map<IndexKey, Cell>::Element *E = cell_map.front(); E; E = E->next()) {
-		int id = E->get().item;
+	for (KeyValue<IndexKey, Cell> &E : cell_map) {
+		int id = E.value.item;
 		if (!mesh_library->has_item(id)) {
 			continue;
 		}
@@ -930,13 +930,13 @@ Array GridMap::get_meshes() {
 			continue;
 		}
 
-		IndexKey ik = E->key();
+		IndexKey ik = E.key;
 
 		Vector3 cellpos = Vector3(ik.x, ik.y, ik.z);
 
 		Transform3D xform;
 
-		xform.basis.set_orthogonal_index(E->get().rot);
+		xform.basis.set_orthogonal_index(E.value.rot);
 
 		xform.set_origin(cellpos * cell_size + ofs);
 		xform.basis.scale(Vector3(cell_scale, cell_scale, cell_scale));
@@ -972,10 +972,10 @@ void GridMap::make_baked_meshes(bool p_gen_lightmap_uv, float p_lightmap_uv_texe
 	//generate
 	Map<OctantKey, Map<Ref<Material>, Ref<SurfaceTool>>> surface_map;
 
-	for (Map<IndexKey, Cell>::Element *E = cell_map.front(); E; E = E->next()) {
-		IndexKey key = E->key();
+	for (KeyValue<IndexKey, Cell> &E : cell_map) {
+		IndexKey key = E.key;
 
-		int item = E->get().item;
+		int item = E.value.item;
 		if (!mesh_library->has_item(item)) {
 			continue;
 		}
@@ -990,7 +990,7 @@ void GridMap::make_baked_meshes(bool p_gen_lightmap_uv, float p_lightmap_uv_texe
 
 		Transform3D xform;
 
-		xform.basis.set_orthogonal_index(E->get().rot);
+		xform.basis.set_orthogonal_index(E.value.rot);
 		xform.set_origin(cellpos * cell_size + ofs);
 		xform.basis.scale(Vector3(cell_scale, cell_scale, cell_scale));
 
@@ -1023,11 +1023,11 @@ void GridMap::make_baked_meshes(bool p_gen_lightmap_uv, float p_lightmap_uv_texe
 		}
 	}
 
-	for (Map<OctantKey, Map<Ref<Material>, Ref<SurfaceTool>>>::Element *E = surface_map.front(); E; E = E->next()) {
+	for (KeyValue<OctantKey, Map<Ref<Material>, Ref<SurfaceTool>>> &E : surface_map) {
 		Ref<ArrayMesh> mesh;
 		mesh.instantiate();
-		for (Map<Ref<Material>, Ref<SurfaceTool>>::Element *F = E->get().front(); F; F = F->next()) {
-			F->get()->commit(mesh);
+		for (KeyValue<Ref<Material>, Ref<SurfaceTool>> &F : E.value) {
+			F.value->commit(mesh);
 		}
 
 		BakedMesh bm;

+ 6 - 6
modules/navigation/nav_map.cpp

@@ -613,17 +613,17 @@ void NavMap::sync() {
 		}
 
 		Vector<gd::Edge::Connection> free_edges;
-		for (Map<gd::EdgeKey, Vector<gd::Edge::Connection>>::Element *E = connections.front(); E; E = E->next()) {
-			if (E->get().size() == 2) {
+		for (KeyValue<gd::EdgeKey, Vector<gd::Edge::Connection>> &E : connections) {
+			if (E.value.size() == 2) {
 				// Connect edge that are shared in different polygons.
-				gd::Edge::Connection &c1 = E->get().write[0];
-				gd::Edge::Connection &c2 = E->get().write[1];
+				gd::Edge::Connection &c1 = E.value.write[0];
+				gd::Edge::Connection &c2 = E.value.write[1];
 				c1.polygon->edges[c1.edge].connections.push_back(c2);
 				c2.polygon->edges[c2.edge].connections.push_back(c1);
 				// Note: The pathway_start/end are full for those connection and do not need to be modified.
 			} else {
-				CRASH_COND_MSG(E->get().size() != 1, vformat("Number of connection != 1. Found: %d", E->get().size()));
-				free_edges.push_back(E->get()[0]);
+				CRASH_COND_MSG(E.value.size() != 1, vformat("Number of connection != 1. Found: %d", E.value.size()));
+				free_edges.push_back(E.value[0]);
 			}
 		}
 

+ 83 - 83
modules/text_server_adv/text_server_adv.cpp

@@ -1585,8 +1585,8 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_cache_for_size(FontDataAdvanced
 }
 
 _FORCE_INLINE_ void TextServerAdvanced::_font_clear_cache(FontDataAdvanced *p_font_data) {
-	for (const Map<Vector2i, FontDataForSizeAdvanced *>::Element *E = p_font_data->cache.front(); E; E = E->next()) {
-		memdelete(E->get());
+	for (const KeyValue<Vector2i, FontDataForSizeAdvanced *> &E : p_font_data->cache) {
+		memdelete(E.value);
 	}
 	p_font_data->cache.clear();
 	p_font_data->face_init = false;
@@ -1822,8 +1822,8 @@ void TextServerAdvanced::font_clear_size_cache(RID p_font_rid) {
 	ERR_FAIL_COND(!fd);
 
 	MutexLock lock(fd->mutex);
-	for (const Map<Vector2i, FontDataForSizeAdvanced *>::Element *E = fd->cache.front(); E; E = E->next()) {
-		memdelete(E->get());
+	for (const KeyValue<Vector2i, FontDataForSizeAdvanced *> &E : fd->cache) {
+		memdelete(E.value);
 	}
 	fd->cache.clear();
 }
@@ -2678,8 +2678,8 @@ Vector<String> TextServerAdvanced::font_get_language_support_overrides(RID p_fon
 
 	MutexLock lock(fd->mutex);
 	Vector<String> out;
-	for (const Map<String, bool>::Element *E = fd->language_support_overrides.front(); E; E = E->next()) {
-		out.push_back(E->key());
+	for (const KeyValue<String, bool> &E : fd->language_support_overrides) {
+		out.push_back(E.key);
 	}
 	return out;
 }
@@ -2839,9 +2839,9 @@ void TextServerAdvanced::invalidate(TextServerAdvanced::ShapedTextDataAdvanced *
 void TextServerAdvanced::full_copy(ShapedTextDataAdvanced *p_shaped) {
 	ShapedTextDataAdvanced *parent = shaped_owner.get_or_null(p_shaped->parent);
 
-	for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = parent->objects.front(); E; E = E->next()) {
-		if (E->get().pos >= p_shaped->start && E->get().pos < p_shaped->end) {
-			p_shaped->objects[E->key()] = E->get();
+	for (const KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : parent->objects) {
+		if (E.value.pos >= p_shaped->start && E.value.pos < p_shaped->end) {
+			p_shaped->objects[E.key] = E.value;
 		}
 	}
 
@@ -3065,9 +3065,9 @@ bool TextServerAdvanced::shaped_text_resize_object(RID p_shaped, Variant p_key,
 			Glyph gl = sd->glyphs[i];
 			Variant key;
 			if (gl.count == 1) {
-				for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
-					if (E->get().pos == gl.start) {
-						key = E->key();
+				for (const KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
+					if (E.value.pos == gl.start) {
+						key = E.key;
 						break;
 					}
 				}
@@ -3110,64 +3110,64 @@ bool TextServerAdvanced::shaped_text_resize_object(RID p_shaped, Variant p_key,
 		// Align embedded objects to baseline.
 		real_t full_ascent = sd->ascent;
 		real_t full_descent = sd->descent;
-		for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
-			if ((E->get().pos >= sd->start) && (E->get().pos < sd->end)) {
+		for (KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
+			if ((E.value.pos >= sd->start) && (E.value.pos < sd->end)) {
 				if (sd->orientation == ORIENTATION_HORIZONTAL) {
-					switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 						case INLINE_ALIGN_TO_TOP: {
-							E->get().rect.position.y = -sd->ascent;
+							E.value.rect.position.y = -sd->ascent;
 						} break;
 						case INLINE_ALIGN_TO_CENTER: {
-							E->get().rect.position.y = (-sd->ascent + sd->descent) / 2;
+							E.value.rect.position.y = (-sd->ascent + sd->descent) / 2;
 						} break;
 						case INLINE_ALIGN_TO_BASELINE: {
-							E->get().rect.position.y = 0;
+							E.value.rect.position.y = 0;
 						} break;
 						case INLINE_ALIGN_TO_BOTTOM: {
-							E->get().rect.position.y = sd->descent;
+							E.value.rect.position.y = sd->descent;
 						} break;
 					}
-					switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 						case INLINE_ALIGN_BOTTOM_TO: {
-							E->get().rect.position.y -= E->get().rect.size.y;
+							E.value.rect.position.y -= E.value.rect.size.y;
 						} break;
 						case INLINE_ALIGN_CENTER_TO: {
-							E->get().rect.position.y -= E->get().rect.size.y / 2;
+							E.value.rect.position.y -= E.value.rect.size.y / 2;
 						} break;
 						case INLINE_ALIGN_TOP_TO: {
 							//NOP
 						} break;
 					}
-					full_ascent = MAX(full_ascent, -E->get().rect.position.y);
-					full_descent = MAX(full_descent, E->get().rect.position.y + E->get().rect.size.y);
+					full_ascent = MAX(full_ascent, -E.value.rect.position.y);
+					full_descent = MAX(full_descent, E.value.rect.position.y + E.value.rect.size.y);
 				} else {
-					switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 						case INLINE_ALIGN_TO_TOP: {
-							E->get().rect.position.x = -sd->ascent;
+							E.value.rect.position.x = -sd->ascent;
 						} break;
 						case INLINE_ALIGN_TO_CENTER: {
-							E->get().rect.position.x = (-sd->ascent + sd->descent) / 2;
+							E.value.rect.position.x = (-sd->ascent + sd->descent) / 2;
 						} break;
 						case INLINE_ALIGN_TO_BASELINE: {
-							E->get().rect.position.x = 0;
+							E.value.rect.position.x = 0;
 						} break;
 						case INLINE_ALIGN_TO_BOTTOM: {
-							E->get().rect.position.x = sd->descent;
+							E.value.rect.position.x = sd->descent;
 						} break;
 					}
-					switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 						case INLINE_ALIGN_BOTTOM_TO: {
-							E->get().rect.position.x -= E->get().rect.size.x;
+							E.value.rect.position.x -= E.value.rect.size.x;
 						} break;
 						case INLINE_ALIGN_CENTER_TO: {
-							E->get().rect.position.x -= E->get().rect.size.x / 2;
+							E.value.rect.position.x -= E.value.rect.size.x / 2;
 						} break;
 						case INLINE_ALIGN_TOP_TO: {
 							//NOP
 						} break;
 					}
-					full_ascent = MAX(full_ascent, -E->get().rect.position.x);
-					full_descent = MAX(full_descent, E->get().rect.position.x + E->get().rect.size.x);
+					full_ascent = MAX(full_ascent, -E.value.rect.position.x);
+					full_descent = MAX(full_descent, E.value.rect.position.x + E.value.rect.size.x);
 				}
 			}
 		}
@@ -3254,11 +3254,11 @@ RID TextServerAdvanced::shaped_text_substr(RID p_shaped, int p_start, int p_leng
 						Variant key;
 						bool find_embedded = false;
 						if (gl.count == 1) {
-							for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
-								if (E->get().pos == gl.start) {
+							for (const KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
+								if (E.value.pos == gl.start) {
 									find_embedded = true;
-									key = E->key();
-									new_sd->objects[key] = E->get();
+									key = E.key;
+									new_sd->objects[key] = E.value;
 									break;
 								}
 							}
@@ -3301,64 +3301,64 @@ RID TextServerAdvanced::shaped_text_substr(RID p_shaped, int p_start, int p_leng
 		// Align embedded objects to baseline.
 		real_t full_ascent = new_sd->ascent;
 		real_t full_descent = new_sd->descent;
-		for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = new_sd->objects.front(); E; E = E->next()) {
-			if ((E->get().pos >= new_sd->start) && (E->get().pos < new_sd->end)) {
+		for (KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : new_sd->objects) {
+			if ((E.value.pos >= new_sd->start) && (E.value.pos < new_sd->end)) {
 				if (sd->orientation == ORIENTATION_HORIZONTAL) {
-					switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 						case INLINE_ALIGN_TO_TOP: {
-							E->get().rect.position.y = -new_sd->ascent;
+							E.value.rect.position.y = -new_sd->ascent;
 						} break;
 						case INLINE_ALIGN_TO_CENTER: {
-							E->get().rect.position.y = (-new_sd->ascent + new_sd->descent) / 2;
+							E.value.rect.position.y = (-new_sd->ascent + new_sd->descent) / 2;
 						} break;
 						case INLINE_ALIGN_TO_BASELINE: {
-							E->get().rect.position.y = 0;
+							E.value.rect.position.y = 0;
 						} break;
 						case INLINE_ALIGN_TO_BOTTOM: {
-							E->get().rect.position.y = new_sd->descent;
+							E.value.rect.position.y = new_sd->descent;
 						} break;
 					}
-					switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 						case INLINE_ALIGN_BOTTOM_TO: {
-							E->get().rect.position.y -= E->get().rect.size.y;
+							E.value.rect.position.y -= E.value.rect.size.y;
 						} break;
 						case INLINE_ALIGN_CENTER_TO: {
-							E->get().rect.position.y -= E->get().rect.size.y / 2;
+							E.value.rect.position.y -= E.value.rect.size.y / 2;
 						} break;
 						case INLINE_ALIGN_TOP_TO: {
 							//NOP
 						} break;
 					}
-					full_ascent = MAX(full_ascent, -E->get().rect.position.y);
-					full_descent = MAX(full_descent, E->get().rect.position.y + E->get().rect.size.y);
+					full_ascent = MAX(full_ascent, -E.value.rect.position.y);
+					full_descent = MAX(full_descent, E.value.rect.position.y + E.value.rect.size.y);
 				} else {
-					switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 						case INLINE_ALIGN_TO_TOP: {
-							E->get().rect.position.x = -new_sd->ascent;
+							E.value.rect.position.x = -new_sd->ascent;
 						} break;
 						case INLINE_ALIGN_TO_CENTER: {
-							E->get().rect.position.x = (-new_sd->ascent + new_sd->descent) / 2;
+							E.value.rect.position.x = (-new_sd->ascent + new_sd->descent) / 2;
 						} break;
 						case INLINE_ALIGN_TO_BASELINE: {
-							E->get().rect.position.x = 0;
+							E.value.rect.position.x = 0;
 						} break;
 						case INLINE_ALIGN_TO_BOTTOM: {
-							E->get().rect.position.x = new_sd->descent;
+							E.value.rect.position.x = new_sd->descent;
 						} break;
 					}
-					switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 						case INLINE_ALIGN_BOTTOM_TO: {
-							E->get().rect.position.x -= E->get().rect.size.x;
+							E.value.rect.position.x -= E.value.rect.size.x;
 						} break;
 						case INLINE_ALIGN_CENTER_TO: {
-							E->get().rect.position.x -= E->get().rect.size.x / 2;
+							E.value.rect.position.x -= E.value.rect.size.x / 2;
 						} break;
 						case INLINE_ALIGN_TOP_TO: {
 							//NOP
 						} break;
 					}
-					full_ascent = MAX(full_ascent, -E->get().rect.position.x);
-					full_descent = MAX(full_descent, E->get().rect.position.x + E->get().rect.size.x);
+					full_ascent = MAX(full_ascent, -E.value.rect.position.x);
+					full_descent = MAX(full_descent, E.value.rect.position.x + E.value.rect.size.x);
 				}
 			}
 		}
@@ -4413,63 +4413,63 @@ bool TextServerAdvanced::shaped_text_shape(RID p_shaped) {
 	// Align embedded objects to baseline.
 	real_t full_ascent = sd->ascent;
 	real_t full_descent = sd->descent;
-	for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
+	for (KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
 		if (sd->orientation == ORIENTATION_HORIZONTAL) {
-			switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+			switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 				case INLINE_ALIGN_TO_TOP: {
-					E->get().rect.position.y = -sd->ascent;
+					E.value.rect.position.y = -sd->ascent;
 				} break;
 				case INLINE_ALIGN_TO_CENTER: {
-					E->get().rect.position.y = (-sd->ascent + sd->descent) / 2;
+					E.value.rect.position.y = (-sd->ascent + sd->descent) / 2;
 				} break;
 				case INLINE_ALIGN_TO_BASELINE: {
-					E->get().rect.position.y = 0;
+					E.value.rect.position.y = 0;
 				} break;
 				case INLINE_ALIGN_TO_BOTTOM: {
-					E->get().rect.position.y = sd->descent;
+					E.value.rect.position.y = sd->descent;
 				} break;
 			}
-			switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+			switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 				case INLINE_ALIGN_BOTTOM_TO: {
-					E->get().rect.position.y -= E->get().rect.size.y;
+					E.value.rect.position.y -= E.value.rect.size.y;
 				} break;
 				case INLINE_ALIGN_CENTER_TO: {
-					E->get().rect.position.y -= E->get().rect.size.y / 2;
+					E.value.rect.position.y -= E.value.rect.size.y / 2;
 				} break;
 				case INLINE_ALIGN_TOP_TO: {
 					//NOP
 				} break;
 			}
-			full_ascent = MAX(full_ascent, -E->get().rect.position.y);
-			full_descent = MAX(full_descent, E->get().rect.position.y + E->get().rect.size.y);
+			full_ascent = MAX(full_ascent, -E.value.rect.position.y);
+			full_descent = MAX(full_descent, E.value.rect.position.y + E.value.rect.size.y);
 		} else {
-			switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+			switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 				case INLINE_ALIGN_TO_TOP: {
-					E->get().rect.position.x = -sd->ascent;
+					E.value.rect.position.x = -sd->ascent;
 				} break;
 				case INLINE_ALIGN_TO_CENTER: {
-					E->get().rect.position.x = (-sd->ascent + sd->descent) / 2;
+					E.value.rect.position.x = (-sd->ascent + sd->descent) / 2;
 				} break;
 				case INLINE_ALIGN_TO_BASELINE: {
-					E->get().rect.position.x = 0;
+					E.value.rect.position.x = 0;
 				} break;
 				case INLINE_ALIGN_TO_BOTTOM: {
-					E->get().rect.position.x = sd->descent;
+					E.value.rect.position.x = sd->descent;
 				} break;
 			}
-			switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+			switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 				case INLINE_ALIGN_BOTTOM_TO: {
-					E->get().rect.position.x -= E->get().rect.size.x;
+					E.value.rect.position.x -= E.value.rect.size.x;
 				} break;
 				case INLINE_ALIGN_CENTER_TO: {
-					E->get().rect.position.x -= E->get().rect.size.x / 2;
+					E.value.rect.position.x -= E.value.rect.size.x / 2;
 				} break;
 				case INLINE_ALIGN_TOP_TO: {
 					//NOP
 				} break;
 			}
-			full_ascent = MAX(full_ascent, -E->get().rect.position.x);
-			full_descent = MAX(full_descent, E->get().rect.position.x + E->get().rect.size.x);
+			full_ascent = MAX(full_ascent, -E.value.rect.position.x);
+			full_descent = MAX(full_descent, E.value.rect.position.x + E.value.rect.size.x);
 		}
 	}
 	sd->ascent = full_ascent;
@@ -4529,8 +4529,8 @@ Array TextServerAdvanced::shaped_text_get_objects(RID p_shaped) const {
 	ERR_FAIL_COND_V(!sd, ret);
 
 	MutexLock lock(sd->mutex);
-	for (const Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
-		ret.push_back(E->key());
+	for (const KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
+		ret.push_back(E.key);
 	}
 
 	return ret;

+ 89 - 89
modules/text_server_fb/text_server_fb.cpp

@@ -795,8 +795,8 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_cache_for_size(FontDataFallback
 }
 
 _FORCE_INLINE_ void TextServerFallback::_font_clear_cache(FontDataFallback *p_font_data) {
-	for (const Map<Vector2i, FontDataForSizeFallback *>::Element *E = p_font_data->cache.front(); E; E = E->next()) {
-		memdelete(E->get());
+	for (const KeyValue<Vector2i, FontDataForSizeFallback *> &E : p_font_data->cache) {
+		memdelete(E.value);
 	}
 
 	p_font_data->cache.clear();
@@ -1008,8 +1008,8 @@ Array TextServerFallback::font_get_size_cache_list(RID p_font_rid) const {
 
 	MutexLock lock(fd->mutex);
 	Array ret;
-	for (const Map<Vector2i, FontDataForSizeFallback *>::Element *E = fd->cache.front(); E; E = E->next()) {
-		ret.push_back(E->key());
+	for (const KeyValue<Vector2i, FontDataForSizeFallback *> &E : fd->cache) {
+		ret.push_back(E.key);
 	}
 	return ret;
 }
@@ -1019,8 +1019,8 @@ void TextServerFallback::font_clear_size_cache(RID p_font_rid) {
 	ERR_FAIL_COND(!fd);
 
 	MutexLock lock(fd->mutex);
-	for (const Map<Vector2i, FontDataForSizeFallback *>::Element *E = fd->cache.front(); E; E = E->next()) {
-		memdelete(E->get());
+	for (const KeyValue<Vector2i, FontDataForSizeFallback *> &E : fd->cache) {
+		memdelete(E.value);
 	}
 	fd->cache.clear();
 }
@@ -1578,8 +1578,8 @@ Array TextServerFallback::font_get_kerning_list(RID p_font_rid, int p_size) cons
 	ERR_FAIL_COND_V(!_ensure_cache_for_size(fd, size), Array());
 
 	Array ret;
-	for (const Map<Vector2i, Vector2>::Element *E = fd->cache[size]->kerning_map.front(); E; E = E->next()) {
-		ret.push_back(E->key());
+	for (const KeyValue<Vector2i, Vector2> &E : fd->cache[size]->kerning_map) {
+		ret.push_back(E.key);
 	}
 	return ret;
 }
@@ -1852,8 +1852,8 @@ Vector<String> TextServerFallback::font_get_language_support_overrides(RID p_fon
 
 	MutexLock lock(fd->mutex);
 	Vector<String> out;
-	for (const Map<String, bool>::Element *E = fd->language_support_overrides.front(); E; E = E->next()) {
-		out.push_back(E->key());
+	for (const KeyValue<String, bool> &E : fd->language_support_overrides) {
+		out.push_back(E.key);
 	}
 	return out;
 }
@@ -1902,8 +1902,8 @@ Vector<String> TextServerFallback::font_get_script_support_overrides(RID p_font_
 
 	MutexLock lock(fd->mutex);
 	Vector<String> out;
-	for (const Map<String, bool>::Element *E = fd->script_support_overrides.front(); E; E = E->next()) {
-		out.push_back(E->key());
+	for (const KeyValue<String, bool> &E : fd->script_support_overrides) {
+		out.push_back(E.key);
 	}
 	return out;
 }
@@ -1971,9 +1971,9 @@ void TextServerFallback::invalidate(ShapedTextData *p_shaped) {
 void TextServerFallback::full_copy(ShapedTextData *p_shaped) {
 	ShapedTextData *parent = shaped_owner.get_or_null(p_shaped->parent);
 
-	for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = parent->objects.front(); E; E = E->next()) {
-		if (E->get().pos >= p_shaped->start && E->get().pos < p_shaped->end) {
-			p_shaped->objects[E->key()] = E->get();
+	for (const KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : parent->objects) {
+		if (E.value.pos >= p_shaped->start && E.value.pos < p_shaped->end) {
+			p_shaped->objects[E.key] = E.value;
 		}
 	}
 
@@ -2192,9 +2192,9 @@ bool TextServerFallback::shaped_text_resize_object(RID p_shaped, Variant p_key,
 			Glyph gl = sd->glyphs[i];
 			Variant key;
 			if (gl.count == 1) {
-				for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
-					if (E->get().pos == gl.start) {
-						key = E->key();
+				for (const KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
+					if (E.value.pos == gl.start) {
+						key = E.key;
 						break;
 					}
 				}
@@ -2237,64 +2237,64 @@ bool TextServerFallback::shaped_text_resize_object(RID p_shaped, Variant p_key,
 		// Align embedded objects to baseline.
 		real_t full_ascent = sd->ascent;
 		real_t full_descent = sd->descent;
-		for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
-			if ((E->get().pos >= sd->start) && (E->get().pos < sd->end)) {
+		for (KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
+			if ((E.value.pos >= sd->start) && (E.value.pos < sd->end)) {
 				if (sd->orientation == ORIENTATION_HORIZONTAL) {
-					switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 						case INLINE_ALIGN_TO_TOP: {
-							E->get().rect.position.y = -sd->ascent;
+							E.value.rect.position.y = -sd->ascent;
 						} break;
 						case INLINE_ALIGN_TO_CENTER: {
-							E->get().rect.position.y = (-sd->ascent + sd->descent) / 2;
+							E.value.rect.position.y = (-sd->ascent + sd->descent) / 2;
 						} break;
 						case INLINE_ALIGN_TO_BASELINE: {
-							E->get().rect.position.y = 0;
+							E.value.rect.position.y = 0;
 						} break;
 						case INLINE_ALIGN_TO_BOTTOM: {
-							E->get().rect.position.y = sd->descent;
+							E.value.rect.position.y = sd->descent;
 						} break;
 					}
-					switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 						case INLINE_ALIGN_BOTTOM_TO: {
-							E->get().rect.position.y -= E->get().rect.size.y;
+							E.value.rect.position.y -= E.value.rect.size.y;
 						} break;
 						case INLINE_ALIGN_CENTER_TO: {
-							E->get().rect.position.y -= E->get().rect.size.y / 2;
+							E.value.rect.position.y -= E.value.rect.size.y / 2;
 						} break;
 						case INLINE_ALIGN_TOP_TO: {
 							//NOP
 						} break;
 					}
-					full_ascent = MAX(full_ascent, -E->get().rect.position.y);
-					full_descent = MAX(full_descent, E->get().rect.position.y + E->get().rect.size.y);
+					full_ascent = MAX(full_ascent, -E.value.rect.position.y);
+					full_descent = MAX(full_descent, E.value.rect.position.y + E.value.rect.size.y);
 				} else {
-					switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 						case INLINE_ALIGN_TO_TOP: {
-							E->get().rect.position.x = -sd->ascent;
+							E.value.rect.position.x = -sd->ascent;
 						} break;
 						case INLINE_ALIGN_TO_CENTER: {
-							E->get().rect.position.x = (-sd->ascent + sd->descent) / 2;
+							E.value.rect.position.x = (-sd->ascent + sd->descent) / 2;
 						} break;
 						case INLINE_ALIGN_TO_BASELINE: {
-							E->get().rect.position.x = 0;
+							E.value.rect.position.x = 0;
 						} break;
 						case INLINE_ALIGN_TO_BOTTOM: {
-							E->get().rect.position.x = sd->descent;
+							E.value.rect.position.x = sd->descent;
 						} break;
 					}
-					switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 						case INLINE_ALIGN_BOTTOM_TO: {
-							E->get().rect.position.x -= E->get().rect.size.x;
+							E.value.rect.position.x -= E.value.rect.size.x;
 						} break;
 						case INLINE_ALIGN_CENTER_TO: {
-							E->get().rect.position.x -= E->get().rect.size.x / 2;
+							E.value.rect.position.x -= E.value.rect.size.x / 2;
 						} break;
 						case INLINE_ALIGN_TOP_TO: {
 							//NOP
 						} break;
 					}
-					full_ascent = MAX(full_ascent, -E->get().rect.position.x);
-					full_descent = MAX(full_descent, E->get().rect.position.x + E->get().rect.size.x);
+					full_ascent = MAX(full_ascent, -E.value.rect.position.x);
+					full_descent = MAX(full_descent, E.value.rect.position.x + E.value.rect.size.x);
 				}
 			}
 		}
@@ -2344,11 +2344,11 @@ RID TextServerFallback::shaped_text_substr(RID p_shaped, int p_start, int p_leng
 				Variant key;
 				bool find_embedded = false;
 				if (gl.count == 1) {
-					for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
-						if (E->get().pos == gl.start) {
+					for (const KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
+						if (E.value.pos == gl.start) {
 							find_embedded = true;
-							key = E->key();
-							new_sd->objects[key] = E->get();
+							key = E.key;
+							new_sd->objects[key] = E.value;
 							break;
 						}
 					}
@@ -2389,64 +2389,64 @@ RID TextServerFallback::shaped_text_substr(RID p_shaped, int p_start, int p_leng
 		// Align embedded objects to baseline.
 		real_t full_ascent = new_sd->ascent;
 		real_t full_descent = new_sd->descent;
-		for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = new_sd->objects.front(); E; E = E->next()) {
-			if ((E->get().pos >= new_sd->start) && (E->get().pos < new_sd->end)) {
+		for (KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : new_sd->objects) {
+			if ((E.value.pos >= new_sd->start) && (E.value.pos < new_sd->end)) {
 				if (sd->orientation == ORIENTATION_HORIZONTAL) {
-					switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 						case INLINE_ALIGN_TO_TOP: {
-							E->get().rect.position.y = -new_sd->ascent;
+							E.value.rect.position.y = -new_sd->ascent;
 						} break;
 						case INLINE_ALIGN_TO_CENTER: {
-							E->get().rect.position.y = (-new_sd->ascent + new_sd->descent) / 2;
+							E.value.rect.position.y = (-new_sd->ascent + new_sd->descent) / 2;
 						} break;
 						case INLINE_ALIGN_TO_BASELINE: {
-							E->get().rect.position.y = 0;
+							E.value.rect.position.y = 0;
 						} break;
 						case INLINE_ALIGN_TO_BOTTOM: {
-							E->get().rect.position.y = new_sd->descent;
+							E.value.rect.position.y = new_sd->descent;
 						} break;
 					}
-					switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 						case INLINE_ALIGN_BOTTOM_TO: {
-							E->get().rect.position.y -= E->get().rect.size.y;
+							E.value.rect.position.y -= E.value.rect.size.y;
 						} break;
 						case INLINE_ALIGN_CENTER_TO: {
-							E->get().rect.position.y -= E->get().rect.size.y / 2;
+							E.value.rect.position.y -= E.value.rect.size.y / 2;
 						} break;
 						case INLINE_ALIGN_TOP_TO: {
 							//NOP
 						} break;
 					}
-					full_ascent = MAX(full_ascent, -E->get().rect.position.y);
-					full_descent = MAX(full_descent, E->get().rect.position.y + E->get().rect.size.y);
+					full_ascent = MAX(full_ascent, -E.value.rect.position.y);
+					full_descent = MAX(full_descent, E.value.rect.position.y + E.value.rect.size.y);
 				} else {
-					switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 						case INLINE_ALIGN_TO_TOP: {
-							E->get().rect.position.x = -new_sd->ascent;
+							E.value.rect.position.x = -new_sd->ascent;
 						} break;
 						case INLINE_ALIGN_TO_CENTER: {
-							E->get().rect.position.x = (-new_sd->ascent + new_sd->descent) / 2;
+							E.value.rect.position.x = (-new_sd->ascent + new_sd->descent) / 2;
 						} break;
 						case INLINE_ALIGN_TO_BASELINE: {
-							E->get().rect.position.x = 0;
+							E.value.rect.position.x = 0;
 						} break;
 						case INLINE_ALIGN_TO_BOTTOM: {
-							E->get().rect.position.x = new_sd->descent;
+							E.value.rect.position.x = new_sd->descent;
 						} break;
 					}
-					switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+					switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 						case INLINE_ALIGN_BOTTOM_TO: {
-							E->get().rect.position.x -= E->get().rect.size.x;
+							E.value.rect.position.x -= E.value.rect.size.x;
 						} break;
 						case INLINE_ALIGN_CENTER_TO: {
-							E->get().rect.position.x -= E->get().rect.size.x / 2;
+							E.value.rect.position.x -= E.value.rect.size.x / 2;
 						} break;
 						case INLINE_ALIGN_TOP_TO: {
 							//NOP
 						} break;
 					}
-					full_ascent = MAX(full_ascent, -E->get().rect.position.x);
-					full_descent = MAX(full_descent, E->get().rect.position.x + E->get().rect.size.x);
+					full_ascent = MAX(full_ascent, -E.value.rect.position.x);
+					full_descent = MAX(full_descent, E.value.rect.position.x + E.value.rect.size.x);
 				}
 			}
 		}
@@ -2907,63 +2907,63 @@ bool TextServerFallback::shaped_text_shape(RID p_shaped) {
 	// Align embedded objects to baseline.
 	real_t full_ascent = sd->ascent;
 	real_t full_descent = sd->descent;
-	for (Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
+	for (KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
 		if (sd->orientation == ORIENTATION_HORIZONTAL) {
-			switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+			switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 				case INLINE_ALIGN_TO_TOP: {
-					E->get().rect.position.y = -sd->ascent;
+					E.value.rect.position.y = -sd->ascent;
 				} break;
 				case INLINE_ALIGN_TO_CENTER: {
-					E->get().rect.position.y = (-sd->ascent + sd->descent) / 2;
+					E.value.rect.position.y = (-sd->ascent + sd->descent) / 2;
 				} break;
 				case INLINE_ALIGN_TO_BASELINE: {
-					E->get().rect.position.y = 0;
+					E.value.rect.position.y = 0;
 				} break;
 				case INLINE_ALIGN_TO_BOTTOM: {
-					E->get().rect.position.y = sd->descent;
+					E.value.rect.position.y = sd->descent;
 				} break;
 			}
-			switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+			switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 				case INLINE_ALIGN_BOTTOM_TO: {
-					E->get().rect.position.y -= E->get().rect.size.y;
+					E.value.rect.position.y -= E.value.rect.size.y;
 				} break;
 				case INLINE_ALIGN_CENTER_TO: {
-					E->get().rect.position.y -= E->get().rect.size.y / 2;
+					E.value.rect.position.y -= E.value.rect.size.y / 2;
 				} break;
 				case INLINE_ALIGN_TOP_TO: {
 					//NOP
 				} break;
 			}
-			full_ascent = MAX(full_ascent, -E->get().rect.position.y);
-			full_descent = MAX(full_descent, E->get().rect.position.y + E->get().rect.size.y);
+			full_ascent = MAX(full_ascent, -E.value.rect.position.y);
+			full_descent = MAX(full_descent, E.value.rect.position.y + E.value.rect.size.y);
 		} else {
-			switch (E->get().inline_align & INLINE_ALIGN_TEXT_MASK) {
+			switch (E.value.inline_align & INLINE_ALIGN_TEXT_MASK) {
 				case INLINE_ALIGN_TO_TOP: {
-					E->get().rect.position.x = -sd->ascent;
+					E.value.rect.position.x = -sd->ascent;
 				} break;
 				case INLINE_ALIGN_TO_CENTER: {
-					E->get().rect.position.x = (-sd->ascent + sd->descent) / 2;
+					E.value.rect.position.x = (-sd->ascent + sd->descent) / 2;
 				} break;
 				case INLINE_ALIGN_TO_BASELINE: {
-					E->get().rect.position.x = 0;
+					E.value.rect.position.x = 0;
 				} break;
 				case INLINE_ALIGN_TO_BOTTOM: {
-					E->get().rect.position.x = sd->descent;
+					E.value.rect.position.x = sd->descent;
 				} break;
 			}
-			switch (E->get().inline_align & INLINE_ALIGN_IMAGE_MASK) {
+			switch (E.value.inline_align & INLINE_ALIGN_IMAGE_MASK) {
 				case INLINE_ALIGN_BOTTOM_TO: {
-					E->get().rect.position.x -= E->get().rect.size.x;
+					E.value.rect.position.x -= E.value.rect.size.x;
 				} break;
 				case INLINE_ALIGN_CENTER_TO: {
-					E->get().rect.position.x -= E->get().rect.size.x / 2;
+					E.value.rect.position.x -= E.value.rect.size.x / 2;
 				} break;
 				case INLINE_ALIGN_TOP_TO: {
 					//NOP
 				} break;
 			}
-			full_ascent = MAX(full_ascent, -E->get().rect.position.x);
-			full_descent = MAX(full_descent, E->get().rect.position.x + E->get().rect.size.x);
+			full_ascent = MAX(full_ascent, -E.value.rect.position.x);
+			full_descent = MAX(full_descent, E.value.rect.position.x + E.value.rect.size.x);
 		}
 	}
 	sd->ascent = full_ascent;
@@ -3017,8 +3017,8 @@ Array TextServerFallback::shaped_text_get_objects(RID p_shaped) const {
 	ERR_FAIL_COND_V(!sd, ret);
 
 	MutexLock lock(sd->mutex);
-	for (const Map<Variant, ShapedTextData::EmbeddedObject>::Element *E = sd->objects.front(); E; E = E->next()) {
-		ret.push_back(E->key());
+	for (const KeyValue<Variant, ShapedTextData::EmbeddedObject> &E : sd->objects) {
+		ret.push_back(E.key);
 	}
 
 	return ret;

+ 16 - 16
modules/visual_script/visual_script.cpp

@@ -702,8 +702,8 @@ void VisualScript::rename_custom_signal(const StringName &p_name, const StringNa
 }
 
 void VisualScript::get_custom_signal_list(List<StringName> *r_custom_signals) const {
-	for (const Map<StringName, Vector<Argument>>::Element *E = custom_signals.front(); E; E = E->next()) {
-		r_custom_signals->push_back(E->key());
+	for (const KeyValue<StringName, Vector<Argument>> &E : custom_signals) {
+		r_custom_signals->push_back(E.key);
 	}
 
 	r_custom_signals->sort_custom<StringName::AlphCompare>();
@@ -848,13 +848,13 @@ bool VisualScript::has_script_signal(const StringName &p_signal) const {
 }
 
 void VisualScript::get_script_signal_list(List<MethodInfo> *r_signals) const {
-	for (const Map<StringName, Vector<Argument>>::Element *E = custom_signals.front(); E; E = E->next()) {
+	for (const KeyValue<StringName, Vector<Argument>> &E : custom_signals) {
 		MethodInfo mi;
-		mi.name = E->key();
-		for (int i = 0; i < E->get().size(); i++) {
+		mi.name = E.key;
+		for (int i = 0; i < E.value.size(); i++) {
 			PropertyInfo arg;
-			arg.type = E->get()[i].type;
-			arg.name = E->get()[i].name;
+			arg.type = E.value[i].type;
+			arg.name = E.value[i].name;
 			mi.arguments.push_back(arg);
 		}
 
@@ -1056,13 +1056,13 @@ Dictionary VisualScript::_get_data() const {
 	d["variables"] = vars;
 
 	Array sigs;
-	for (const Map<StringName, Vector<Argument>>::Element *E = custom_signals.front(); E; E = E->next()) {
+	for (const KeyValue<StringName, Vector<Argument>> &E : custom_signals) {
 		Dictionary cs;
-		cs["name"] = E->key();
+		cs["name"] = E.key;
 		Array args;
-		for (int i = 0; i < E->get().size(); i++) {
-			args.push_back(E->get()[i].name);
-			args.push_back(E->get()[i].type);
+		for (int i = 0; i < E.value.size(); i++) {
+			args.push_back(E.value[i].name);
+			args.push_back(E.value[i].type);
 		}
 		cs["arguments"] = args;
 
@@ -2093,8 +2093,8 @@ VisualScriptInstance::~VisualScriptInstance() {
 		script->instances.erase(owner);
 	}
 
-	for (Map<int, VisualScriptNodeInstance *>::Element *E = instances.front(); E; E = E->next()) {
-		memdelete(E->get());
+	for (const KeyValue<int, VisualScriptNodeInstance *> &E : instances) {
+		memdelete(E.value);
 	}
 }
 
@@ -2516,8 +2516,8 @@ Ref<VisualScriptNode> VisualScriptLanguage::create_node_from_name(const String &
 }
 
 void VisualScriptLanguage::get_registered_node_names(List<String> *r_names) {
-	for (Map<String, VisualScriptNodeRegisterFunc>::Element *E = register_funcs.front(); E; E = E->next()) {
-		r_names->push_back(E->key());
+	for (const KeyValue<String, VisualScriptNodeRegisterFunc> &E : register_funcs) {
+		r_names->push_back(E.key);
 	}
 }
 

+ 12 - 12
modules/visual_script/visual_script_editor.cpp

@@ -3632,17 +3632,17 @@ void VisualScriptEditor::_notification(int p_what) {
 				node_colors["constants"] = Color(0.94, 0.18, 0.49);
 			}
 
-			for (Map<StringName, Color>::Element *E = node_colors.front(); E; E = E->next()) {
+			for (const KeyValue<StringName, Color> &E : node_colors) {
 				const Ref<StyleBoxFlat> sb = tm->get_stylebox(SNAME("frame"), SNAME("GraphNode"));
 
 				if (!sb.is_null()) {
 					Ref<StyleBoxFlat> frame_style = sb->duplicate();
 					// Adjust the border color to be close to the GraphNode's background color.
 					// This keeps the node's title area from being too distracting.
-					Color color = dark_theme ? E->get().darkened(0.75) : E->get().lightened(0.75);
+					Color color = dark_theme ? E.value.darkened(0.75) : E.value.lightened(0.75);
 					color.a = 0.9;
 					frame_style->set_border_color(color);
-					node_styles[E->key()] = frame_style;
+					node_styles[E.key] = frame_style;
 				}
 			}
 
@@ -3813,15 +3813,15 @@ void VisualScriptEditor::_menu_option(int p_what) {
 				}
 			}
 
-			for (Map<int, Ref<VisualScriptNode>>::Element *E = clipboard->nodes.front(); E; E = E->next()) {
-				Ref<VisualScriptNode> node = E->get()->duplicate();
+			for (KeyValue<int, Ref<VisualScriptNode>> &E : clipboard->nodes) {
+				Ref<VisualScriptNode> node = E.value->duplicate();
 
 				int new_id = idc++;
 				to_select.insert(new_id);
 
-				remap[E->key()] = new_id;
+				remap[E.key] = new_id;
 
-				Vector2 paste_pos = clipboard->nodes_positions[E->key()];
+				Vector2 paste_pos = clipboard->nodes_positions[E.key];
 
 				while (existing_positions.has(paste_pos.snapped(Vector2(2, 2)))) {
 					paste_pos += Vector2(20, 20) * EDSCALE;
@@ -3906,16 +3906,16 @@ void VisualScriptEditor::_menu_option(int p_what) {
 					// the user wants to connect the nodes.
 					int top_nd = -1;
 					Vector2 top;
-					for (Map<int, Ref<VisualScriptNode>>::Element *E = nodes.front(); E; E = E->next()) {
-						Ref<VisualScriptNode> nd = script->get_node(E->key());
+					for (const KeyValue<int, Ref<VisualScriptNode>> &E : nodes) {
+						Ref<VisualScriptNode> nd = script->get_node(E.key);
 						if (nd.is_valid() && nd->has_input_sequence_port()) {
 							if (top_nd < 0) {
-								top_nd = E->key();
+								top_nd = E.key;
 								top = script->get_node_position(top_nd);
 							}
-							Vector2 pos = script->get_node_position(E->key());
+							Vector2 pos = script->get_node_position(E.key);
 							if (top.y > pos.y) {
-								top_nd = E->key();
+								top_nd = E.key;
 								top = pos;
 							}
 						}

Some files were not shown because too many files changed in this diff