playlist: make kept song count collision resistant

This commit is contained in:
Andrzej Rybczak
2014-08-30 02:30:54 +02:00
parent d20765c53a
commit dcaa1cafa4
8 changed files with 37 additions and 38 deletions

View File

@@ -21,6 +21,7 @@
#ifndef NCMPCPP_SONG_H
#define NCMPCPP_SONG_H
#include <cstring>
#include <functional>
#include <memory>
#include <string>
@@ -32,6 +33,10 @@ namespace MPD {//
struct Song
{
struct Hash {
size_t operator()(const Song &s) const { return s.m_hash; }
};
typedef std::string (Song::*GetFunction)(unsigned) const;
Song() { }
@@ -61,7 +66,6 @@ struct Song
virtual std::string getTags(GetFunction f, const std::string &tags_separator) const;
virtual unsigned getHash() const;
virtual unsigned getDuration() const;
virtual unsigned getPosition() const;
virtual unsigned getID() const;
@@ -76,9 +80,19 @@ struct Song
virtual std::string toString(const std::string &fmt, const std::string &tags_separator,
const std::string &escape_chars = "") const;
bool operator==(const Song &rhs) const { return m_hash == rhs.m_hash; }
bool operator!=(const Song &rhs) const { return m_hash != rhs.m_hash; }
bool operator==(const Song &rhs) const {
if (m_hash != rhs.m_hash)
return false;
return strcmp(c_uri(), rhs.c_uri()) == 0;
}
bool operator!=(const Song &rhs) const {
if (m_hash != rhs.m_hash)
return true;
return strcmp(c_uri(), rhs.c_uri()) != 0;
}
const char *c_uri() const { return m_song ? mpd_song_get_uri(m_song.get()) : ""; }
static std::string ShowTime(unsigned length);
static void validateFormat(const std::string &fmt);