78 lines
No EOL
2.9 KiB
C++
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
|