db/simple: use class boost::intrusive::list

Remove the C list_head library and use type-safe C++ instead.
This commit is contained in:
Max Kellermann
2014-06-10 21:15:40 +02:00
parent 52594e64d0
commit 3ca0a39a35
12 changed files with 151 additions and 948 deletions

View File

@@ -64,15 +64,14 @@ DatabaseEditor::LockDeleteSong(Directory &parent, Song *song)
inline void
DatabaseEditor::ClearDirectory(Directory &directory)
{
Directory *child, *n;
directory_for_each_child_safe(child, n, directory)
DeleteDirectory(child);
directory.ForEachChildSafe([this](Directory &child){
DeleteDirectory(&child);
});
Song *song, *ns;
directory_for_each_song_safe(song, ns, directory) {
assert(song->parent == &directory);
DeleteSong(directory, song);
}
directory.ForEachSongSafe([this, &directory](Song &song){
assert(song.parent == &directory);
DeleteSong(directory, &song);
});
}
void

View File

@@ -80,26 +80,25 @@ UpdateWalk::RemoveExcludedFromDirectory(Directory &directory,
{
db_lock();
Directory *child, *n;
directory_for_each_child_safe(child, n, directory) {
const auto name_fs = AllocatedPath::FromUTF8(child->GetName());
directory.ForEachChildSafe([&](Directory &child){
const auto name_fs =
AllocatedPath::FromUTF8(child.GetName());
if (name_fs.IsNull() || exclude_list.Check(name_fs)) {
editor.DeleteDirectory(child);
modified = true;
}
}
if (name_fs.IsNull() || exclude_list.Check(name_fs)) {
editor.DeleteDirectory(&child);
modified = true;
}
});
Song *song, *ns;
directory_for_each_song_safe(song, ns, directory) {
assert(song->parent == &directory);
directory.ForEachSongSafe([&](Song &song){
assert(song.parent == &directory);
const auto name_fs = AllocatedPath::FromUTF8(song->uri);
if (name_fs.IsNull() || exclude_list.Check(name_fs)) {
editor.DeleteSong(directory, song);
modified = true;
}
}
const auto name_fs = AllocatedPath::FromUTF8(song.uri);
if (name_fs.IsNull() || exclude_list.Check(name_fs)) {
editor.DeleteSong(directory, &song);
modified = true;
}
});
db_unlock();
}
@@ -107,25 +106,23 @@ UpdateWalk::RemoveExcludedFromDirectory(Directory &directory,
inline void
UpdateWalk::PurgeDeletedFromDirectory(Directory &directory)
{
Directory *child, *n;
directory_for_each_child_safe(child, n, directory) {
if (DirectoryExists(storage, *child))
continue;
directory.ForEachChildSafe([&](Directory &child){
if (DirectoryExists(storage, child))
return;
editor.LockDeleteDirectory(child);
modified = true;
}
Song *song, *ns;
directory_for_each_song_safe(song, ns, directory) {
if (!directory_child_is_regular(storage, directory,
song->uri)) {
editor.LockDeleteSong(directory, song);
editor.LockDeleteDirectory(&child);
modified = true;
}
}
});
directory.ForEachSongSafe([&](Song &song){
if (!directory_child_is_regular(storage, directory,
song.uri)) {
editor.LockDeleteSong(directory, &song);
modified = true;
}
});
for (auto i = directory.playlists.begin(),
end = directory.playlists.end();