1 #ifndef MEDIA_GENERICCONTAINER_H 2 #define MEDIA_GENERICCONTAINER_H 6 #include <c++utilities/misc/memory.h> 24 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
33 void validateElementStructure(
NotificationList &gatheredNotifications, uint64 *paddingSize =
nullptr);
34 FileInfoType &fileInfo()
const;
35 ElementType *firstElement()
const;
36 const std::vector<std::unique_ptr<ElementType> > &additionalElements()
const;
37 std::vector<std::unique_ptr<ElementType> > &additionalElements();
38 TagType *tag(std::size_t index);
39 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 return m_tracks.size();
196 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
211 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
226 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
241 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
247 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
251 if(!m_tags.empty()) {
252 if(!target.
isEmpty() && m_tags.front()->supportsTarget()) {
253 for(
auto &tag : m_tags) {
254 if(tag->target() == target) {
259 return m_tags.front().get();
264 m_tags.emplace_back(std::make_unique<TagType>());
265 auto &tag = m_tags.back();
266 tag->setTarget(target);
270 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
273 if(
auto size = m_tags.size()) {
274 m_tags.erase(std::remove_if(m_tags.begin(), m_tags.end(), [tag] (
const std::unique_ptr<TagType> &existingTag) ->
bool {
275 return static_cast<Tag *
>(existingTag.get()) == tag;
277 return size != m_tags.size();
282 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
302 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
305 if(areTracksParsed() && supportsTrackModifications()) {
306 m_tracks.emplace_back(track);
307 return m_tracksAltered =
true;
312 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
315 bool removed =
false;
316 if(areTracksParsed() && supportsTrackModifications() && !m_tracks.empty()) {
317 for(
auto i = m_tracks.end() - 1, begin = m_tracks.begin(); ; --i) {
318 if(static_cast<AbstractTrack *>(i->get()) == track) {
328 m_tracksAltered =
true;
334 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
337 if(areTracksParsed() && supportsTrackModifications() && m_tracks.size()) {
339 m_tracksAltered =
true;
343 template <
class FileInfoType,
class TagType,
class TrackType,
class ElementType>
346 AbstractContainer::reset();
347 m_firstElement.reset();
348 m_additionalElements.clear();
355 #endif // MEDIA_GENERICCONTAINER_H
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.