Minor optims

This commit is contained in:
emeric
2023-04-04 23:47:29 +02:00
parent 4ba7aff628
commit f465c804b7
3 changed files with 26 additions and 14 deletions
+14 -14
View File
@@ -50,7 +50,7 @@ using TagMap = std::map<std::string, std::vector<std::string>>;
template<typename T> template<typename T>
std::vector<T> std::vector<T>
getPropertyValuesFirstMatchAs(const TagMap& tags, const std::vector<std::string_view>& keys) getPropertyValuesFirstMatchAs(const TagMap& tags, std::initializer_list<std::string_view> keys)
{ {
std::vector<T> res; std::vector<T> res;
@@ -83,7 +83,7 @@ getPropertyValuesFirstMatchAs(const TagMap& tags, const std::vector<std::string_
template <typename T> template <typename T>
std::optional<T> std::optional<T>
getPropertyValueFirstMatchAs(const TagMap& tags, const std::vector<std::string_view>& keys) getPropertyValueFirstMatchAs(const TagMap& tags, std::initializer_list<std::string_view> keys)
{ {
std::optional<T> res; std::optional<T> res;
std::vector<T> values {getPropertyValuesFirstMatchAs<T>(tags, keys)}; std::vector<T> values {getPropertyValuesFirstMatchAs<T>(tags, keys)};
@@ -95,14 +95,14 @@ getPropertyValueFirstMatchAs(const TagMap& tags, const std::vector<std::string_v
template <typename T> template <typename T>
std::vector<T> std::vector<T>
getPropertyValuesAs(const TagMap& tags, const std::string& key) getPropertyValuesAs(const TagMap& tags, std::string_view key)
{ {
return getPropertyValuesFirstMatchAs<T>(tags, {key}); return getPropertyValuesFirstMatchAs<T>(tags, {key});
} }
template <typename T> template <typename T>
std::optional<T> std::optional<T>
getPropertyValueAs(const TagMap& tags, const std::string& key) getPropertyValueAs(const TagMap& tags, std::string_view key)
{ {
return getPropertyValueFirstMatchAs<T>(tags, {key}); return getPropertyValueFirstMatchAs<T>(tags, {key});
} }
@@ -121,22 +121,22 @@ splitAndTrimString(std::string_view str, std::string_view delimiters)
static static
std::vector<Artist> std::vector<Artist>
getArtists(const TagMap& tags, getArtists(const TagMap& tags,
const std::vector<std::string_view>& artistTagNames, std::initializer_list<std::string_view> artistTagNames,
const std::vector<std::string_view>& artistSortTagNames, std::initializer_list<std::string_view> artistSortTagNames,
const std::vector<std::string_view>& artistMBIDTagNames std::initializer_list<std::string_view> artistMBIDTagNames
) )
{ {
const std::vector<std::string> artistNames {getPropertyValuesFirstMatchAs<std::string>(tags, artistTagNames)}; const std::vector<std::string_view> artistNames {getPropertyValuesFirstMatchAs<std::string_view>(tags, artistTagNames)};
if (artistNames.empty()) if (artistNames.empty())
return {}; return {};
std::vector<Artist> artists; std::vector<Artist> artists;
artists.reserve(artistNames.size()); artists.reserve(artistNames.size());
std::transform(std::cbegin(artistNames), std::cend(artistNames), std::back_inserter(artists), std::transform(std::cbegin(artistNames), std::cend(artistNames), std::back_inserter(artists),
[&](const std::string& name) { return Artist {name}; }); [&](std::string_view name) { return Artist {name}; });
{ {
const std::vector<std::string> artistSortNames {getPropertyValuesFirstMatchAs<std::string>(tags, artistSortTagNames)}; const std::vector<std::string_view> artistSortNames {getPropertyValuesFirstMatchAs<std::string_view>(tags, artistSortTagNames)};
if (artistSortNames.size() == artists.size()) if (artistSortNames.size() == artists.size())
{ {
for (std::size_t i {}; i < artistSortNames.size(); ++i) for (std::size_t i {}; i < artistSortNames.size(); ++i)
@@ -161,14 +161,14 @@ getArtists(const TagMap& tags,
static static
PerformerContainer PerformerContainer
getPerformerArtists(const TagMap& tags, getPerformerArtists(const TagMap& tags,
const std::vector<std::string_view>& artistTagNames) std::initializer_list<std::string_view> artistTagNames)
{ {
PerformerContainer performers; PerformerContainer performers;
// picard stores like this: (see https://picard-docs.musicbrainz.org/en/appendices/tag_mapping.html#performer) // picard stores like this: (see https://picard-docs.musicbrainz.org/en/appendices/tag_mapping.html#performer)
// We may hit both styles for the same track // We may hit both styles for the same track
// PERFORMER: artist (role) // PERFORMER: artist (role)
if (const std::vector<std::string> artistNames {getPropertyValuesFirstMatchAs<std::string>(tags, artistTagNames)}; !artistNames.empty()) if (const std::vector<std::string_view> artistNames {getPropertyValuesFirstMatchAs<std::string_view>(tags, artistTagNames)}; !artistNames.empty())
{ {
for (std::string_view entry : artistNames) for (std::string_view entry : artistNames)
{ {
@@ -216,7 +216,7 @@ getRelease(const TagMap& tags)
if (!release->mediumCount) if (!release->mediumCount)
{ {
// mediumCount may be encoded as "position/count" // mediumCount may be encoded as "position/count"
if (const auto value {getPropertyValueAs<std::string>(tags, "DISCNUMBER")}) if (const auto value {getPropertyValueAs<std::string_view>(tags, "DISCNUMBER")})
{ {
// Expecting 'Number/Total' // Expecting 'Number/Total'
const std::vector<std::string_view> strings {StringUtils::splitString(*value, "/") }; const std::vector<std::string_view> strings {StringUtils::splitString(*value, "/") };
@@ -248,7 +248,7 @@ getMedium(const TagMap& tags)
if (!medium->trackCount) if (!medium->trackCount)
{ {
// totalTracks may be encoded as "position/count" // totalTracks may be encoded as "position/count"
if (const auto value {getPropertyValueAs<std::string>(tags, "TRACKNUMBER")}) if (const auto value {getPropertyValueAs<std::string_view>(tags, "TRACKNUMBER")})
{ {
// Expecting 'Number/Total' // Expecting 'Number/Total'
const std::vector<std::string_view> strings {StringUtils::splitString(*value, "/") }; const std::vector<std::string_view> strings {StringUtils::splitString(*value, "/") };
+7
View File
@@ -63,6 +63,13 @@ readAs(std::string_view str)
return std::string {str}; return std::string {str};
} }
template<>
std::optional<std::string_view>
readAs(std::string_view str)
{
return str;
}
template<> template<>
std::optional<bool> std::optional<bool>
readAs(std::string_view str) readAs(std::string_view str)
+5
View File
@@ -88,6 +88,11 @@ template<>
std::optional<std::string> std::optional<std::string>
readAs(std::string_view str); readAs(std::string_view str);
template<>
[[nodiscard]]
std::optional<std::string_view>
readAs(std::string_view str);
template<> template<>
[[nodiscard]] [[nodiscard]]
std::optional<bool> std::optional<bool>