Przeglądaj źródła

core: move ListNode to separate header

Daniele Bartolini 7 lat temu
rodzic
commit
dc89514f20

+ 0 - 9
src/core/containers/types.h

@@ -192,13 +192,4 @@ struct SortMap
 	SortMap(Allocator& a);
 };
 
-/// Node in an intrusive linked list.
-///
-/// @ingroup Containers
-struct ListNode
-{
-	ListNode* next;
-	ListNode* prev;
-};
-
 } // namespace crown

+ 49 - 0
src/core/list.h

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2012-2018 Daniele Bartolini and individual contributors.
+ * License: https://github.com/dbartolini/crown/blob/master/LICENSE
+ */
+
+#pragma once
+
+namespace crown
+{
+/// Node in an intrusive linked list.
+///
+/// @ingroup Containers
+struct ListNode
+{
+	ListNode* next;
+	ListNode* prev;
+};
+
+namespace list
+{
+	inline void init_head(ListNode& head)
+	{
+		head.next = &head;
+		head.prev = &head;
+	}
+
+	inline void insert(ListNode& node, ListNode& prev, ListNode& next)
+	{
+		// Kernel
+		next.prev = &node;
+		node.next = &next;
+		node.prev = &prev;
+		prev.next = &node;
+	}
+
+	inline void add(ListNode& node, ListNode& head)
+	{
+		insert(node, head, *head.next);
+	}
+
+	inline void remove(ListNode& node)
+	{
+		node.prev->next = node.next;
+		node.next->prev = node.prev;
+	}
+
+} // namespace list
+
+} // namespace crown

+ 3 - 18
src/device/device.cpp

@@ -231,8 +231,7 @@ Device::Device(const DeviceOptions& opts, ConsoleServer& cs)
 	, _quit(false)
 	, _paused(false)
 {
-	_worlds.next = &_worlds;
-	_worlds.prev = &_worlds;
+	list::init_head(_worlds);
 }
 
 bool Device::process_events(bool vsync)
@@ -645,27 +644,13 @@ World* Device::create_world()
 		, *_lua_environment
 		);
 
-	ListNode* node = &world->_node;
-	ListNode* prev = &_worlds;
-	ListNode* next = _worlds.next;
-
-	node->next = next;
-	node->prev = prev;
-	next->prev = node;
-	prev->next = node;
-
+	list::add(world->_node, _worlds);
 	return world;
 }
 
 void Device::destroy_world(World& world)
 {
-	ListNode* node = &world._node;
-
-	node->next->prev = node->prev;
-	node->prev->next = node->next;
-	node->next = NULL;
-	node->prev = NULL;
-
+	list::remove(world._node);
 	CE_DELETE(default_allocator(), &world);
 }
 

+ 1 - 1
src/device/device.h

@@ -6,8 +6,8 @@
 #pragma once
 
 #include "config.h"
-#include "core/containers/types.h"
 #include "core/filesystem/types.h"
+#include "core/list.h"
 #include "core/memory/allocator.h"
 #include "core/memory/linear_allocator.h"
 #include "core/strings/string_id.h"

+ 1 - 0
src/world/types.h

@@ -6,6 +6,7 @@
 #pragma once
 
 #include "core/functional.h"
+#include "core/list.h"
 #include "core/math/types.h"
 #include "core/strings/string_id.h"
 #include "core/types.h"

+ 5 - 28
src/world/world.cpp

@@ -56,10 +56,8 @@ World::World(Allocator& a, ResourceManager& rm, ShaderManager& sm, MaterialManag
 
 	_gui_buffer.create();
 
-	_guis.next = &_guis;
-	_guis.prev = &_guis;
-	_levels.next = &_levels;
-	_levels.prev = &_levels;
+	list::init_head(_guis);
+	list::init_head(_levels);
 
 	_node.next = NULL;
 	_node.prev = NULL;
@@ -518,27 +516,13 @@ Gui* World::create_screen_gui()
 		, *_material_manager
 		);
 
-	ListNode* node = &gui->_node;
-	ListNode* prev = &_guis;
-	ListNode* next = _guis.next;
-
-	node->next = next;
-	node->prev = prev;
-	next->prev = node;
-	prev->next = node;
-
+	list::add(gui->_node, _guis);
 	return gui;
 }
 
 void World::destroy_gui(Gui& gui)
 {
-	ListNode* node = &gui._node;
-
-	node->next->prev = node->prev;
-	node->prev->next = node->next;
-	node->next = NULL;
-	node->prev = NULL;
-
+	list::remove(gui._node);
 	CE_DELETE(*_allocator, &gui);
 }
 
@@ -549,14 +533,7 @@ Level* World::load_level(StringId64 name, const Vector3& pos, const Quaternion&
 	Level* level = CE_NEW(*_allocator, Level)(*_allocator, *_unit_manager, *this, *lr);
 	level->load(pos, rot);
 
-	ListNode* node = &level->_node;
-	ListNode* prev = &_levels;
-	ListNode* next = _levels.next;
-
-	node->next = next;
-	node->prev = prev;
-	next->prev = node;
-	prev->next = node;
+	list::add(level->_node, _levels);
 
 	post_level_loaded_event();
 	return level;