CommandListBuilder: use std::list instead of GSList

This commit is contained in:
Max Kellermann 2013-01-04 01:17:25 +01:00
parent 77a99cc61d
commit a7d1daee93
3 changed files with 16 additions and 24 deletions

View File

@ -29,13 +29,14 @@
#define CLIENT_LIST_MODE_END "command_list_end" #define CLIENT_LIST_MODE_END "command_list_end"
static enum command_return 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; enum command_return ret = COMMAND_RETURN_OK;
unsigned num = 0; unsigned num = 0;
for (GSList *cur = list; cur != NULL; cur = g_slist_next(cur)) { for (auto &&i : list) {
char *cmd = (char *)cur->data; char *cmd = &*i.begin();
g_debug("command_process_list: process command \"%s\"", g_debug("command_process_list: process command \"%s\"",
cmd); cmd);
@ -81,11 +82,11 @@ client_process_line(Client *client, char *line)
g_debug("[%u] process command list", g_debug("[%u] process command list",
client->num); client->num);
auto cmd_list = client->cmd_list.Commit(); auto &&cmd_list = client->cmd_list.Commit();
ret = client_process_command_list(client, ret = client_process_command_list(client,
client->cmd_list.IsOKMode(), client->cmd_list.IsOKMode(),
cmd_list); std::move(cmd_list));
g_debug("[%u] process command " g_debug("[%u] process command "
"list returned %i", client->num, ret); "list returned %i", client->num, ret);

View File

@ -25,12 +25,7 @@
void void
CommandListBuilder::Reset() CommandListBuilder::Reset()
{ {
for (GSList *tmp = list; tmp != NULL; tmp = g_slist_next(tmp)) list.clear();
g_free(tmp->data);
g_slist_free(list);
list = nullptr;
mode = Mode::DISABLED; mode = Mode::DISABLED;
} }
@ -42,6 +37,6 @@ CommandListBuilder::Add(const char *cmd)
if (size > client_max_command_list_size) if (size > client_max_command_list_size)
return false; return false;
list = g_slist_prepend(list, g_strdup(cmd)); list.emplace_back(cmd);
return true; return true;
} }

View File

@ -20,7 +20,9 @@
#ifndef MPD_COMMAND_LIST_BUILDER_HXX #ifndef MPD_COMMAND_LIST_BUILDER_HXX
#define MPD_COMMAND_LIST_BUILDER_HXX #define MPD_COMMAND_LIST_BUILDER_HXX
#include <glib.h> #include <list>
#include <string>
#include <assert.h> #include <assert.h>
class CommandListBuilder { class CommandListBuilder {
@ -47,7 +49,7 @@ class CommandListBuilder {
/** /**
* for when in list mode * for when in list mode
*/ */
GSList *list; std::list<std::string> list;
/** /**
* Memory consumed by the list. * Memory consumed by the list.
@ -56,10 +58,7 @@ class CommandListBuilder {
public: public:
CommandListBuilder() CommandListBuilder()
:mode(Mode::DISABLED), list(nullptr), size(0) {} :mode(Mode::DISABLED), size(0) {}
~CommandListBuilder() {
Reset();
}
/** /**
* Is a command list currently being built? * Is a command list currently being built?
@ -86,7 +85,7 @@ public:
* Begin building a command list. * Begin building a command list.
*/ */
void Begin(bool ok) { void Begin(bool ok) {
assert(list == nullptr); assert(list.empty());
assert(mode == Mode::DISABLED); assert(mode == Mode::DISABLED);
mode = (Mode)ok; mode = (Mode)ok;
@ -100,13 +99,10 @@ public:
/** /**
* Finishes the list and returns it. * Finishes the list and returns it.
*/ */
GSList *Commit() { std::list<std::string> &&Commit() {
assert(IsActive()); assert(IsActive());
/* for scalability reasons, we have prepended each new return std::move(list);
command; now we have to reverse it to restore the
correct order */
return list = g_slist_reverse(list);
} }
}; };