aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Directory.cxx45
-rw-r--r--src/Directory.hxx13
2 files changed, 40 insertions, 18 deletions
diff --git a/src/Directory.cxx b/src/Directory.cxx
index c2c5d2816..b67ad3de8 100644
--- a/src/Directory.cxx
+++ b/src/Directory.cxx
@@ -36,8 +36,8 @@ extern "C" {
#include <string.h>
#include <stdlib.h>
-static Directory *
-directory_allocate(const char *path)
+inline Directory *
+Directory::Allocate(const char *path)
{
assert(path != NULL);
@@ -46,30 +46,21 @@ directory_allocate(const char *path)
(Directory *)g_malloc0(sizeof(*directory)
- sizeof(directory->path)
+ path_size);
- INIT_LIST_HEAD(&directory->children);
- INIT_LIST_HEAD(&directory->songs);
- INIT_LIST_HEAD(&directory->playlists);
-
- memcpy(directory->path, path, path_size);
+ new(directory) Directory(path);
return directory;
}
-Directory *
-Directory::NewGeneric(const char *path, Directory *parent)
+Directory::Directory(const char *_path)
{
- assert(path != NULL);
- assert((*path == 0) == (parent == NULL));
-
- Directory *directory = directory_allocate(path);
-
- directory->parent = parent;
+ INIT_LIST_HEAD(&children);
+ INIT_LIST_HEAD(&songs);
+ INIT_LIST_HEAD(&playlists);
- return directory;
+ strcpy(path, _path);
}
-void
-Directory::Free()
+Directory::~Directory()
{
playlist_vector_deinit(&playlists);
@@ -80,7 +71,25 @@ Directory::Free()
Directory *child, *n;
directory_for_each_child_safe(child, n, this)
child->Free();
+}
+Directory *
+Directory::NewGeneric(const char *path, Directory *parent)
+{
+ assert(path != NULL);
+ assert((*path == 0) == (parent == NULL));
+
+ Directory *directory = Allocate(path);
+
+ directory->parent = parent;
+
+ return directory;
+}
+
+void
+Directory::Free()
+{
+ this->Directory::~Directory();
g_free(this);
}
diff --git a/src/Directory.hxx b/src/Directory.hxx
index 29c69d6d6..3b2c6b1a3 100644
--- a/src/Directory.hxx
+++ b/src/Directory.hxx
@@ -90,6 +90,19 @@ struct Directory {
bool have_stat; /* not needed if ino_t == dev_t == 0 is impossible */
char path[sizeof(long)];
+protected:
+ Directory(const char *path);
+
+ gcc_malloc gcc_nonnull_all
+ static Directory *Allocate(const char *path);
+
+public:
+ /**
+ * Default constructor, needed for #detached_root.
+ */
+ Directory() = default;
+ ~Directory();
+
/**
* Generic constructor for #Directory object.
*/