From 445c11b8d976e74c6392e001973ca1ff07806ca6 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 29 May 2017 20:36:08 +0200 Subject: [PATCH 1/6] increment version number to 0.20.9 --- NEWS | 2 ++ configure.ac | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 45598ac05..e8f0345b9 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,5 @@ +ver 0.20.9 (not yet released) + ver 0.20.8 (2017/05/19) * output - osx: fix build failure due to missing "noexcept" diff --git a/configure.ac b/configure.ac index 26053f833..403254c63 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ AC_PREREQ(2.60) -AC_INIT(mpd, 0.20.8, musicpd-dev-team@lists.sourceforge.net) +AC_INIT(mpd, 0.20.9, musicpd-dev-team@lists.sourceforge.net) VERSION_MAJOR=0 VERSION_MINOR=20 -VERSION_REVISION=8 +VERSION_REVISION=9 VERSION_EXTRA=0 AC_CONFIG_SRCDIR([src/Main.cxx]) From 0a379fc514930a49c4006da1d7a03cb32d535fb5 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 29 May 2017 20:37:14 +0200 Subject: [PATCH 2/6] system/ByteOrder: fix byte order detection on FreeBSD/aarch64 Patch from https://svnweb.freebsd.org/ports/head/audio/musicpd/files/patch-src_system_ByteOrder.hxx?revision=441921&view=co (with a tiny modification) Closes #59 --- NEWS | 1 + src/system/ByteOrder.hxx | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/NEWS b/NEWS index e8f0345b9..398685b13 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,5 @@ ver 0.20.9 (not yet released) +* fix byte order detection on FreeBSD/aarch64 ver 0.20.8 (2017/05/19) * output diff --git a/src/system/ByteOrder.hxx b/src/system/ByteOrder.hxx index d4cf454c9..edeeb31c3 100644 --- a/src/system/ByteOrder.hxx +++ b/src/system/ByteOrder.hxx @@ -52,6 +52,15 @@ # define IS_LITTLE_ENDIAN false # define IS_BIG_ENDIAN true # endif +#elif defined(__BYTE_ORDER__) +/* GCC-specific macros */ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define IS_LITTLE_ENDIAN true +# define IS_BIG_ENDIAN false +# else +# define IS_LITTLE_ENDIAN false +# define IS_BIG_ENDIAN true +# endif #else /* generic compile-time check */ # include From 18b827b979d6d1f739770af8a6e6a2c1ae361859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Raftopoulos?= Date: Thu, 1 Jun 2017 19:16:24 +0200 Subject: [PATCH 3/6] decoder/ffmpeg: add support for adx Add ffmpeg decoder support for *.adx files (Sega game console) Closes #60 --- NEWS | 2 ++ src/decoder/plugins/FfmpegDecoderPlugin.cxx | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 398685b13..c209cfa80 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,6 @@ ver 0.20.9 (not yet released) +* decoder + - ffmpeg: support *.adx * fix byte order detection on FreeBSD/aarch64 ver 0.20.8 (2017/05/19) diff --git a/src/decoder/plugins/FfmpegDecoderPlugin.cxx b/src/decoder/plugins/FfmpegDecoderPlugin.cxx index 2c9d3a8fa..75038e694 100644 --- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx +++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx @@ -881,7 +881,8 @@ ffmpeg_scan_stream(InputStream &is, * more formats. */ static const char *const ffmpeg_suffixes[] = { - "16sv", "3g2", "3gp", "4xm", "8svx", "aa3", "aac", "ac3", "afc", "aif", + "16sv", "3g2", "3gp", "4xm", "8svx", + "aa3", "aac", "ac3", "adx", "afc", "aif", "aifc", "aiff", "al", "alaw", "amr", "anim", "apc", "ape", "asf", "atrac", "au", "aud", "avi", "avm2", "avs", "bap", "bfi", "c93", "cak", "cin", "cmv", "cpk", "daud", "dct", "divx", "dts", "dv", "dvd", "dxa", @@ -934,6 +935,7 @@ static const char *const ffmpeg_mime_types[] = { "audio/x-16sv", "audio/x-aac", "audio/x-ac3", + "audio/x-adx", "audio/x-aiff" "audio/x-alaw", "audio/x-au", From 62b03cfddf74c25d0b8187ce5e56d31ef49667b7 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 3 Jun 2017 21:54:21 +0200 Subject: [PATCH 4/6] storage, db, mixer, command: remove more bogus "pure" attributes This commit is similar to 788e3b31e1ab8243386339eaf136ede18f015d55, and removes more "pure" attributes which were placed on functions that could throw exceptions, which is illegal according to clang's understanding of the attribute (but not according to GCC's). GitHub issue #58 was most likely about StorageDirectoryReader::GetInfo() and Storage::GetInfo(), which still had "pure" attributes. Closes #58 --- NEWS | 1 + src/command/Request.hxx | 11 ----------- src/db/Interface.hxx | 1 - src/mixer/MixerInternal.hxx | 1 - src/pcm/Resampler.hxx | 3 ++- src/storage/StorageInterface.hxx | 2 -- 6 files changed, 3 insertions(+), 16 deletions(-) diff --git a/NEWS b/NEWS index c209cfa80..3cb18d103 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ ver 0.20.9 (not yet released) * decoder - ffmpeg: support *.adx * fix byte order detection on FreeBSD/aarch64 +* fix more random crashes when compiled with clang ver 0.20.8 (2017/05/19) * output diff --git a/src/command/Request.hxx b/src/command/Request.hxx index 884b5eea7..02f7804e5 100644 --- a/src/command/Request.hxx +++ b/src/command/Request.hxx @@ -45,68 +45,57 @@ public: : default_value; } - gcc_pure int ParseInt(unsigned idx) const { assert(idx < size); return ParseCommandArgInt(data[idx]); } - gcc_pure int ParseInt(unsigned idx, int min_value, int max_value) const { assert(idx < size); return ParseCommandArgInt(data[idx], min_value, max_value); } - gcc_pure int ParseUnsigned(unsigned idx) const { assert(idx < size); return ParseCommandArgUnsigned(data[idx]); } - gcc_pure int ParseUnsigned(unsigned idx, unsigned max_value) const { assert(idx < size); return ParseCommandArgUnsigned(data[idx], max_value); } - gcc_pure bool ParseBool(unsigned idx) const { assert(idx < size); return ParseCommandArgBool(data[idx]); } - gcc_pure RangeArg ParseRange(unsigned idx) const { assert(idx < size); return ParseCommandArgRange(data[idx]); } - gcc_pure float ParseFloat(unsigned idx) const { assert(idx < size); return ParseCommandArgFloat(data[idx]); } - gcc_pure SongTime ParseSongTime(unsigned idx) const { assert(idx < size); return ParseCommandArgSongTime(data[idx]); } - gcc_pure SignedSongTime ParseSignedSongTime(unsigned idx) const { assert(idx < size); return ParseCommandArgSignedSongTime(data[idx]); } - gcc_pure int ParseOptional(unsigned idx, int default_value) const { return idx < size ? ParseInt(idx) : default_value; } - gcc_pure RangeArg ParseOptional(unsigned idx, RangeArg default_value) const { return idx < size ? ParseRange(idx) diff --git a/src/db/Interface.hxx b/src/db/Interface.hxx index 4e01c42ce..a81d985a6 100644 --- a/src/db/Interface.hxx +++ b/src/db/Interface.hxx @@ -106,7 +106,6 @@ public: TagType tag_type, tag_mask_t group_mask, VisitTag visit_tag) const = 0; - gcc_pure virtual DatabaseStats GetStats(const DatabaseSelection &selection) const = 0; /** diff --git a/src/mixer/MixerInternal.hxx b/src/mixer/MixerInternal.hxx index 0d62fb0f3..4e2e50657 100644 --- a/src/mixer/MixerInternal.hxx +++ b/src/mixer/MixerInternal.hxx @@ -84,7 +84,6 @@ public: * @return the current volume (0..100 including) or -1 if * unavailable */ - gcc_pure virtual int GetVolume() = 0; /** diff --git a/src/pcm/Resampler.hxx b/src/pcm/Resampler.hxx index a82387e39..26d5014da 100644 --- a/src/pcm/Resampler.hxx +++ b/src/pcm/Resampler.hxx @@ -63,11 +63,12 @@ public: /** * Resamples a block of PCM data. * + * Throws std::runtime_error on error. + * * @param src the input buffer * @return the destination buffer (will be invalidated by * filter_close() or filter_filter()) */ - gcc_pure virtual ConstBuffer Resample(ConstBuffer src) = 0; }; diff --git a/src/storage/StorageInterface.hxx b/src/storage/StorageInterface.hxx index 57d15ab15..810b31687 100644 --- a/src/storage/StorageInterface.hxx +++ b/src/storage/StorageInterface.hxx @@ -39,7 +39,6 @@ public: /** * Throws #std::runtime_error on error. */ - gcc_pure virtual StorageFileInfo GetInfo(bool follow) = 0; }; @@ -52,7 +51,6 @@ public: /** * Throws #std::runtime_error on error. */ - gcc_pure virtual StorageFileInfo GetInfo(const char *uri_utf8, bool follow) = 0; /** From a057b4f6d88f7bfc1d9846e14de5617a4c281c0d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 3 Jun 2017 21:33:44 +0200 Subject: [PATCH 5/6] *: add lost of "noexcept" specifications --- src/AudioFormat.hxx | 2 +- src/DetachedSong.hxx | 6 +-- src/MixRampInfo.hxx | 16 ++++---- src/MusicBuffer.hxx | 2 +- src/MusicPipe.cxx | 6 +-- src/MusicPipe.hxx | 14 +++---- src/client/Client.hxx | 2 +- src/config/Block.hxx | 4 +- src/db/Helpers.cxx | 2 +- src/db/Interface.hxx | 2 +- src/db/LightDirectory.hxx | 6 +-- src/db/PlaylistInfo.hxx | 2 +- src/db/plugins/ProxyDatabasePlugin.cxx | 2 +- src/db/plugins/simple/Directory.hxx | 2 +- .../plugins/simple/SimpleDatabasePlugin.hxx | 4 +- src/db/plugins/upnp/Object.hxx | 6 +-- src/db/plugins/upnp/UpnpDatabasePlugin.cxx | 2 +- src/db/update/ExcludeList.cxx | 4 +- src/db/update/ExcludeList.hxx | 6 +-- src/decoder/Bridge.cxx | 6 +-- src/decoder/Bridge.hxx | 6 +-- src/decoder/Client.hxx | 6 +-- src/decoder/DecoderBuffer.hxx | 10 ++--- src/decoder/DecoderControl.hxx | 10 ++--- src/decoder/plugins/FlacMetadata.hxx | 20 +++++----- src/decoder/plugins/OpusDecoderPlugin.cxx | 4 +- src/event/Loop.hxx | 6 +-- src/fs/AllocatedPath.hxx | 39 ++++++++++--------- src/fs/Glob.hxx | 2 +- src/fs/Path.hxx | 6 +-- src/fs/Traits.hxx | 24 ++++++------ src/fs/io/BufferedReader.cxx | 2 +- src/fs/io/BufferedReader.hxx | 10 ++--- src/input/AsyncInputStream.cxx | 14 +++---- src/input/AsyncInputStream.hxx | 30 +++++++------- src/input/InputStream.hxx | 18 ++++----- src/lib/curl/Global.cxx | 6 +-- src/lib/nfs/Connection.hxx | 6 +-- src/lib/upnp/ContentDirectoryService.hxx | 4 +- .../plugins/SmbclientNeighborPlugin.cxx | 4 +- src/neighbor/plugins/UpnpNeighborPlugin.cxx | 4 +- src/net/AllocatedSocketAddress.hxx | 24 ++++++------ src/net/StaticSocketAddress.hxx | 22 +++++------ src/output/MultipleOutputs.hxx | 4 +- src/output/plugins/AlsaOutputPlugin.cxx | 2 +- src/output/plugins/OpenALOutputPlugin.cxx | 6 +-- src/output/plugins/RecorderOutputPlugin.cxx | 2 +- src/output/plugins/httpd/HttpdInternal.hxx | 4 +- src/player/Thread.cxx | 4 +- src/queue/Queue.hxx | 6 +-- src/storage/CompositeStorage.cxx | 4 +- src/storage/CompositeStorage.hxx | 6 +-- src/storage/plugins/CurlStorage.cxx | 2 +- src/tag/MixRamp.cxx | 4 +- src/tag/ReplayGain.cxx | 4 +- src/tag/Set.cxx | 6 +-- src/tag/Set.hxx | 8 ++-- src/tag/TagBuilder.hxx | 2 +- src/thread/Id.hxx | 6 +-- src/thread/Thread.hxx | 2 +- src/util/ConstBuffer.hxx | 2 +- src/util/StringView.cxx | 4 +- src/util/StringView.hxx | 24 ++++++------ test/FakeDecoderAPI.cxx | 6 +-- test/FakeDecoderAPI.hxx | 6 +-- 65 files changed, 246 insertions(+), 241 deletions(-) diff --git a/src/AudioFormat.hxx b/src/AudioFormat.hxx index 04c682b54..77e710f55 100644 --- a/src/AudioFormat.hxx +++ b/src/AudioFormat.hxx @@ -127,7 +127,7 @@ struct AudioFormat { void ApplyMask(AudioFormat mask) noexcept; gcc_pure - AudioFormat WithMask(AudioFormat mask) const { + AudioFormat WithMask(AudioFormat mask) const noexcept { AudioFormat result = *this; result.ApplyMask(mask); return result; diff --git a/src/DetachedSong.hxx b/src/DetachedSong.hxx index 9d1f1edd9..49558d9e5 100644 --- a/src/DetachedSong.hxx +++ b/src/DetachedSong.hxx @@ -152,7 +152,7 @@ public: bool IsRemote() const noexcept; gcc_pure - bool IsFile() const { + bool IsFile() const noexcept { return !IsRemote(); } @@ -162,11 +162,11 @@ public: gcc_pure bool IsInDatabase() const noexcept; - const Tag &GetTag() const { + const Tag &GetTag() const noexcept { return tag; } - Tag &WritableTag() { + Tag &WritableTag() noexcept { return tag; } diff --git a/src/MixRampInfo.hxx b/src/MixRampInfo.hxx index 2dbd9075a..c5caf241f 100644 --- a/src/MixRampInfo.hxx +++ b/src/MixRampInfo.hxx @@ -31,45 +31,45 @@ class MixRampInfo { public: MixRampInfo() = default; - void Clear() { + void Clear() noexcept { start.clear(); end.clear(); } gcc_pure - bool IsDefined() const { + bool IsDefined() const noexcept { return !start.empty() || !end.empty(); } gcc_pure - const char *GetStart() const { + const char *GetStart() const noexcept { return start.empty() ? nullptr : start.c_str(); } gcc_pure - const char *GetEnd() const { + const char *GetEnd() const noexcept { return end.empty() ? nullptr : end.c_str(); } - void SetStart(const char *new_value) { + void SetStart(const char *new_value) noexcept { if (new_value == nullptr) start.clear(); else start = new_value; } - void SetStart(std::string &&new_value) { + void SetStart(std::string &&new_value) noexcept { start = std::move(new_value); } - void SetEnd(const char *new_value) { + void SetEnd(const char *new_value) noexcept { if (new_value == nullptr) end.clear(); else end = new_value; } - void SetEnd(std::string &&new_value) { + void SetEnd(std::string &&new_value) noexcept { end = std::move(new_value); } }; diff --git a/src/MusicBuffer.hxx b/src/MusicBuffer.hxx index 1c51839e2..438ade621 100644 --- a/src/MusicBuffer.hxx +++ b/src/MusicBuffer.hxx @@ -60,7 +60,7 @@ public: * music_buffer_new(). */ gcc_pure - unsigned GetSize() const { + unsigned GetSize() const noexcept { return buffer.GetCapacity(); } diff --git a/src/MusicPipe.cxx b/src/MusicPipe.cxx index c82faa648..9dd2a7a8f 100644 --- a/src/MusicPipe.cxx +++ b/src/MusicPipe.cxx @@ -39,7 +39,7 @@ MusicPipe::Contains(const MusicChunk *chunk) const noexcept #endif MusicChunk * -MusicPipe::Shift() +MusicPipe::Shift() noexcept { const std::lock_guard protect(mutex); @@ -73,7 +73,7 @@ MusicPipe::Shift() } void -MusicPipe::Clear(MusicBuffer &buffer) +MusicPipe::Clear(MusicBuffer &buffer) noexcept { MusicChunk *chunk; @@ -82,7 +82,7 @@ MusicPipe::Clear(MusicBuffer &buffer) } void -MusicPipe::Push(MusicChunk *chunk) +MusicPipe::Push(MusicChunk *chunk) noexcept { assert(!chunk->IsEmpty()); assert(chunk->length == 0 || chunk->audio_format.IsValid()); diff --git a/src/MusicPipe.hxx b/src/MusicPipe.hxx index e9bebed6e..f9e42326b 100644 --- a/src/MusicPipe.hxx +++ b/src/MusicPipe.hxx @@ -77,7 +77,7 @@ public: * audio_format. */ gcc_pure - bool CheckFormat(AudioFormat other) const { + bool CheckFormat(AudioFormat other) const noexcept { return !audio_format.IsDefined() || audio_format == other; } @@ -94,37 +94,37 @@ public: * nullptr if the pipe is empty. */ gcc_pure - const MusicChunk *Peek() const { + const MusicChunk *Peek() const noexcept { return head; } /** * Removes the first chunk from the head, and returns it. */ - MusicChunk *Shift(); + MusicChunk *Shift() noexcept; /** * Clears the whole pipe and returns the chunks to the buffer. * * @param buffer the buffer object to return the chunks to */ - void Clear(MusicBuffer &buffer); + void Clear(MusicBuffer &buffer) noexcept; /** * Pushes a chunk to the tail of the pipe. */ - void Push(MusicChunk *chunk); + void Push(MusicChunk *chunk) noexcept; /** * Returns the number of chunks currently in this pipe. */ gcc_pure - unsigned GetSize() const { + unsigned GetSize() const noexcept { return size; } gcc_pure - bool IsEmpty() const { + bool IsEmpty() const noexcept { return GetSize() == 0; } }; diff --git a/src/client/Client.hxx b/src/client/Client.hxx index c3a9a9cc0..e2921417d 100644 --- a/src/client/Client.hxx +++ b/src/client/Client.hxx @@ -100,7 +100,7 @@ public: } gcc_pure - bool IsExpired() const { + bool IsExpired() const noexcept { return !FullyBufferedSocket::IsDefined(); } diff --git a/src/config/Block.hxx b/src/config/Block.hxx index edfa5a7d2..b8257db78 100644 --- a/src/config/Block.hxx +++ b/src/config/Block.hxx @@ -82,12 +82,12 @@ struct ConfigBlock { * object that was synthesized and not loaded from a * configuration file. */ - bool IsNull() const { + bool IsNull() const noexcept { return line < 0; } gcc_pure - bool IsEmpty() const { + bool IsEmpty() const noexcept { return block_params.empty(); } diff --git a/src/db/Helpers.cxx b/src/db/Helpers.cxx index bff14a3bb..805268632 100644 --- a/src/db/Helpers.cxx +++ b/src/db/Helpers.cxx @@ -29,7 +29,7 @@ struct StringLess { gcc_pure - bool operator()(const char *a, const char *b) const { + bool operator()(const char *a, const char *b) const noexcept { return strcmp(a, b) < 0; } }; diff --git a/src/db/Interface.hxx b/src/db/Interface.hxx index a81d985a6..a61c323d3 100644 --- a/src/db/Interface.hxx +++ b/src/db/Interface.hxx @@ -126,7 +126,7 @@ public: * Returns 0 if that is not not known/available. */ gcc_pure - virtual time_t GetUpdateStamp() const = 0; + virtual time_t GetUpdateStamp() const noexcept = 0; }; #endif diff --git a/src/db/LightDirectory.hxx b/src/db/LightDirectory.hxx index eca91c41f..be17329a6 100644 --- a/src/db/LightDirectory.hxx +++ b/src/db/LightDirectory.hxx @@ -44,16 +44,16 @@ struct LightDirectory { constexpr LightDirectory(const char *_uri, time_t _mtime) :uri(_uri), mtime(_mtime) {} - static constexpr LightDirectory Root() { + static constexpr LightDirectory Root() noexcept { return LightDirectory("", 0); } - bool IsRoot() const { + bool IsRoot() const noexcept { return *uri == 0; } gcc_pure - const char *GetPath() const { + const char *GetPath() const noexcept { return uri; } }; diff --git a/src/db/PlaylistInfo.hxx b/src/db/PlaylistInfo.hxx index bc43fd62e..eacedac58 100644 --- a/src/db/PlaylistInfo.hxx +++ b/src/db/PlaylistInfo.hxx @@ -45,7 +45,7 @@ struct PlaylistInfo { constexpr CompareName(const char *_name):name(_name) {} gcc_pure - bool operator()(const PlaylistInfo &pi) const { + bool operator()(const PlaylistInfo &pi) const noexcept { return pi.name.compare(name) == 0; } }; diff --git a/src/db/plugins/ProxyDatabasePlugin.cxx b/src/db/plugins/ProxyDatabasePlugin.cxx index 0145c4b4f..13f174024 100644 --- a/src/db/plugins/ProxyDatabasePlugin.cxx +++ b/src/db/plugins/ProxyDatabasePlugin.cxx @@ -127,7 +127,7 @@ public: unsigned Update(const char *uri_utf8, bool discard) override; - time_t GetUpdateStamp() const override { + time_t GetUpdateStamp() const noexcept override { return update_stamp; } diff --git a/src/db/plugins/simple/Directory.hxx b/src/db/plugins/simple/Directory.hxx index cb8ebd530..99572a4b4 100644 --- a/src/db/plugins/simple/Directory.hxx +++ b/src/db/plugins/simple/Directory.hxx @@ -187,7 +187,7 @@ public: } gcc_pure - const char *GetPath() const { + const char *GetPath() const noexcept { return path.c_str(); } diff --git a/src/db/plugins/simple/SimpleDatabasePlugin.hxx b/src/db/plugins/simple/SimpleDatabasePlugin.hxx index 474c2ea21..4336fb58b 100644 --- a/src/db/plugins/simple/SimpleDatabasePlugin.hxx +++ b/src/db/plugins/simple/SimpleDatabasePlugin.hxx @@ -76,7 +76,7 @@ public: const ConfigBlock &block); gcc_pure - Directory &GetRoot() { + Directory &GetRoot() noexcept { assert(root != NULL); return *root; @@ -125,7 +125,7 @@ public: DatabaseStats GetStats(const DatabaseSelection &selection) const override; - time_t GetUpdateStamp() const override { + time_t GetUpdateStamp() const noexcept override { return mtime; } diff --git a/src/db/plugins/upnp/Object.hxx b/src/db/plugins/upnp/Object.hxx index 9f7a42ad3..8a2a4e579 100644 --- a/src/db/plugins/upnp/Object.hxx +++ b/src/db/plugins/upnp/Object.hxx @@ -60,7 +60,7 @@ public: * Parent's ObjectId */ std::string parent_id; - + std::string url; /** @@ -80,7 +80,7 @@ public: UPnPDirObject &operator=(UPnPDirObject &&) = default; - void Clear() { + void Clear() noexcept { id.clear(); parent_id.clear(); url.clear(); @@ -90,7 +90,7 @@ public: } gcc_pure - bool Check() const { + bool Check() const noexcept { return !id.empty() && !parent_id.empty() && !name.empty() && (type != UPnPDirObject::Type::ITEM || item_class != UPnPDirObject::ItemClass::UNKNOWN); diff --git a/src/db/plugins/upnp/UpnpDatabasePlugin.cxx b/src/db/plugins/upnp/UpnpDatabasePlugin.cxx index 4dbfe30c6..c49d8a725 100644 --- a/src/db/plugins/upnp/UpnpDatabasePlugin.cxx +++ b/src/db/plugins/upnp/UpnpDatabasePlugin.cxx @@ -93,7 +93,7 @@ public: DatabaseStats GetStats(const DatabaseSelection &selection) const override; - time_t GetUpdateStamp() const override { + time_t GetUpdateStamp() const noexcept override { return 0; } diff --git a/src/db/update/ExcludeList.cxx b/src/db/update/ExcludeList.cxx index c62e8ee3e..e54999f8c 100644 --- a/src/db/update/ExcludeList.cxx +++ b/src/db/update/ExcludeList.cxx @@ -36,7 +36,7 @@ #include bool -ExcludeList::LoadFile(Path path_fs) +ExcludeList::LoadFile(Path path_fs) noexcept try { #ifdef HAVE_CLASS_GLOB TextFile file(path_fs); @@ -67,7 +67,7 @@ try { } bool -ExcludeList::Check(Path name_fs) const +ExcludeList::Check(Path name_fs) const noexcept { assert(!name_fs.IsNull()); diff --git a/src/db/update/ExcludeList.hxx b/src/db/update/ExcludeList.hxx index c0b287169..793a3a162 100644 --- a/src/db/update/ExcludeList.hxx +++ b/src/db/update/ExcludeList.hxx @@ -50,7 +50,7 @@ public: :parent(&_parent) {} gcc_pure - bool IsEmpty() const { + bool IsEmpty() const noexcept { #ifdef HAVE_CLASS_GLOB return ((parent == nullptr) || parent->IsEmpty()) && patterns.empty(); #else @@ -62,13 +62,13 @@ public: /** * Loads and parses a .mpdignore file. */ - bool LoadFile(Path path_fs); + bool LoadFile(Path path_fs) noexcept; /** * Checks whether one of the patterns in the .mpdignore file matches * the specified file name. */ - bool Check(Path name_fs) const; + bool Check(Path name_fs) const noexcept; }; diff --git a/src/decoder/Bridge.cxx b/src/decoder/Bridge.cxx index c24c80768..37fcb2bf9 100644 --- a/src/decoder/Bridge.cxx +++ b/src/decoder/Bridge.cxx @@ -277,7 +277,7 @@ DecoderBridge::Ready(const AudioFormat audio_format, } DecoderCommand -DecoderBridge::GetCommand() +DecoderBridge::GetCommand() noexcept { return LockGetVirtualCommand(); } @@ -326,7 +326,7 @@ DecoderBridge::CommandFinished() } SongTime -DecoderBridge::GetSeekTime() +DecoderBridge::GetSeekTime() noexcept { assert(dc.pipe != nullptr); @@ -341,7 +341,7 @@ DecoderBridge::GetSeekTime() } uint64_t -DecoderBridge::GetSeekFrame() +DecoderBridge::GetSeekFrame() noexcept { return GetSeekTime().ToScale(dc.in_audio_format.sample_rate); } diff --git a/src/decoder/Bridge.hxx b/src/decoder/Bridge.hxx index 8573d6a7f..3b354c063 100644 --- a/src/decoder/Bridge.hxx +++ b/src/decoder/Bridge.hxx @@ -134,10 +134,10 @@ public: /* virtual methods from DecoderClient */ void Ready(AudioFormat audio_format, bool seekable, SignedSongTime duration) override; - DecoderCommand GetCommand() override; + DecoderCommand GetCommand() noexcept override; void CommandFinished() override; - SongTime GetSeekTime() override; - uint64_t GetSeekFrame() override; + SongTime GetSeekTime() noexcept override; + uint64_t GetSeekFrame() noexcept override; void SeekError() override; InputStreamPtr OpenUri(const char *uri) override; size_t Read(InputStream &is, void *buffer, size_t length) override; diff --git a/src/decoder/Client.hxx b/src/decoder/Client.hxx index 8de82d155..87f19f5be 100644 --- a/src/decoder/Client.hxx +++ b/src/decoder/Client.hxx @@ -58,7 +58,7 @@ public: * command pending */ gcc_pure - virtual DecoderCommand GetCommand() = 0; + virtual DecoderCommand GetCommand() noexcept = 0; /** * Called by the decoder when it has performed the requested command @@ -73,7 +73,7 @@ public: * @return the destination position for the seek in milliseconds */ gcc_pure - virtual SongTime GetSeekTime() = 0; + virtual SongTime GetSeekTime() noexcept = 0; /** * Call this when you have received the DecoderCommand::SEEK command. @@ -81,7 +81,7 @@ public: * @return the destination position for the seek in frames */ gcc_pure - virtual uint64_t GetSeekFrame() = 0; + virtual uint64_t GetSeekFrame() noexcept = 0; /** * Call this instead of CommandFinished() when seeking has diff --git a/src/decoder/DecoderBuffer.hxx b/src/decoder/DecoderBuffer.hxx index c79f8d96c..a7ba2f85f 100644 --- a/src/decoder/DecoderBuffer.hxx +++ b/src/decoder/DecoderBuffer.hxx @@ -54,11 +54,11 @@ public: size_t _size) :client(_client), is(_is), buffer(_size) {} - const InputStream &GetStream() const { + const InputStream &GetStream() const noexcept { return is; } - void Clear() { + void Clear() noexcept { buffer.Clear(); } @@ -75,7 +75,7 @@ public: * How many bytes are stored in the buffer? */ gcc_pure - size_t GetAvailable() const { + size_t GetAvailable() const noexcept { return buffer.GetAvailable(); } @@ -84,7 +84,7 @@ public: * you have to call Consume() to do that. The returned buffer * becomes invalid after a Fill() or a Consume() call. */ - ConstBuffer Read() const { + ConstBuffer Read() const noexcept { auto r = buffer.Read(); return { r.data, r.size }; } @@ -102,7 +102,7 @@ public: * * @param nbytes the number of bytes to consume */ - void Consume(size_t nbytes) { + void Consume(size_t nbytes) noexcept { buffer.Consume(nbytes); } diff --git a/src/decoder/DecoderControl.hxx b/src/decoder/DecoderControl.hxx index fa8fdfd2b..cc858c9a5 100644 --- a/src/decoder/DecoderControl.hxx +++ b/src/decoder/DecoderControl.hxx @@ -227,29 +227,29 @@ struct DecoderControl { } gcc_pure - bool LockIsIdle() const { + bool LockIsIdle() const noexcept { const std::lock_guard protect(mutex); return IsIdle(); } - bool IsStarting() const { + bool IsStarting() const noexcept { return state == DecoderState::START; } gcc_pure - bool LockIsStarting() const { + bool LockIsStarting() const noexcept { const std::lock_guard protect(mutex); return IsStarting(); } - bool HasFailed() const { + bool HasFailed() const noexcept { assert(command == DecoderCommand::NONE); return state == DecoderState::ERROR; } gcc_pure - bool LockHasFailed() const { + bool LockHasFailed() const noexcept { const std::lock_guard protect(mutex); return HasFailed(); } diff --git a/src/decoder/plugins/FlacMetadata.hxx b/src/decoder/plugins/FlacMetadata.hxx index ede627aa1..d0ee8c824 100644 --- a/src/decoder/plugins/FlacMetadata.hxx +++ b/src/decoder/plugins/FlacMetadata.hxx @@ -42,25 +42,27 @@ public: return chain; } - bool Read(const char *path) { + bool Read(const char *path) noexcept { return ::FLAC__metadata_chain_read(chain, path); } - bool Read(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) { + bool Read(FLAC__IOHandle handle, + FLAC__IOCallbacks callbacks) noexcept { return ::FLAC__metadata_chain_read_with_callbacks(chain, handle, callbacks); } - bool Read(InputStream &is) { + bool Read(InputStream &is) noexcept { return Read(::ToFlacIOHandle(is), ::GetFlacIOCallbacks(is)); } - bool ReadOgg(const char *path) { + bool ReadOgg(const char *path) noexcept { return ::FLAC__metadata_chain_read_ogg(chain, path); } - bool ReadOgg(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) { + bool ReadOgg(FLAC__IOHandle handle, + FLAC__IOCallbacks callbacks) noexcept { return ::FLAC__metadata_chain_read_ogg_with_callbacks(chain, handle, callbacks); @@ -71,12 +73,12 @@ public: } gcc_pure - FLAC__Metadata_ChainStatus GetStatus() const { + FLAC__Metadata_ChainStatus GetStatus() const noexcept { return ::FLAC__metadata_chain_status(chain); } gcc_pure - const char *GetStatusString() const { + const char *GetStatusString() const noexcept { return FLAC__Metadata_ChainStatusString[GetStatus()]; } @@ -99,12 +101,12 @@ public: ::FLAC__metadata_iterator_delete(iterator); } - bool Next() { + bool Next() noexcept { return ::FLAC__metadata_iterator_next(iterator); } gcc_pure - FLAC__StreamMetadata *GetBlock() { + FLAC__StreamMetadata *GetBlock() noexcept { return ::FLAC__metadata_iterator_get_block(iterator); } }; diff --git a/src/decoder/plugins/OpusDecoderPlugin.cxx b/src/decoder/plugins/OpusDecoderPlugin.cxx index b526259ff..6c6d39845 100644 --- a/src/decoder/plugins/OpusDecoderPlugin.cxx +++ b/src/decoder/plugins/OpusDecoderPlugin.cxx @@ -52,14 +52,14 @@ static constexpr unsigned opus_output_buffer_frames = opus_sample_rate / 4; gcc_pure static bool -IsOpusHead(const ogg_packet &packet) +IsOpusHead(const ogg_packet &packet) noexcept { return packet.bytes >= 8 && memcmp(packet.packet, "OpusHead", 8) == 0; } gcc_pure static bool -IsOpusTags(const ogg_packet &packet) +IsOpusTags(const ogg_packet &packet) noexcept { return packet.bytes >= 8 && memcmp(packet.packet, "OpusTags", 8) == 0; } diff --git a/src/event/Loop.hxx b/src/event/Loop.hxx index f1962b4df..1060a8769 100644 --- a/src/event/Loop.hxx +++ b/src/event/Loop.hxx @@ -199,7 +199,7 @@ public: * Are we currently running inside this EventLoop's thread? */ gcc_pure - bool IsInside() const { + bool IsInside() const noexcept { assert(!thread.IsNull()); return thread.IsInside(); @@ -207,7 +207,7 @@ public: #ifndef NDEBUG gcc_pure - bool IsInsideOrVirgin() const { + bool IsInsideOrVirgin() const noexcept { return virgin || IsInside(); } #endif @@ -219,7 +219,7 @@ public: * are not yet/anymore handled. */ gcc_pure - bool IsInsideOrNull() const { + bool IsInsideOrNull() const noexcept { return thread.IsNull() || thread.IsInside(); } }; diff --git a/src/fs/AllocatedPath.hxx b/src/fs/AllocatedPath.hxx index 513453ffd..be26ffd78 100644 --- a/src/fs/AllocatedPath.hxx +++ b/src/fs/AllocatedPath.hxx @@ -77,12 +77,12 @@ public: * @see IsNull() */ gcc_const - static AllocatedPath Null() { + static AllocatedPath Null() noexcept { return AllocatedPath(nullptr); } gcc_pure - operator Path() const { + operator Path() const noexcept { return Path::FromFS(c_str()); } @@ -90,36 +90,39 @@ public: * Join two path components with the path separator. */ gcc_pure gcc_nonnull_all - static AllocatedPath Build(const_pointer_type a, const_pointer_type b) { + static AllocatedPath Build(const_pointer_type a, + const_pointer_type b) noexcept { return Build(a, PathTraitsFS::GetLength(a), b, PathTraitsFS::GetLength(b)); } gcc_pure gcc_nonnull_all - static AllocatedPath Build(Path a, const_pointer_type b) { + static AllocatedPath Build(Path a, const_pointer_type b) noexcept { return Build(a.c_str(), b); } gcc_pure gcc_nonnull_all - static AllocatedPath Build(Path a, Path b) { + static AllocatedPath Build(Path a, Path b) noexcept { return Build(a, b.c_str()); } gcc_pure gcc_nonnull_all - static AllocatedPath Build(const_pointer_type a, const AllocatedPath &b) { + static AllocatedPath Build(const_pointer_type a, + const AllocatedPath &b) noexcept { return Build(a, PathTraitsFS::GetLength(a), b.value.c_str(), b.value.size()); } gcc_pure gcc_nonnull_all - static AllocatedPath Build(const AllocatedPath &a, const_pointer_type b) { + static AllocatedPath Build(const AllocatedPath &a, + const_pointer_type b) noexcept { return Build(a.value.c_str(), a.value.size(), b, PathTraitsFS::GetLength(b)); } gcc_pure static AllocatedPath Build(const AllocatedPath &a, - const AllocatedPath &b) { + const AllocatedPath &b) noexcept { return Build(a.value.c_str(), a.value.size(), b.value.c_str(), b.value.size()); } @@ -129,13 +132,13 @@ public: * character set to a #Path instance. */ gcc_pure - static AllocatedPath FromFS(const_pointer_type fs) { + static AllocatedPath FromFS(const_pointer_type fs) noexcept { return AllocatedPath(fs); } gcc_pure static AllocatedPath FromFS(const_pointer_type _begin, - const_pointer_type _end) { + const_pointer_type _end) noexcept { return AllocatedPath(_begin, _end); } @@ -144,7 +147,7 @@ public: * character set to a #Path instance. */ gcc_pure - static AllocatedPath FromFS(string &&fs) { + static AllocatedPath FromFS(string &&fs) noexcept { return AllocatedPath(std::move(fs)); } @@ -176,12 +179,12 @@ public: } gcc_pure - bool operator==(const AllocatedPath &other) const { + bool operator==(const AllocatedPath &other) const noexcept { return value == other.value; } gcc_pure - bool operator!=(const AllocatedPath &other) const { + bool operator!=(const AllocatedPath &other) const noexcept { return value != other.value; } @@ -197,7 +200,7 @@ public: * Check if this is a "nulled" instance. A "nulled" instance * must not be used. */ - bool IsNull() const { + bool IsNull() const noexcept { return value.empty(); } @@ -206,7 +209,7 @@ public: * * @see IsNull() */ - void SetNull() { + void SetNull() noexcept { value.clear(); } @@ -215,7 +218,7 @@ public: * elements (which may not be the number of characters). */ gcc_pure - size_t length() const { + size_t length() const noexcept { return value.length(); } @@ -225,7 +228,7 @@ public: * instance ends. */ gcc_pure - const_pointer_type c_str() const { + const_pointer_type c_str() const noexcept { return value.c_str(); } @@ -234,7 +237,7 @@ public: * null-terminated. */ gcc_pure - const_pointer_type data() const { + const_pointer_type data() const noexcept { return value.data(); } diff --git a/src/fs/Glob.hxx b/src/fs/Glob.hxx index 714eaa753..1f8402089 100644 --- a/src/fs/Glob.hxx +++ b/src/fs/Glob.hxx @@ -54,7 +54,7 @@ public: #endif gcc_pure - bool Check(const char *name_fs) const { + bool Check(const char *name_fs) const noexcept { #ifdef HAVE_FNMATCH return fnmatch(pattern.c_str(), name_fs, 0) == 0; #elif defined(WIN32) diff --git a/src/fs/Path.hxx b/src/fs/Path.hxx index 5053162ef..8e3eefb09 100644 --- a/src/fs/Path.hxx +++ b/src/fs/Path.hxx @@ -92,7 +92,7 @@ public: * elements (which may not be the number of characters). */ gcc_pure - size_t length() const { + size_t length() const noexcept { assert(!IsNull()); return PathTraitsFS::GetLength(c_str()); @@ -104,7 +104,7 @@ public: * instance ends. */ gcc_pure - const_pointer_type c_str() const { + const_pointer_type c_str() const noexcept { return Base::c_str(); } @@ -113,7 +113,7 @@ public: * null-terminated. */ gcc_pure - const_pointer_type data() const { + const_pointer_type data() const noexcept { return c_str(); } diff --git a/src/fs/Traits.hxx b/src/fs/Traits.hxx index 699ab73e8..67f74dc57 100644 --- a/src/fs/Traits.hxx +++ b/src/fs/Traits.hxx @@ -63,7 +63,7 @@ struct PathTraitsFS { static constexpr const_pointer_type CURRENT_DIRECTORY = PATH_LITERAL("."); - static constexpr bool IsSeparator(value_type ch) { + static constexpr bool IsSeparator(value_type ch) noexcept { return #ifdef WIN32 ch == '/' || @@ -72,7 +72,7 @@ struct PathTraitsFS { } gcc_pure gcc_nonnull_all - static const_pointer_type FindLastSeparator(const_pointer_type p) { + static const_pointer_type FindLastSeparator(const_pointer_type p) noexcept { #if !CLANG_CHECK_VERSION(3,6) /* disabled on clang due to -Wtautological-pointer-compare */ assert(p != nullptr); @@ -90,13 +90,13 @@ struct PathTraitsFS { #ifdef WIN32 gcc_pure gcc_nonnull_all - static constexpr bool IsDrive(const_pointer_type p) { + static constexpr bool IsDrive(const_pointer_type p) noexcept { return IsAlphaASCII(p[0]) && p[1] == ':'; } #endif gcc_pure gcc_nonnull_all - static bool IsAbsolute(const_pointer_type p) { + static bool IsAbsolute(const_pointer_type p) noexcept { #if !CLANG_CHECK_VERSION(3,6) /* disabled on clang due to -Wtautological-pointer-compare */ assert(p != nullptr); @@ -110,12 +110,12 @@ struct PathTraitsFS { } gcc_pure gcc_nonnull_all - static size_t GetLength(const_pointer_type p) { + static size_t GetLength(const_pointer_type p) noexcept { return StringLength(p); } gcc_pure gcc_nonnull_all - static const_pointer_type Find(const_pointer_type p, value_type ch) { + static const_pointer_type Find(const_pointer_type p, value_type ch) noexcept { return StringFind(p, ch); } @@ -179,7 +179,7 @@ struct PathTraitsUTF8 { } gcc_pure gcc_nonnull_all - static const_pointer_type FindLastSeparator(const_pointer_type p) { + static const_pointer_type FindLastSeparator(const_pointer_type p) noexcept { #if !CLANG_CHECK_VERSION(3,6) /* disabled on clang due to -Wtautological-pointer-compare */ assert(p != nullptr); @@ -190,13 +190,13 @@ struct PathTraitsUTF8 { #ifdef WIN32 gcc_pure gcc_nonnull_all - static constexpr bool IsDrive(const_pointer_type p) { + static constexpr bool IsDrive(const_pointer_type p) noexcept { return IsAlphaASCII(p[0]) && p[1] == ':'; } #endif gcc_pure gcc_nonnull_all - static bool IsAbsolute(const_pointer_type p) { + static bool IsAbsolute(const_pointer_type p) noexcept { #if !CLANG_CHECK_VERSION(3,6) /* disabled on clang due to -Wtautological-pointer-compare */ assert(p != nullptr); @@ -210,12 +210,12 @@ struct PathTraitsUTF8 { } gcc_pure gcc_nonnull_all - static size_t GetLength(const_pointer_type p) { + static size_t GetLength(const_pointer_type p) noexcept { return StringLength(p); } gcc_pure gcc_nonnull_all - static const_pointer_type Find(const_pointer_type p, value_type ch) { + static const_pointer_type Find(const_pointer_type p, value_type ch) noexcept { return StringFind(p, ch); } @@ -255,7 +255,7 @@ struct PathTraitsUTF8 { const_pointer_type b, size_t b_size) noexcept; gcc_pure gcc_nonnull_all - static string Build(const_pointer_type a, const_pointer_type b) { + static string Build(const_pointer_type a, const_pointer_type b) noexcept { return Build(a, GetLength(a), b, GetLength(b)); } }; diff --git a/src/fs/io/BufferedReader.cxx b/src/fs/io/BufferedReader.cxx index 4999965a6..f3095ca93 100644 --- a/src/fs/io/BufferedReader.cxx +++ b/src/fs/io/BufferedReader.cxx @@ -67,7 +67,7 @@ BufferedReader::ReadFull(size_t size) } size_t -BufferedReader::ReadFromBuffer(WritableBuffer dest) +BufferedReader::ReadFromBuffer(WritableBuffer dest) noexcept { auto src = Read(); size_t nbytes = std::min(src.size, dest.size); diff --git a/src/fs/io/BufferedReader.hxx b/src/fs/io/BufferedReader.hxx index 0e1b4a5b7..c4c6da80f 100644 --- a/src/fs/io/BufferedReader.hxx +++ b/src/fs/io/BufferedReader.hxx @@ -47,7 +47,7 @@ public: * Reset the internal state. Should be called after rewinding * the underlying #Reader. */ - void Reset() { + void Reset() noexcept { buffer.Clear(); eof = false; line_number = 0; @@ -56,7 +56,7 @@ public: bool Fill(bool need_more); gcc_pure - WritableBuffer Read() const { + WritableBuffer Read() const noexcept { return buffer.Read().ToVoid(); } @@ -67,7 +67,7 @@ public: */ void *ReadFull(size_t size); - void Consume(size_t n) { + void Consume(size_t n) noexcept { buffer.Consume(n); } @@ -75,7 +75,7 @@ public: * Read (and consume) data from the input buffer into the * given buffer. Does not attempt to refill the buffer. */ - size_t ReadFromBuffer(WritableBuffer dest); + size_t ReadFromBuffer(WritableBuffer dest) noexcept; /** * Read data into the given buffer and consume it from our @@ -86,7 +86,7 @@ public: char *ReadLine(); - unsigned GetLineNumber() const { + unsigned GetLineNumber() const noexcept { return line_number; } }; diff --git a/src/input/AsyncInputStream.cxx b/src/input/AsyncInputStream.cxx index 52621019c..f6e510a1e 100644 --- a/src/input/AsyncInputStream.cxx +++ b/src/input/AsyncInputStream.cxx @@ -52,14 +52,14 @@ AsyncInputStream::~AsyncInputStream() } void -AsyncInputStream::SetTag(Tag *_tag) +AsyncInputStream::SetTag(Tag *_tag) noexcept { delete tag; tag = _tag; } void -AsyncInputStream::Pause() +AsyncInputStream::Pause() noexcept { assert(io_thread_inside()); @@ -141,7 +141,7 @@ AsyncInputStream::Seek(offset_type new_offset) } void -AsyncInputStream::SeekDone() +AsyncInputStream::SeekDone() noexcept { assert(io_thread_inside()); assert(IsSeekPending()); @@ -201,7 +201,7 @@ AsyncInputStream::Read(void *ptr, size_t read_size) } void -AsyncInputStream::CommitWriteBuffer(size_t nbytes) +AsyncInputStream::CommitWriteBuffer(size_t nbytes) noexcept { buffer.Append(nbytes); @@ -212,7 +212,7 @@ AsyncInputStream::CommitWriteBuffer(size_t nbytes) } void -AsyncInputStream::AppendToBuffer(const void *data, size_t append_size) +AsyncInputStream::AppendToBuffer(const void *data, size_t append_size) noexcept { auto w = buffer.Write(); assert(!w.IsEmpty()); @@ -238,7 +238,7 @@ AsyncInputStream::AppendToBuffer(const void *data, size_t append_size) } void -AsyncInputStream::DeferredResume() +AsyncInputStream::DeferredResume() noexcept { const std::lock_guard protect(mutex); @@ -251,7 +251,7 @@ AsyncInputStream::DeferredResume() } void -AsyncInputStream::DeferredSeek() +AsyncInputStream::DeferredSeek() noexcept { const std::lock_guard protect(mutex); if (seek_state != SeekState::SCHEDULED) diff --git a/src/input/AsyncInputStream.hxx b/src/input/AsyncInputStream.hxx index 3a0b00580..18c4702e8 100644 --- a/src/input/AsyncInputStream.hxx +++ b/src/input/AsyncInputStream.hxx @@ -92,15 +92,15 @@ protected: /** * Pass an tag from the I/O thread to the client thread. */ - void SetTag(Tag *_tag); + void SetTag(Tag *_tag) noexcept; - void ClearTag() { + void ClearTag() noexcept { SetTag(nullptr); } - void Pause(); + void Pause() noexcept; - bool IsPaused() const { + bool IsPaused() const noexcept { return paused; } @@ -109,15 +109,15 @@ protected: * continue feeding Read() calls from the buffer until it runs * empty. */ - void SetClosed() { + void SetClosed() noexcept { open = false; } - bool IsBufferEmpty() const { + bool IsBufferEmpty() const noexcept { return buffer.IsEmpty(); } - bool IsBufferFull() const { + bool IsBufferFull() const noexcept { return buffer.IsFull(); } @@ -125,21 +125,21 @@ protected: * Determine how many bytes can be added to the buffer. */ gcc_pure - size_t GetBufferSpace() const { + size_t GetBufferSpace() const noexcept { return buffer.GetSpace(); } - CircularBuffer::Range PrepareWriteBuffer() { + CircularBuffer::Range PrepareWriteBuffer() noexcept { return buffer.Write(); } - void CommitWriteBuffer(size_t nbytes); + void CommitWriteBuffer(size_t nbytes) noexcept; /** * Append data to the buffer. The size must fit into the * buffer; see GetBufferSpace(). */ - void AppendToBuffer(const void *data, size_t append_size); + void AppendToBuffer(const void *data, size_t append_size) noexcept; /** * Implement code here that will resume the stream after it @@ -154,7 +154,7 @@ protected: */ virtual void DoSeek(offset_type new_offset) = 0; - bool IsSeekPending() const { + bool IsSeekPending() const noexcept { return seek_state == SeekState::PENDING; } @@ -162,14 +162,14 @@ protected: * Call this after seeking has finished. It will notify the * client thread. */ - void SeekDone(); + void SeekDone() noexcept; private: void Resume(); /* for DeferredCall */ - void DeferredResume(); - void DeferredSeek(); + void DeferredResume() noexcept; + void DeferredSeek() noexcept; }; #endif diff --git a/src/input/InputStream.hxx b/src/input/InputStream.hxx index 86f19f094..b5237ee4b 100644 --- a/src/input/InputStream.hxx +++ b/src/input/InputStream.hxx @@ -184,20 +184,20 @@ public: void LockWaitReady(); gcc_pure - bool HasMimeType() const { + bool HasMimeType() const noexcept { assert(ready); return !mime.empty(); } gcc_pure - const char *GetMimeType() const { + const char *GetMimeType() const noexcept { assert(ready); return mime.empty() ? nullptr : mime.c_str(); } - void ClearMimeType() { + void ClearMimeType() noexcept { mime.clear(); } @@ -215,35 +215,35 @@ public: } gcc_pure - bool KnownSize() const { + bool KnownSize() const noexcept { assert(ready); return size != UNKNOWN_SIZE; } gcc_pure - offset_type GetSize() const { + offset_type GetSize() const noexcept { assert(ready); assert(KnownSize()); return size; } - void AddOffset(offset_type delta) { + void AddOffset(offset_type delta) noexcept { assert(ready); offset += delta; } gcc_pure - offset_type GetOffset() const { + offset_type GetOffset() const noexcept { assert(ready); return offset; } gcc_pure - offset_type GetRest() const { + offset_type GetRest() const noexcept { assert(ready); assert(KnownSize()); @@ -251,7 +251,7 @@ public: } gcc_pure - bool IsSeekable() const { + bool IsSeekable() const noexcept { assert(ready); return seekable; diff --git a/src/lib/curl/Global.cxx b/src/lib/curl/Global.cxx index 12a8f638a..7c233743e 100644 --- a/src/lib/curl/Global.cxx +++ b/src/lib/curl/Global.cxx @@ -63,7 +63,7 @@ public: */ static int SocketFunction(CURL *easy, curl_socket_t s, int action, - void *userp, void *socketp); + void *userp, void *socketp) noexcept; virtual bool OnSocketReady(unsigned flags) override; @@ -75,7 +75,7 @@ private: } gcc_const - static unsigned CurlPollToFlags(int action) { + static unsigned CurlPollToFlags(int action) noexcept { switch (action) { case CURL_POLL_NONE: return 0; @@ -108,7 +108,7 @@ CurlGlobal::CurlGlobal(EventLoop &_loop) int CurlSocket::SocketFunction(gcc_unused CURL *easy, curl_socket_t s, int action, - void *userp, void *socketp) { + void *userp, void *socketp) noexcept { auto &global = *(CurlGlobal *)userp; CurlSocket *cs = (CurlSocket *)socketp; diff --git a/src/lib/nfs/Connection.hxx b/src/lib/nfs/Connection.hxx index a752535e0..2374c47ca 100644 --- a/src/lib/nfs/Connection.hxx +++ b/src/lib/nfs/Connection.hxx @@ -147,16 +147,16 @@ public: ~NfsConnection(); gcc_pure - const char *GetServer() const { + const char *GetServer() const noexcept { return server.c_str(); } gcc_pure - const char *GetExportName() const { + const char *GetExportName() const noexcept { return export_name.c_str(); } - EventLoop &GetEventLoop() { + EventLoop &GetEventLoop() noexcept { return SocketMonitor::GetEventLoop(); } diff --git a/src/lib/upnp/ContentDirectoryService.hxx b/src/lib/upnp/ContentDirectoryService.hxx index 198d104c5..78d7dffca 100644 --- a/src/lib/upnp/ContentDirectoryService.hxx +++ b/src/lib/upnp/ContentDirectoryService.hxx @@ -114,12 +114,12 @@ public: std::list getSearchCapabilities(UpnpClient_Handle handle) const; gcc_pure - std::string GetURI() const { + std::string GetURI() const noexcept { return "upnp://" + m_deviceId + "/" + m_serviceType; } /** Retrieve the "friendly name" for this server, useful for display. */ - const char *getFriendlyName() const { + const char *getFriendlyName() const noexcept { return m_friendlyName.c_str(); } }; diff --git a/src/neighbor/plugins/SmbclientNeighborPlugin.cxx b/src/neighbor/plugins/SmbclientNeighborPlugin.cxx index 3b5bcba50..0b831a3c0 100644 --- a/src/neighbor/plugins/SmbclientNeighborPlugin.cxx +++ b/src/neighbor/plugins/SmbclientNeighborPlugin.cxx @@ -48,12 +48,12 @@ class SmbclientNeighborExplorer final : public NeighborExplorer { Server(const Server &) = delete; gcc_pure - bool operator==(const Server &other) const { + bool operator==(const Server &other) const noexcept { return name == other.name; } gcc_pure - NeighborInfo Export() const { + NeighborInfo Export() const noexcept { return { "smb://" + name + "/", comment }; } }; diff --git a/src/neighbor/plugins/UpnpNeighborPlugin.cxx b/src/neighbor/plugins/UpnpNeighborPlugin.cxx index a0ce36817..34e14514f 100644 --- a/src/neighbor/plugins/UpnpNeighborPlugin.cxx +++ b/src/neighbor/plugins/UpnpNeighborPlugin.cxx @@ -43,12 +43,12 @@ class UpnpNeighborExplorer final Server(const Server &) = delete; gcc_pure - bool operator==(const Server &other) const { + bool operator==(const Server &other) const noexcept { return name == other.name; } gcc_pure - NeighborInfo Export() const { + NeighborInfo Export() const noexcept { return { "smb://" + name + "/", comment }; } }; diff --git a/src/net/AllocatedSocketAddress.hxx b/src/net/AllocatedSocketAddress.hxx index 15aafd7d1..6491fb9c0 100644 --- a/src/net/AllocatedSocketAddress.hxx +++ b/src/net/AllocatedSocketAddress.hxx @@ -76,47 +76,47 @@ public: AllocatedSocketAddress &operator=(const AllocatedSocketAddress &) = delete; - AllocatedSocketAddress &operator=(AllocatedSocketAddress &&src) { + AllocatedSocketAddress &operator=(AllocatedSocketAddress &&src) noexcept { std::swap(address, src.address); std::swap(size, src.size); return *this; } gcc_pure - bool operator==(SocketAddress other) const { + bool operator==(SocketAddress other) const noexcept { return (SocketAddress)*this == other; } - bool operator!=(SocketAddress &other) const { + bool operator!=(SocketAddress &other) const noexcept { return !(*this == other); } gcc_const - static AllocatedSocketAddress Null() { + static AllocatedSocketAddress Null() noexcept { return AllocatedSocketAddress(nullptr, 0); } - bool IsNull() const { + bool IsNull() const noexcept { return address == nullptr; } - size_type GetSize() const { + size_type GetSize() const noexcept { return size; } - const struct sockaddr *GetAddress() const { + const struct sockaddr *GetAddress() const noexcept { return address; } - operator SocketAddress() const { + operator SocketAddress() const noexcept { return SocketAddress(address, size); } - operator const struct sockaddr *() const { + operator const struct sockaddr *() const noexcept { return address; } - int GetFamily() const { + int GetFamily() const noexcept { return address->sa_family; } @@ -124,11 +124,11 @@ public: * Does the object have a well-defined address? Check !IsNull() * before calling this method. */ - bool IsDefined() const { + bool IsDefined() const noexcept { return GetFamily() != AF_UNSPEC; } - void Clear() { + void Clear() noexcept { free(address); address = nullptr; size = 0; diff --git a/src/net/StaticSocketAddress.hxx b/src/net/StaticSocketAddress.hxx index d2da90d2f..3b996ab88 100644 --- a/src/net/StaticSocketAddress.hxx +++ b/src/net/StaticSocketAddress.hxx @@ -51,52 +51,52 @@ public: StaticSocketAddress &operator=(SocketAddress other) noexcept; - operator SocketAddress() const { + operator SocketAddress() const noexcept { return SocketAddress(reinterpret_cast(&address), size); } - struct sockaddr *GetAddress() { + struct sockaddr *GetAddress() noexcept { return reinterpret_cast(&address); } - const struct sockaddr *GetAddress() const { + const struct sockaddr *GetAddress() const noexcept { return reinterpret_cast(&address); } - constexpr size_type GetCapacity() const { + constexpr size_type GetCapacity() const noexcept { return sizeof(address); } - size_type GetSize() const { + size_type GetSize() const noexcept { return size; } - void SetSize(size_type _size) { + void SetSize(size_type _size) noexcept { assert(_size > 0); assert(size_t(_size) <= sizeof(address)); size = _size; } - int GetFamily() const { + int GetFamily() const noexcept { return address.ss_family; } - bool IsDefined() const { + bool IsDefined() const noexcept { return GetFamily() != AF_UNSPEC; } - void Clear() { + void Clear() noexcept { address.ss_family = AF_UNSPEC; } gcc_pure - bool operator==(SocketAddress other) const { + bool operator==(SocketAddress other) const noexcept { return (SocketAddress)*this == other; } - bool operator!=(SocketAddress &other) const { + bool operator!=(SocketAddress &other) const noexcept { return !(*this == other); } }; diff --git a/src/output/MultipleOutputs.hxx b/src/output/MultipleOutputs.hxx index 014978882..0ae8acbab 100644 --- a/src/output/MultipleOutputs.hxx +++ b/src/output/MultipleOutputs.hxx @@ -85,7 +85,7 @@ public: * those which are disabled right now. */ gcc_pure - unsigned Size() const { + unsigned Size() const noexcept { return outputs.size(); } @@ -186,7 +186,7 @@ public: * finished yet. */ gcc_pure - SignedSongTime GetElapsedTime() const { + SignedSongTime GetElapsedTime() const noexcept { return elapsed_time; } diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 5361f6431..cb243c406 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -132,7 +132,7 @@ public: } gcc_pure - const char *GetDevice() { + const char *GetDevice() const noexcept { return device.empty() ? default_device : device.c_str(); } diff --git a/src/output/plugins/OpenALOutputPlugin.cxx b/src/output/plugins/OpenALOutputPlugin.cxx index 508643112..65cefd33c 100644 --- a/src/output/plugins/OpenALOutputPlugin.cxx +++ b/src/output/plugins/OpenALOutputPlugin.cxx @@ -73,19 +73,19 @@ class OpenALOutput { private: gcc_pure - ALint GetSourceI(ALenum param) const { + ALint GetSourceI(ALenum param) const noexcept { ALint value; alGetSourcei(source, param, &value); return value; } gcc_pure - bool HasProcessed() const { + bool HasProcessed() const noexcept { return GetSourceI(AL_BUFFERS_PROCESSED) > 0; } gcc_pure - bool IsPlaying() const { + bool IsPlaying() const noexcept { return GetSourceI(AL_SOURCE_STATE) == AL_PLAYING; } diff --git a/src/output/plugins/RecorderOutputPlugin.cxx b/src/output/plugins/RecorderOutputPlugin.cxx index a934e3bfe..b615d85f2 100644 --- a/src/output/plugins/RecorderOutputPlugin.cxx +++ b/src/output/plugins/RecorderOutputPlugin.cxx @@ -97,7 +97,7 @@ class RecorderOutput { private: gcc_pure - bool HasDynamicPath() const { + bool HasDynamicPath() const noexcept { return !format_path.empty(); } diff --git a/src/output/plugins/httpd/HttpdInternal.hxx b/src/output/plugins/httpd/HttpdInternal.hxx index 331e83fc1..675f3d54e 100644 --- a/src/output/plugins/httpd/HttpdInternal.hxx +++ b/src/output/plugins/httpd/HttpdInternal.hxx @@ -191,7 +191,7 @@ public: * Caller must lock the mutex. */ gcc_pure - bool HasClients() const { + bool HasClients() const noexcept { return !clients.empty(); } @@ -199,7 +199,7 @@ public: * Check whether there is at least one client. */ gcc_pure - bool LockHasClients() const { + bool LockHasClients() const noexcept { const std::lock_guard protect(mutex); return HasClients(); } diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx index 3e7ef8f90..4cbe1653b 100644 --- a/src/player/Thread.cxx +++ b/src/player/Thread.cxx @@ -247,7 +247,7 @@ private: * finished. */ gcc_pure - bool IsDecoderAtCurrentSong() const { + bool IsDecoderAtCurrentSong() const noexcept { assert(pipe != nullptr); return dc.pipe == pipe; @@ -259,7 +259,7 @@ private: * switched to that song yet. */ gcc_pure - bool IsDecoderAtNextSong() const { + bool IsDecoderAtNextSong() const noexcept { return dc.pipe != nullptr && !IsDecoderAtCurrentSong(); } diff --git a/src/queue/Queue.hxx b/src/queue/Queue.hxx index 805c2f4de..bd2f95c1a 100644 --- a/src/queue/Queue.hxx +++ b/src/queue/Queue.hxx @@ -162,14 +162,14 @@ struct Queue { } gcc_pure - unsigned OrderToPosition(unsigned _order) const { + unsigned OrderToPosition(unsigned _order) const noexcept { assert(_order < length); return order[_order]; } gcc_pure - unsigned PositionToOrder(unsigned position) const { + unsigned PositionToOrder(unsigned position) const noexcept { assert(position < length); for (unsigned i = 0;; ++i) { @@ -181,7 +181,7 @@ struct Queue { } gcc_pure - uint8_t GetPriorityAtPosition(unsigned position) const { + uint8_t GetPriorityAtPosition(unsigned position) const noexcept { assert(position < length); return items[position].priority; diff --git a/src/storage/CompositeStorage.cxx b/src/storage/CompositeStorage.cxx index cd3a702bf..7c6c87b17 100644 --- a/src/storage/CompositeStorage.cxx +++ b/src/storage/CompositeStorage.cxx @@ -149,7 +149,7 @@ CompositeStorage::Directory::Make(const char *uri) } bool -CompositeStorage::Directory::Unmount() +CompositeStorage::Directory::Unmount() noexcept { if (storage == nullptr) return false; @@ -160,7 +160,7 @@ CompositeStorage::Directory::Unmount() } bool -CompositeStorage::Directory::Unmount(const char *uri) +CompositeStorage::Directory::Unmount(const char *uri) noexcept { if (StringIsEmpty(uri)) return Unmount(); diff --git a/src/storage/CompositeStorage.hxx b/src/storage/CompositeStorage.hxx index db71fad8f..668d55a6a 100644 --- a/src/storage/CompositeStorage.hxx +++ b/src/storage/CompositeStorage.hxx @@ -55,7 +55,7 @@ class CompositeStorage final : public Storage { ~Directory(); gcc_pure - bool IsEmpty() const { + bool IsEmpty() const noexcept { return storage == nullptr && children.empty(); } @@ -64,8 +64,8 @@ class CompositeStorage final : public Storage { Directory &Make(const char *uri); - bool Unmount(); - bool Unmount(const char *uri); + bool Unmount() noexcept; + bool Unmount(const char *uri) noexcept; gcc_pure bool MapToRelativeUTF8(std::string &buffer, diff --git a/src/storage/plugins/CurlStorage.cxx b/src/storage/plugins/CurlStorage.cxx index 8dd736dad..d4177e4a3 100644 --- a/src/storage/plugins/CurlStorage.cxx +++ b/src/storage/plugins/CurlStorage.cxx @@ -511,7 +511,7 @@ private: * to the base file name. */ gcc_pure - StringView HrefToEscapedName(const char *href) const { + StringView HrefToEscapedName(const char *href) const noexcept { const char *path = uri_get_path(href); if (path == nullptr) return nullptr; diff --git a/src/tag/MixRamp.cxx b/src/tag/MixRamp.cxx index f5597794f..a8eab0bef 100644 --- a/src/tag/MixRamp.cxx +++ b/src/tag/MixRamp.cxx @@ -53,7 +53,7 @@ ParseMixRampTag(MixRampInfo &info, const char *name, const char *value) const char *value; gcc_pure - const char *operator[](const char *n) const { + const char *operator[](const char *n) const noexcept { return StringEqualsCaseASCII(name, n) ? value : nullptr; @@ -70,7 +70,7 @@ ParseMixRampVorbis(MixRampInfo &info, const char *entry) const char *entry; gcc_pure - const char *operator[](const char *n) const { + const char *operator[](const char *n) const noexcept { return vorbis_comment_value(entry, n); } }; diff --git a/src/tag/ReplayGain.cxx b/src/tag/ReplayGain.cxx index 963469373..10f2f8a32 100644 --- a/src/tag/ReplayGain.cxx +++ b/src/tag/ReplayGain.cxx @@ -60,7 +60,7 @@ ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value) const char *value; gcc_pure - const char *operator[](const char *n) const { + const char *operator[](const char *n) const noexcept { return StringEqualsCaseASCII(name, n) ? value : nullptr; @@ -77,7 +77,7 @@ ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry) const char *entry; gcc_pure - const char *operator[](const char *n) const { + const char *operator[](const char *n) const noexcept { return vorbis_comment_value(entry, n); } }; diff --git a/src/tag/Set.cxx b/src/tag/Set.cxx index 8becc4cf8..34e823c89 100644 --- a/src/tag/Set.cxx +++ b/src/tag/Set.cxx @@ -67,7 +67,7 @@ CopyTagMask(TagBuilder &dest, const Tag &src, tag_mask_t mask) void TagSet::InsertUnique(const Tag &src, TagType type, const char *value, - tag_mask_t group_mask) + tag_mask_t group_mask) noexcept { TagBuilder builder; if (value == nullptr) @@ -85,7 +85,7 @@ TagSet::InsertUnique(const Tag &src, TagType type, const char *value, bool TagSet::CheckUnique(TagType dest_type, const Tag &tag, TagType src_type, - tag_mask_t group_mask) + tag_mask_t group_mask) noexcept { bool found = false; @@ -101,7 +101,7 @@ TagSet::CheckUnique(TagType dest_type, void TagSet::InsertUnique(const Tag &tag, - TagType type, tag_mask_t group_mask) + TagType type, tag_mask_t group_mask) noexcept { static_assert(sizeof(group_mask) * 8 >= TAG_NUM_OF_ITEM_TYPES, "Mask is too small"); diff --git a/src/tag/Set.hxx b/src/tag/Set.hxx index c07c736e7..8e19b7ca2 100644 --- a/src/tag/Set.hxx +++ b/src/tag/Set.hxx @@ -33,7 +33,7 @@ */ struct TagLess { gcc_pure - bool operator()(const Tag &a, const Tag &b) const { + bool operator()(const Tag &a, const Tag &b) const noexcept { if (a.num_items != b.num_items) return a.num_items < b.num_items; @@ -59,15 +59,15 @@ struct TagLess { class TagSet : public std::set { public: void InsertUnique(const Tag &tag, - TagType type, tag_mask_t group_mask); + TagType type, tag_mask_t group_mask) noexcept; private: void InsertUnique(const Tag &src, TagType type, const char *value, - tag_mask_t group_mask); + tag_mask_t group_mask) noexcept; bool CheckUnique(TagType dest_type, const Tag &tag, TagType src_type, - tag_mask_t group_mask); + tag_mask_t group_mask) noexcept; }; #endif diff --git a/src/tag/TagBuilder.hxx b/src/tag/TagBuilder.hxx index 2ec1ae876..b69d23689 100644 --- a/src/tag/TagBuilder.hxx +++ b/src/tag/TagBuilder.hxx @@ -82,7 +82,7 @@ public: * Returns true if the object contains any information. */ gcc_pure - bool IsDefined() const { + bool IsDefined() const noexcept { return !duration.IsNegative() || has_playlist || !IsEmpty(); } diff --git a/src/thread/Id.hxx b/src/thread/Id.hxx index 169cb1af8..4b0b9109e 100644 --- a/src/thread/Id.hxx +++ b/src/thread/Id.hxx @@ -53,7 +53,7 @@ public: #endif gcc_const - static ThreadId Null() { + static ThreadId Null() noexcept { #ifdef WIN32 return 0; #else @@ -63,7 +63,7 @@ public: } gcc_pure - bool IsNull() const { + bool IsNull() const noexcept { return *this == Null(); } @@ -80,7 +80,7 @@ public: } gcc_pure - bool operator==(const ThreadId &other) const { + bool operator==(const ThreadId &other) const noexcept { #ifdef WIN32 return id == other.id; #else diff --git a/src/thread/Thread.hxx b/src/thread/Thread.hxx index a699ba09c..99ad4da9d 100644 --- a/src/thread/Thread.hxx +++ b/src/thread/Thread.hxx @@ -77,7 +77,7 @@ public: * Check if this thread is the current thread. */ gcc_pure - bool IsInside() const { + bool IsInside() const noexcept { #ifdef WIN32 return GetCurrentThreadId() == id; #else diff --git a/src/util/ConstBuffer.hxx b/src/util/ConstBuffer.hxx index 67d7253d8..4f4901564 100644 --- a/src/util/ConstBuffer.hxx +++ b/src/util/ConstBuffer.hxx @@ -140,7 +140,7 @@ struct ConstBuffer { template gcc_pure - bool Contains(U &&u) const { + bool Contains(U &&u) const noexcept { for (const auto &i : *this) if (u == i) return true; diff --git a/src/util/StringView.cxx b/src/util/StringView.cxx index b1abf9615..7e77e5459 100644 --- a/src/util/StringView.cxx +++ b/src/util/StringView.cxx @@ -31,14 +31,14 @@ #include "CharUtil.hxx" void -StringView::StripLeft() +StringView::StripLeft() noexcept { while (!IsEmpty() && IsWhitespaceOrNull(front())) pop_front(); } void -StringView::StripRight() +StringView::StripRight() noexcept { while (!IsEmpty() && IsWhitespaceOrNull(back())) pop_back(); diff --git a/src/util/StringView.hxx b/src/util/StringView.hxx index dce93d388..ee304b6ac 100644 --- a/src/util/StringView.hxx +++ b/src/util/StringView.hxx @@ -64,67 +64,67 @@ struct StringView : ConstBuffer { return StringView("", size_t(0)); } - void SetEmpty() { + void SetEmpty() noexcept { data = ""; size = 0; } gcc_pure - pointer_type Find(char ch) const { + pointer_type Find(char ch) const noexcept { return (pointer_type)memchr(data, ch, size); } - StringView &operator=(std::nullptr_t) { + StringView &operator=(std::nullptr_t) noexcept { data = nullptr; size = 0; return *this; } - StringView &operator=(pointer_type _data) { + StringView &operator=(pointer_type _data) noexcept { data = _data; size = _data != nullptr ? strlen(_data) : 0; return *this; } gcc_pure - bool StartsWith(StringView needle) const { + bool StartsWith(StringView needle) const noexcept { return size >= needle.size && memcmp(data, needle.data, needle.size) == 0; } gcc_pure - bool Equals(StringView other) const { + bool Equals(StringView other) const noexcept { return size == other.size && memcmp(data, other.data, size) == 0; } template - bool EqualsLiteral(const char (&other)[n]) const { + bool EqualsLiteral(const char (&other)[n]) const noexcept { return Equals(Literal(other)); } gcc_pure - bool EqualsIgnoreCase(StringView other) const { + bool EqualsIgnoreCase(StringView other) const noexcept { return size == other.size && strncasecmp(data, other.data, size) == 0; } template - bool EqualsLiteralIgnoreCase(const char (&other)[n]) const { + bool EqualsLiteralIgnoreCase(const char (&other)[n]) const noexcept { return EqualsIgnoreCase(Literal(other)); } /** * Skip all whitespace at the beginning. */ - void StripLeft(); + void StripLeft() noexcept; /** * Skip all whitespace at the end. */ - void StripRight(); + void StripRight() noexcept; - void Strip() { + void Strip() noexcept { StripLeft(); StripRight(); } diff --git a/test/FakeDecoderAPI.cxx b/test/FakeDecoderAPI.cxx index 2310c335c..ce915ba1e 100644 --- a/test/FakeDecoderAPI.cxx +++ b/test/FakeDecoderAPI.cxx @@ -45,7 +45,7 @@ FakeDecoder::Ready(const AudioFormat audio_format, } DecoderCommand -FakeDecoder::GetCommand() +FakeDecoder::GetCommand() noexcept { return DecoderCommand::NONE; } @@ -56,13 +56,13 @@ FakeDecoder::CommandFinished() } SongTime -FakeDecoder::GetSeekTime() +FakeDecoder::GetSeekTime() noexcept { return SongTime(); } uint64_t -FakeDecoder::GetSeekFrame() +FakeDecoder::GetSeekFrame() noexcept { return 1; } diff --git a/test/FakeDecoderAPI.hxx b/test/FakeDecoderAPI.hxx index 9fb98859c..2f6b8d9d3 100644 --- a/test/FakeDecoderAPI.hxx +++ b/test/FakeDecoderAPI.hxx @@ -34,10 +34,10 @@ struct FakeDecoder final : DecoderClient { /* virtual methods from DecoderClient */ void Ready(AudioFormat audio_format, bool seekable, SignedSongTime duration) override; - DecoderCommand GetCommand() override; + DecoderCommand GetCommand() noexcept override; void CommandFinished() override; - SongTime GetSeekTime() override; - uint64_t GetSeekFrame() override; + SongTime GetSeekTime() noexcept override; + uint64_t GetSeekFrame() noexcept override; void SeekError() override; InputStreamPtr OpenUri(const char *uri) override; size_t Read(InputStream &is, void *buffer, size_t length) override; From cf86dfd3178bcdffbb2968cda4ad9c271ffdc4f3 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 4 Jun 2017 12:51:36 +0200 Subject: [PATCH 6/6] release v0.20.9 --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 3cb18d103..b538b11c3 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -ver 0.20.9 (not yet released) +ver 0.20.9 (2017/06/04) * decoder - ffmpeg: support *.adx * fix byte order detection on FreeBSD/aarch64