class IPersistentDataStructure
{
public:
virtual ~IPersistentDataStructure();
virtual IPersistentDataStructure &SetVersion(size_t) = 0;
virtual size_t GetVersionCount() const = 0;
virtual size_t GetCurrentVersion() const = 0;
};
class CAbstractPersistentDataStructure:
public IPersistentDataStructure
{
public:
CAbstractPersistentDataStructure();
CAbstractPersistentDataStructure(const CAbstractPersistentDataStructure &);
CAbstractPersistentDataStructure &operator=(const CAbstractPersistentDataStructure &);
// ...
};
template<typename T, typename Operation>
class ISegmentTree
{
public:
virtual ~ISegmentTree();
virtual ISegmentTree<T, Operation> &Change(size_t, const T &) = 0;
virtual T operator()(size_t, size_t) const = 0;
};
template<typename T, typename Operation, T DefaultValue>
class CSegmentTree:
public ISegmentTree<T, Operation>
{
public:
template<typename InputIterator>
CSegmentTree(InputIterator, InputIterator);
CSegmentTree(const CSegmentTree<T, Operation, DefaultValue> &);
// ...
};
template<typename T, typename Operation, T DefaultValue>
class CPersistentSegmentTree:
public CAbstractPersistentDataStructure, public ISegmentTree<T, Operation>
{
public:
template<typename InputIterator>
CPersistentSegmentTree(InputIterator, InputIterator);
CPersistentSegmentTree(const CPersistentSegmentTree<T, Operation, DefaultValue> &);
// ...
};
Comments