1 #ifndef TAG_PARSER_TAGVALUE_H
2 #define TAG_PARSER_TAGVALUE_H
6 #include <c++utilities/chrono/datetime.h>
7 #include <c++utilities/chrono/timespan.h>
8 #include <c++utilities/conversion/binaryconversion.h>
9 #include <c++utilities/misc/flagenumclass.h>
10 #include <c++utilities/misc/traits.h>
103 bool isEmpty()
const;
105 void clearMetadata();
106 void clearDataAndMetadata();
112 std::int32_t toInteger()
const;
113 int toStandardGenreIndex()
const;
117 std::size_t dataSize()
const;
119 const char *dataPointer()
const;
122 const std::string &mimeType()
const;
123 void setMimeType(
const std::string &mimeType);
124 const std::string &
language()
const;
125 void setLanguage(
const std::string &
language);
126 bool isLabeledAsReadonly()
const;
127 void setReadonly(
bool readOnly);
130 void convertDataEncodingForTag(
const Tag *tag);
139 void assignInteger(
int value);
140 void assignStandardGenreIndex(
int index);
148 static void stripBom(
const char *&text, std::size_t &length,
TagTextEncoding encoding);
149 static void ensureHostByteOrder(std::u16string &u16str,
TagTextEncoding currentEncoding);
150 template <
typename ContainerType,
151 CppUtilities::Traits::EnableIf<CppUtilities::Traits::IsIteratable<ContainerType>,
152 std::is_same<typename std::add_const<typename std::remove_pointer<typename ContainerType::value_type>::type>::type,
const TagValue>>
156 bool compareData(
const TagValue &other,
bool ignoreCase =
false)
const;
157 static bool compareData(
const std::string &data1,
const std::string &data2,
bool ignoreCase =
false);
158 static bool compareData(
const char *data1, std::size_t size1,
const char *data2, std::size_t size2,
bool ignoreCase =
false);
161 std::unique_ptr<char[]> m_ptr;
164 std::string m_mimeType;
165 std::string m_language;
169 bool m_labeledAsReadonly;
180 , m_labeledAsReadonly(false)
203 , m_labeledAsReadonly(false)
205 assignText(text, textSize, textEncoding, convertTo);
219 assignText(text, std::strlen(text), textEncoding, convertTo);
233 , m_labeledAsReadonly(false)
259 , m_encoding(encoding)
261 , m_labeledAsReadonly(false)
267 m_ptr = std::make_unique<char[]>(m_size);
268 std::copy(data, data + m_size, m_ptr.get());
287 , m_encoding(encoding)
289 , m_labeledAsReadonly(false)
349 assignText(text.data(), text.size(), textEncoding, convertTo);
437 return m_ptr ==
nullptr;
451 return m_ptr ==
nullptr || m_size == 0;
529 m_descEncoding = encoding;
582 return m_labeledAsReadonly;
595 m_labeledAsReadonly = readOnly;
615 return m_descEncoding;
623 template <
typename ContainerType,
624 CppUtilities::Traits::EnableIf<CppUtilities::Traits::IsIteratable<ContainerType>,
625 std::is_same<typename std::add_const<typename std::remove_pointer<typename ContainerType::value_type>::type>::type,
const TagValue>> *>
628 std::vector<std::string> res;
629 res.reserve(values.size());
630 for (
const auto &value : values) {
631 res.emplace_back(CppUtilities::Traits::dereferenceMaybe(value).
toString(encoding));
641 return compareData(m_ptr.get(), m_size, other.m_ptr.get(), other.m_size, ignoreCase);
649 return compareData(data1.data(), data1.size(), data2.data(), data2.size(), ignoreCase);
656 #endif // TAG_PARSER_TAGVALUE_H