JD2022-TU1/main/extern/libwebm/custom/mkvparser/clusters.hpp

78 lines
No EOL
2.9 KiB
C++

#ifndef MKVP_CLUSTERS_HPP
#define MKVP_CLUSTERS_HPP
#include "memory.hpp"
#include <vector>
namespace mkvparser
{
class Cluster;
// wrapper around vector<Cluster*> to allow better memory management
// (for example, limiting the number of allocated clusters at one time)
class Clusters : public mem::AllocBase
{
Clusters(const Clusters&);
Clusters& operator=(const Clusters&);
typedef std::vector<Cluster*, mem::StlAllocator<Cluster*> > ClusterVect_t;
public:
typedef ClusterVect_t::size_type size_type;
typedef ClusterVect_t::reference reference;
typedef ClusterVect_t::const_reference const_reference;
typedef ClusterVect_t::iterator iterator;
typedef ClusterVect_t::const_iterator const_iterator;
typedef ClusterVect_t::value_type value_type;
class ClusterDestructionObserver
{
public:
virtual ~ClusterDestructionObserver() {}
// returns true if the cluster can be destroyed (ie, observer keeps no references to it, or whatever other reason)
virtual bool CanDestroyCluster(const Cluster* cluster) const = 0;
};
public:
Clusters();
~Clusters();
size_type size() const { return m_clusters.size(); }
bool empty() const { return m_clusters.empty(); }
void reserve(size_type count) { m_clusters.reserve(count); }
void clear();
reference operator[] (size_type n) { return m_clusters[n]; }
const_reference operator[] (size_type n) const { return m_clusters[n]; }
reference back() { return m_clusters.back(); }
const_reference back() const { return m_clusters.back(); }
iterator begin() { return m_clusters.begin(); }
const_iterator begin() const { return m_clusters.begin(); }
iterator end() { return m_clusters.end(); }
const_iterator end() const { return m_clusters.end(); }
iterator insert (iterator position, const value_type& val);
void SetClusterLimit(size_type n) { m_clusterLimit = n; }
bool IsClusterLimitOn() const { return m_clusterLimit != 0; }
void SetClusterDestructionObserver(ClusterDestructionObserver* observer);
void RemoveClusterDestructionObserver(ClusterDestructionObserver* observer);
private:
iterator RemoveOneCluster(iterator insertPosition);
bool TryRemoveClusterAt(size_type n);
private:
//loaded clusters (sorted by cluster position in the file)
ClusterVect_t m_clusters;
size_type m_clusterLimit; // 0 means no limit
typedef std::vector<ClusterDestructionObserver*, mem::StlAllocator<ClusterDestructionObserver*> > ObserverVect_t;
ObserverVect_t m_observers;
};
} // namespace mkvparser
#endif //MKVP_CLUSTERS_HPP