mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +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:
parent
f324724abc
commit
ed5b106574
|
@ -30,10 +30,10 @@ Revision History:
|
||||||
- void dec_ref(T * obj)
|
- void dec_ref(T * obj)
|
||||||
- void inc_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 {
|
class ref_buffer_core : public Ref {
|
||||||
protected:
|
protected:
|
||||||
ptr_buffer<T> m_buffer;
|
ptr_buffer<T, INITIAL_SIZE> m_buffer;
|
||||||
|
|
||||||
void inc_ref(T * o) { Ref::inc_ref(o); }
|
void inc_ref(T * o) { Ref::inc_ref(o); }
|
||||||
void dec_ref(T * o) { Ref::dec_ref(o); }
|
void dec_ref(T * o) { Ref::dec_ref(o); }
|
||||||
|
@ -126,6 +126,11 @@ public:
|
||||||
m_buffer.resize(sz, 0);
|
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.
|
// set pos idx with elem. If idx >= size, then expand.
|
||||||
void setx(unsigned idx, T * elem) {
|
void setx(unsigned idx, T * elem) {
|
||||||
if (idx >= size()) {
|
if (idx >= size()) {
|
||||||
|
@ -133,19 +138,22 @@ public:
|
||||||
}
|
}
|
||||||
set(idx, elem);
|
set(idx, elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
ref_buffer_core & operator=(ref_buffer_core const & other) {
|
||||||
// prevent abuse:
|
if (this == &other)
|
||||||
ref_buffer_core& operator=(ref_buffer_core const & other);
|
return *this;
|
||||||
|
reset();
|
||||||
|
append(other);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Buffer of managed references
|
\brief Buffer of managed references
|
||||||
*/
|
*/
|
||||||
template<typename T, typename TManager>
|
template<typename T, typename TManager, unsigned INITIAL_SIZE=16>
|
||||||
class ref_buffer : public ref_buffer_core<T, ref_manager_wrapper<T, TManager> > {
|
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> > super;
|
typedef ref_buffer_core<T, ref_manager_wrapper<T, TManager>, INITIAL_SIZE> super;
|
||||||
public:
|
public:
|
||||||
ref_buffer(TManager & m):
|
ref_buffer(TManager & m):
|
||||||
super(ref_manager_wrapper<T, TManager>(m)) {
|
super(ref_manager_wrapper<T, TManager>(m)) {
|
||||||
|
@ -161,8 +169,8 @@ public:
|
||||||
/**
|
/**
|
||||||
\brief Buffer of unmanaged references
|
\brief Buffer of unmanaged references
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T, unsigned INITIAL_SIZE=16>
|
||||||
class sref_buffer : public ref_buffer_core<T, ref_unmanaged_wrapper<T> > {
|
class sref_buffer : public ref_buffer_core<T, ref_unmanaged_wrapper<T>, INITIAL_SIZE> {
|
||||||
public:
|
public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue