private void RemovePlaylistItemsInternal(DatabasePlaylist list) { foreach (var info in list.InfoItems) { resourcesDatabase.RemoveListFromItem(list, info); } }
public void UpdateIndex(DatabasePlaylist list, int offset) { if (!ContainingListInstances.ContainsKey(list)) { throw new ArgumentException(); } ContainingListInstances[list] = offset; }
public bool TryAdd(DatabasePlaylist list, int offset) { if (ContainingListInstances.ContainsKey(list)) { return(false); } ContainingListInstances.Add(list, offset); return(true); }
// Returns the index of the resource in the list // O(log d) private bool TryGetIndexOfInternal(DatabasePlaylist playlist, AudioResource resource, out int index) { if (resourcesDatabase.TryGet(resource, out var info) && info.TryGetIndexIn(playlist, out index)) { return(true); } index = 0; return(false); }
// Moves and updates the moved items' index, ignores values at target // O(n) private static int MoveBackwards(DatabasePlaylist playlist, List <UniqueResourceInfo> items, int begin, int end, int targetEnd) { while (begin != end) { var item = items[--targetEnd] = items[--end]; item.UpdateIndex(playlist, targetEnd); } return(targetEnd); }
private bool TryGetInternal(string id, out DatabasePlaylist value) { if (playlistCache.TryGetValue(id, out var data)) { value = data; return(true); } value = null; return(false); }
public bool GetOrCreateForListItem(AudioResource resource, DatabasePlaylist list, int index, out UniqueResourceInfo info) { if (uniqueSongs.TryGetValue(resource, out info)) { return(info.TryAdd(list, index)); } info = new UniqueResourceInfo(resource); info.TryAdd(list, index); uniqueSongs.Add(resource, info); return(true); }
// Moves and updates the moved items' index, ignores values at target // O(n) private static int Move(DatabasePlaylist playlist, List <UniqueResourceInfo> items, int begin, int end, int target) { while (begin != end) { var item = items[target] = items[begin]; item.UpdateIndex(playlist, target); target++; begin++; } return(target); }
public void RemoveListFromItem(DatabasePlaylist list, UniqueResourceInfo info) { if (!info.RemoveList(list)) { Log.Warn("Failed to remove song from database"); } if (!info.IsContainedInAList) { uniqueSongs.Remove(info.Resource); } }
public bool CreatePlaylist(string listId, Uid owner) { lock (Lock) { var list = new DatabasePlaylist(listId, owner); if (io.TryGetRealId(listId, out _)) { return(false); } playlistCache.Add(listId, list); io.Write(listId, list); return(true); } }
private void AddPlaylistInternal(string id, IPlaylist list) { var items = new List <UniqueResourceInfo>(list.Count); var plist = new DatabasePlaylist(id, list.Owner, list.AdditionalEditors, items); for (var index = 0; index < list.Count; index++) { var item = list[index]; if (resourcesDatabase.GetOrCreateForListItem(item, plist, index, out var info)) { items.Add(info); } else { Log.Info($"Song {item.ResourceTitle} in playlist {id} at index {index} is already contained in this playlist, skipping"); } } playlistCache.Add(id, plist); }
private static void RemoveIndices(DatabasePlaylist playlist, List <UniqueResourceInfo> items, IList <int> indices, int ibegin, int iend) { if (iend == ibegin) { return; } int count = items.Count; int it = indices[ibegin]; for (int iit = ibegin; iit < iend; iit++) { int next = (iit + 1 == iend ? count : indices[iit + 1]); int moveBegin = indices[iit] + 1; int moveEnd = next; it = Move(playlist, items, moveBegin, moveEnd, it); } items.RemoveRange(it, items.Count - it); }
private void EditPlaylistAndWriteInteral(DatabasePlaylist list, Action <PlaylistEditor> editor) { editor(new PlaylistEditor(list, this)); AfterPlaylistChanged(list); }
public PlaylistEditor(DatabasePlaylist playlist, PlaylistDatabase database) { this.playlist = playlist; this.database = database; }
public bool IsContainedIn(DatabasePlaylist list) { return(ContainingListInstances.ContainsKey(list)); }
public bool RemoveList(DatabasePlaylist list) { return(ContainingListInstances.Remove(list)); }
private void AfterPlaylistChanged(DatabasePlaylist playlist) { io.Write(playlist.Id, playlist); }
public bool TryGetIndexIn(DatabasePlaylist list, out int index) { return(ContainingListInstances.TryGetValue(list, out index)); }
protected bool Equals(DatabasePlaylist other) { return(Id == other.Id); }