CommandListBuilder: use std::list instead of GSList
This commit is contained in:
		| @@ -29,13 +29,14 @@ | ||||
| #define CLIENT_LIST_MODE_END "command_list_end" | ||||
|  | ||||
| static enum command_return | ||||
| client_process_command_list(Client *client, bool list_ok, GSList *list) | ||||
| client_process_command_list(Client *client, bool list_ok, | ||||
| 			    std::list<std::string> &&list) | ||||
| { | ||||
| 	enum command_return ret = COMMAND_RETURN_OK; | ||||
| 	unsigned num = 0; | ||||
|  | ||||
| 	for (GSList *cur = list; cur != NULL; cur = g_slist_next(cur)) { | ||||
| 		char *cmd = (char *)cur->data; | ||||
| 	for (auto &&i : list) { | ||||
| 		char *cmd = &*i.begin(); | ||||
|  | ||||
| 		g_debug("command_process_list: process command \"%s\"", | ||||
| 			cmd); | ||||
| @@ -81,11 +82,11 @@ client_process_line(Client *client, char *line) | ||||
| 			g_debug("[%u] process command list", | ||||
| 				client->num); | ||||
|  | ||||
| 			auto cmd_list = client->cmd_list.Commit(); | ||||
| 			auto &&cmd_list = client->cmd_list.Commit(); | ||||
|  | ||||
| 			ret = client_process_command_list(client, | ||||
| 							  client->cmd_list.IsOKMode(), | ||||
| 							  cmd_list); | ||||
| 							  std::move(cmd_list)); | ||||
| 			g_debug("[%u] process command " | ||||
| 				"list returned %i", client->num, ret); | ||||
|  | ||||
|   | ||||
| @@ -25,12 +25,7 @@ | ||||
| void | ||||
| CommandListBuilder::Reset() | ||||
| { | ||||
| 	for (GSList *tmp = list; tmp != NULL; tmp = g_slist_next(tmp)) | ||||
| 		g_free(tmp->data); | ||||
|  | ||||
| 	g_slist_free(list); | ||||
|  | ||||
| 	list = nullptr; | ||||
| 	list.clear(); | ||||
| 	mode = Mode::DISABLED; | ||||
| } | ||||
|  | ||||
| @@ -42,6 +37,6 @@ CommandListBuilder::Add(const char *cmd) | ||||
| 	if (size > client_max_command_list_size) | ||||
| 		return false; | ||||
|  | ||||
| 	list = g_slist_prepend(list, g_strdup(cmd)); | ||||
| 	list.emplace_back(cmd); | ||||
| 	return true; | ||||
| } | ||||
|   | ||||
| @@ -20,7 +20,9 @@ | ||||
| #ifndef MPD_COMMAND_LIST_BUILDER_HXX | ||||
| #define MPD_COMMAND_LIST_BUILDER_HXX | ||||
|  | ||||
| #include <glib.h> | ||||
| #include <list> | ||||
| #include <string> | ||||
|  | ||||
| #include <assert.h> | ||||
|  | ||||
| class CommandListBuilder { | ||||
| @@ -47,7 +49,7 @@ class CommandListBuilder { | ||||
| 	/** | ||||
| 	 * for when in list mode | ||||
| 	 */ | ||||
| 	GSList *list; | ||||
| 	std::list<std::string> list; | ||||
|  | ||||
| 	/** | ||||
| 	 * Memory consumed by the list. | ||||
| @@ -56,10 +58,7 @@ class CommandListBuilder { | ||||
|  | ||||
| public: | ||||
| 	CommandListBuilder() | ||||
| 		:mode(Mode::DISABLED), list(nullptr), size(0) {} | ||||
| 	~CommandListBuilder() { | ||||
| 		Reset(); | ||||
| 	} | ||||
| 		:mode(Mode::DISABLED), size(0) {} | ||||
|  | ||||
| 	/** | ||||
| 	 * Is a command list currently being built? | ||||
| @@ -86,7 +85,7 @@ public: | ||||
| 	 * Begin building a command list. | ||||
| 	 */ | ||||
| 	void Begin(bool ok) { | ||||
| 		assert(list == nullptr); | ||||
| 		assert(list.empty()); | ||||
| 		assert(mode == Mode::DISABLED); | ||||
|  | ||||
| 		mode = (Mode)ok; | ||||
| @@ -100,13 +99,10 @@ public: | ||||
| 	/** | ||||
| 	 * Finishes the list and returns it. | ||||
| 	 */ | ||||
| 	GSList *Commit() { | ||||
| 	std::list<std::string> &&Commit() { | ||||
| 		assert(IsActive()); | ||||
|  | ||||
| 		/* for scalability reasons, we have prepended each new | ||||
| 		   command; now we have to reverse it to restore the | ||||
| 		   correct order */ | ||||
| 		return list = g_slist_reverse(list); | ||||
| 		return std::move(list); | ||||
| 	} | ||||
| }; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann