1 #ifndef TAG_PARSER_TAGVALUE_H
2 #define TAG_PARSER_TAGVALUE_H
7 #include <c++utilities/chrono/datetime.h>
8 #include <c++utilities/chrono/timespan.h>
9 #include <c++utilities/conversion/binaryconversion.h>
10 #include <c++utilities/misc/flagenumclass.h>
11 #include <c++utilities/misc/traits.h>
18 #include <unordered_map>
113 explicit TagValue(CppUtilities::DateTime value);
114 explicit TagValue(CppUtilities::TimeSpan value);
124 operator bool()
const;
128 bool isEmpty()
const;
130 void clearMetadata();
131 void clearDataAndMetadata();
137 std::int32_t toInteger()
const;
138 int toStandardGenreIndex()
const;
140 CppUtilities::TimeSpan toTimeSpan()
const;
141 CppUtilities::DateTime toDateTime()
const;
142 std::size_t dataSize()
const;
144 const char *dataPointer()
const;
145 std::string_view data()
const;
148 const std::string &mimeType()
const;
149 void setMimeType(std::string_view mimeType);
150 const Locale &locale()
const;
152 void setLocale(
const Locale &locale);
155 bool isLabeledAsReadonly()
const;
156 void setReadonly(
bool readOnly);
157 const std::unordered_map<std::string, std::string> &nativeData()
const;
158 std::unordered_map<std::string, std::string> &nativeData();
161 void convertDataEncodingForTag(
const Tag *tag);
172 void assignInteger(
int value);
173 void assignStandardGenreIndex(
int index);
178 void assignTimeSpan(CppUtilities::TimeSpan value);
179 void assignDateTime(CppUtilities::DateTime value);
181 static void stripBom(
const char *&text, std::size_t &length,
TagTextEncoding encoding);
182 static void ensureHostByteOrder(std::u16string &u16str,
TagTextEncoding currentEncoding);
183 template <
typename ContainerType,
184 CppUtilities::Traits::EnableIf<CppUtilities::Traits::IsIteratable<ContainerType>,
185 std::is_same<typename std::add_const<typename std::remove_pointer<typename ContainerType::value_type>::type>::type,
const TagValue>>
189 bool compareData(
const TagValue &other,
bool ignoreCase =
false)
const;
190 static bool compareData(
const std::string &data1,
const std::string &data2,
bool ignoreCase =
false);
191 static bool compareData(
const char *data1, std::size_t size1,
const char *data2, std::size_t size2,
bool ignoreCase =
false);
194 std::unique_ptr<char[]> m_ptr;
197 std::string m_mimeType;
199 std::unordered_map<std::string, std::string> m_nativeData;
239 assignText(text, textSize, textEncoding, convertTo);
253 assignText(text, std::strlen(text), textEncoding, convertTo);
309 , m_encoding(encoding)
317 m_ptr = std::make_unique<char[]>(m_size);
318 std::copy(
data,
data + m_size, m_ptr.get());
337 , m_encoding(encoding)
392 inline TagParser::TagValue::operator bool()
const
408 assignText(text.data(), text.size(), textEncoding, convertTo);
422 assignText(text.data(), text.size(), textEncoding, convertTo);
515 return m_ptr ==
nullptr;
529 return m_ptr ==
nullptr || m_size == 0;
585 return std::string_view(m_ptr.get(), m_size);
617 m_descEncoding = encoding;
767 return m_descEncoding;
775 template <
typename ContainerType,
776 CppUtilities::Traits::EnableIf<CppUtilities::Traits::IsIteratable<ContainerType>,
777 std::is_same<typename std::add_const<typename std::remove_pointer<typename ContainerType::value_type>::type>::type,
const TagValue>> *>
780 std::vector<std::string> res;
781 res.reserve(values.size());
782 for (
const auto &value : values) {
783 res.emplace_back(CppUtilities::Traits::dereferenceMaybe(value).
toString(encoding));
793 return compareData(m_ptr.get(), m_size, other.m_ptr.get(), other.m_size, ignoreCase);
801 return compareData(data1.data(), data1.size(), data2.data(), data2.size(), ignoreCase);
The PositionInSet class describes the position of an element in a set which consists of a certain num...
constexpr bool isNull() const
Returns an indication whether both the element position and total element count is 0.
The TagValue class wraps values of different types.
bool compareData(const TagValue &other, bool ignoreCase=false) const
Returns whether the raw data of the current instance equals the raw data of other.
void setMimeType(std::string_view mimeType)
Sets the MIME type.
void setFlags(TagValueFlags flags)
Sets the flags.
const std::unordered_map< std::string, std::string > & nativeData() const
Holds tag format specific meta-data for that field which does not fit into any of the other meta-data...
void clearMetadata()
Wipes assigned meta data.
void assignText(const char *text, std::size_t textSize, TagTextEncoding textEncoding=TagTextEncoding::Latin1, TagTextEncoding convertTo=TagTextEncoding::Unspecified)
Assigns a copy of the given text.
const std::string & mimeType() const
Returns the MIME type.
void assignInteger(int value)
Assigns the given integer value.
bool compareTo(const TagValue &other, TagValueComparisionFlags options=TagValueComparisionFlags::None) const
Returns whether both instances are equal.
TagTextEncoding dataEncoding() const
Returns the data encoding.
void assignPosition(PositionInSet value)
Assigns the given PositionInSet value.
void assignData(const char *data, std::size_t length, TagDataType type=TagDataType::Binary, TagTextEncoding encoding=TagTextEncoding::Latin1)
TagValue(TagValue &&other)=default
bool operator==(const TagValue &other) const
Returns whether both instances are equal.
void setDescription(std::string_view value, TagTextEncoding encoding=TagTextEncoding::Latin1)
Sets the description.
TagDataType type() const
Returns the type of the assigned value.
void assignTimeSpan(CppUtilities::TimeSpan value)
Assigns the given TimeSpan value.
static std::vector< std::string > toStrings(const ContainerType &values, TagTextEncoding encoding=TagTextEncoding::Utf8)
Converts the specified values to string using the specified encoding.
void clearDataAndMetadata()
Wipes assigned data including meta data.
void assignData(std::unique_ptr< char[]> &&data, std::size_t length, TagDataType type=TagDataType::Binary, TagTextEncoding encoding=TagTextEncoding::Latin1)
void assignDateTime(CppUtilities::DateTime value)
Assigns the given DateTime value.
bool isLabeledAsReadonly() const
Returns an indication whether the value is labeled as read-only.
TagValueFlags flags() const
Returns the flags.
bool operator!=(const TagValue &other) const
Returns whether both instances are not equal.
~TagValue()
Destroys the TagValue.
std::string_view data() const
Returns the currently assigned raw data.
std::size_t dataSize() const
Returns the size of the assigned value in bytes.
std::u16string toWString(TagTextEncoding encoding=TagTextEncoding::Unspecified) const
Converts the value of the current TagValue object to its equivalent std::wstring representation.
TagTextEncoding descriptionEncoding() const
Returns the description encoding.
void assignStandardGenreIndex(int index)
Assigns the given standard genre index to be assigned.
std::string toString(TagTextEncoding encoding=TagTextEncoding::Unspecified) const
Converts the value of the current TagValue object to its equivalent std::string representation.
bool isNull() const
Returns whether no value is assigned at all.
void setLocale(const Locale &locale)
Sets the setLocale.
void setReadonly(bool readOnly)
Sets whether the TagValue is labeled as read-only.
static void stripBom(const char *&text, std::size_t &length, TagTextEncoding encoding)
Strips the byte order mask from the specified text.
void clearData()
Clears the assigned data.
TagValue & operator=(TagValue &&other)=default
bool isEmpty() const
Returns whether no or an empty value is assigned.
const std::string & description() const
Returns the description.
const Locale & locale() const
Returns the locale.
TagValue()
Constructs an empty TagValue.
char * dataPointer()
Returns a pointer to the raw data assigned to the current instance.
The Tag class is used to store, read and write tag information.
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
constexpr TAG_PARSER_EXPORT std::string_view description()
Contains all classes and functions of the TagInfo library.
constexpr int characterSize(TagTextEncoding encoding)
Returns the size of one character for the specified encoding in bytes.
TagTextEncoding
Specifies the text encoding.
constexpr bool operator!=(std::uint8_t lhs, FlacMetaDataBlockType type)
constexpr bool operator==(std::uint8_t lhs, FlacMetaDataBlockType type)
TagValueComparisionFlags
The TagValueComparisionOption enum specifies options for TagValue::compareTo().
TagValueFlags
Specifies additional flags about the tag value.
TagDataType
Specifies the data type.
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(TagParser, TagParser::TagCreationFlags)
The Locale struct specifies a language and/or a country using one or more LocaleDetail objects.