3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-13 12:28:44 +00:00

Add support for ref_buffers with different initial sizes. Add shrink and operator= methods.

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2013-01-03 17:45:28 -08:00
parent f324724abc
commit ed5b106574

View file

@ -30,10 +30,10 @@ Revision History:
- void dec_ref(T * obj)
- void inc_ref(T * obj)
*/
template<typename T, typename Ref>
template<typename T, typename Ref, unsigned INITIAL_SIZE=16>
class ref_buffer_core : public Ref {
protected:
ptr_buffer<T> m_buffer;
ptr_buffer<T, INITIAL_SIZE> m_buffer;
void inc_ref(T * o) { Ref::inc_ref(o); }
void dec_ref(T * o) { Ref::dec_ref(o); }
@ -126,6 +126,11 @@ public:
m_buffer.resize(sz, 0);
}
void shrink(unsigned sz) {
SASSERT(sz <= m_buffer.size());
resize(sz);
}
// set pos idx with elem. If idx >= size, then expand.
void setx(unsigned idx, T * elem) {
if (idx >= size()) {
@ -133,19 +138,22 @@ public:
}
set(idx, elem);
}
private:
// prevent abuse:
ref_buffer_core& operator=(ref_buffer_core const & other);
ref_buffer_core & operator=(ref_buffer_core const & other) {
if (this == &other)
return *this;
reset();
append(other);
}
};
/**
\brief Buffer of managed references
*/
template<typename T, typename TManager>
class ref_buffer : public ref_buffer_core<T, ref_manager_wrapper<T, TManager> > {
typedef ref_buffer_core<T, ref_manager_wrapper<T, TManager> > super;
template<typename T, typename TManager, unsigned INITIAL_SIZE=16>
class ref_buffer : public ref_buffer_core<T, ref_manager_wrapper<T, TManager>, INITIAL_SIZE> {
typedef ref_buffer_core<T, ref_manager_wrapper<T, TManager>, INITIAL_SIZE> super;
public:
ref_buffer(TManager & m):
super(ref_manager_wrapper<T, TManager>(m)) {
@ -161,8 +169,8 @@ public:
/**
\brief Buffer of unmanaged references
*/
template<typename T>
class sref_buffer : public ref_buffer_core<T, ref_unmanaged_wrapper<T> > {
template<typename T, unsigned INITIAL_SIZE=16>
class sref_buffer : public ref_buffer_core<T, ref_unmanaged_wrapper<T>, INITIAL_SIZE> {
public:
};