1 #ifndef MEDIA_GENERICCONTAINER_H 2 #define MEDIA_GENERICCONTAINER_H 23 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
32 void validateElementStructure(
NotificationList &gatheredNotifications, uint64 *paddingSize =
nullptr);
33 FileInfoType &fileInfo()
const;
34 ElementType *firstElement()
const;
35 const std::vector<std::unique_ptr<ElementType> > &additionalElements()
const;
36 std::vector<std::unique_ptr<ElementType> > &additionalElements();
37 TagType *tag(std::size_t index);
38 std::size_t tagCount()
const;
41 std::size_t trackCount()
const;
42 const std::vector<std::unique_ptr<TagType> > &tags()
const;
43 std::vector<std::unique_ptr<TagType> > &tags();
44 const std::vector<std::unique_ptr<TrackType> > &tracks()
const;
45 std::vector<std::unique_ptr<TrackType> > &tracks();
48 bool removeTag(
Tag *tag);
52 void removeAllTracks();
63 std::vector<std::unique_ptr<TagType> >
m_tags;
64 std::vector<std::unique_ptr<TrackType> >
m_tracks;
67 FileInfoType *m_fileInfo;
73 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
85 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
99 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
104 m_firstElement->validateSubsequentElementStructure(gatheredNotifications, paddingSize);
113 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
131 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
134 return m_firstElement.get();
144 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
147 return m_additionalElements;
157 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
160 return m_additionalElements;
163 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
166 return m_tags[index].get();
169 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
172 return m_tags.size();
175 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
178 return m_tracks[index].get();
181 template<
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
184 for (
auto &track : m_tracks) {
185 if(track->id() == id) {
192 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
195 return m_tracks.size();
207 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
222 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
237 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
252 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
258 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
262 if(!m_tags.empty()) {
263 if(!target.
isEmpty() && m_tags.front()->supportsTarget()) {
264 for(
auto &tag : m_tags) {
265 if(tag->target() == target) {
270 return m_tags.front().get();
275 m_tags.emplace_back(std::make_unique<TagType>());
276 auto &tag = m_tags.back();
277 tag->setTarget(target);
281 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
284 if(
auto size = m_tags.size()) {
285 m_tags.erase(std::remove_if(m_tags.begin(), m_tags.end(), [tag] (
const std::unique_ptr<TagType> &existingTag) ->
bool {
286 return static_cast<Tag *
>(existingTag.get()) == tag;
288 return size != m_tags.size();
293 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
315 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
318 if(areTracksParsed() && supportsTrackModifications()) {
320 auto id = track->id();
322 for(
const auto &track : m_tracks) {
323 if(track->id() == id) {
325 goto ensureIdIsUnique;
330 m_tracks.emplace_back(track);
331 return m_tracksAltered =
true;
336 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
339 bool removed =
false;
340 if(areTracksParsed() && supportsTrackModifications() && !m_tracks.empty()) {
341 for(
auto i = m_tracks.end() - 1, begin = m_tracks.begin(); ; --i) {
342 if(static_cast<AbstractTrack *>(i->get()) == track) {
352 m_tracksAltered =
true;
358 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
361 if(areTracksParsed() && supportsTrackModifications() && m_tracks.size()) {
363 m_tracksAltered =
true;
367 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
370 AbstractContainer::reset();
371 m_firstElement.reset();
372 m_additionalElements.clear();
379 #endif // MEDIA_GENERICCONTAINER_H
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.