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>
89 TagValue(CppUtilities::DateTime value);
90 TagValue(CppUtilities::TimeSpan value);
100 operator bool()
const;
104 bool isEmpty()
const;
106 void clearMetadata();
107 void clearDataAndMetadata();
113 std::int32_t toInteger()
const;
114 int toStandardGenreIndex()
const;
116 CppUtilities::TimeSpan toTimeSpan()
const;
117 CppUtilities::DateTime toDateTime()
const;
118 std::size_t dataSize()
const;
120 const char *dataPointer()
const;
123 const std::string &mimeType()
const;
124 void setMimeType(
const std::string &mimeType);
125 const std::string &
language()
const;
126 void setLanguage(
const std::string &
language);
127 bool isLabeledAsReadonly()
const;
128 void setReadonly(
bool readOnly);
131 void convertDataEncodingForTag(
const Tag *tag);
140 void assignInteger(
int value);
141 void assignStandardGenreIndex(
int index);
146 void assignTimeSpan(CppUtilities::TimeSpan value);
147 void assignDateTime(CppUtilities::DateTime value);
149 static void stripBom(
const char *&text, std::size_t &length,
TagTextEncoding encoding);
150 static void ensureHostByteOrder(std::u16string &u16str,
TagTextEncoding currentEncoding);
151 template <
typename ContainerType,
152 CppUtilities::Traits::EnableIf<CppUtilities::Traits::IsIteratable<ContainerType>,
153 std::is_same<typename std::add_const<typename std::remove_pointer<typename ContainerType::value_type>::type>::type,
const TagValue>>
157 bool compareData(
const TagValue &other,
bool ignoreCase =
false)
const;
158 static bool compareData(
const std::string &data1,
const std::string &data2,
bool ignoreCase =
false);
159 static bool compareData(
const char *data1, std::size_t size1,
const char *data2, std::size_t size2,
bool ignoreCase =
false);
162 std::unique_ptr<char[]> m_ptr;
165 std::string m_mimeType;
166 std::string m_language;
170 bool m_labeledAsReadonly;
181 , m_labeledAsReadonly(false)
204 , m_labeledAsReadonly(false)
206 assignText(text, textSize, textEncoding, convertTo);
220 assignText(text, std::strlen(text), textEncoding, convertTo);
234 , m_labeledAsReadonly(false)
260 , m_encoding(encoding)
262 , m_labeledAsReadonly(false)
268 m_ptr = std::make_unique<char[]>(m_size);
269 std::copy(data, data + m_size, m_ptr.get());
288 , m_encoding(encoding)
290 , m_labeledAsReadonly(false)
343 inline TagParser::TagValue::operator bool()
const
359 assignText(text.data(), text.size(), textEncoding, convertTo);
452 return m_ptr ==
nullptr;
466 return m_ptr ==
nullptr || m_size == 0;
544 m_descEncoding = encoding;
597 return m_labeledAsReadonly;
610 m_labeledAsReadonly = readOnly;
630 return m_descEncoding;
638 template <
typename ContainerType,
639 CppUtilities::Traits::EnableIf<CppUtilities::Traits::IsIteratable<ContainerType>,
640 std::is_same<typename std::add_const<typename std::remove_pointer<typename ContainerType::value_type>::type>::type,
const TagValue>> *>
643 std::vector<std::string> res;
644 res.reserve(values.size());
645 for (
const auto &value : values) {
646 res.emplace_back(CppUtilities::Traits::dereferenceMaybe(value).
toString(encoding));
656 return compareData(m_ptr.get(), m_size, other.m_ptr.get(), other.m_size, ignoreCase);
664 return compareData(data1.data(), data1.size(), data2.data(), data2.size(), ignoreCase);
671 #endif // TAG_PARSER_TAGVALUE_H