From f5a92d6cc39ea15ea8aa4cc35ee742a646b12508 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Thu, 3 Jan 2013 01:36:28 +0100
Subject: Directory: add constructor and destructor

---
 src/Directory.cxx | 45 +++++++++++++++++++++++++++------------------
 src/Directory.hxx | 13 +++++++++++++
 2 files changed, 40 insertions(+), 18 deletions(-)

(limited to 'src')

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.
 	 */
-- 
cgit v1.2.3