46 #ifndef __INSTANCE_SPECIFIC_EXTENSIONS_H__
47 #define __INSTANCE_SPECIFIC_EXTENSIONS_H__
56 static unsigned int max_num = 0;
57 if (increment) ++max_num;
64 static unsigned int max_num = 0;
65 if (increment) ++max_num;
104 typedef void (U::*
cb)();
112 T* tmp =
static_cast<T*
>(m_extensions[T::priv_id]);
113 m_extensions[T::priv_id] =
static_cast<ispex_base*
>(ext);
114 if (!tmp && ext) (m_container->*m_inc)();
123 m_extensions[index] = ext;
124 if (!tmp && ext) (m_container->*m_inc)();
131 ext =
static_cast<T*
>(m_extensions[T::priv_id]);
136 return m_extensions[index];
143 if (m_extensions[T::priv_id]) (m_container->*m_dec)();
144 m_extensions[T::priv_id] =
static_cast<ispex_base*
>(0);
149 if (index < m_extensions.size())
151 if (m_extensions[index]) (m_container->*m_dec)();
152 m_extensions[index] =
static_cast<ispex_base*
>(0);
173 class instance_specific_extension_container;
189 class instance_specific_extension_carrier;
205 for (
unsigned int i=0; i<m_ispex_per_accessor.size(); i++) {
207 &instance_specific_extension_container::inc_use_count,
208 &instance_specific_extension_container::dec_use_count
210 m_ispex_per_accessor[i]->resize_extensions();
214 ~instance_specific_extension_container(){
215 for (
unsigned int i=0; i<m_ispex_per_accessor.size(); i++)
delete m_ispex_per_accessor[i];
218 void inc_use_count(){use_count++;}
219 inline void dec_use_count();
221 std::vector<instance_specific_extensions_per_accessor<instance_specific_extension_container>* > m_ispex_per_accessor;
222 unsigned int use_count;
225 instance_specific_extension_container* next;
229 inline instance_specific_extension_container_pool::~instance_specific_extension_container_pool(){
233 instance_specific_extension_container* instance_specific_extension_container_pool::create(){
240 void instance_specific_extension_container_pool::free(instance_specific_extension_container* cont){
252 m_container=instance_specific_extension_container_pool::get_ispexcont_pool().create();
253 m_container->my_carrier=
this;
267 inline void instance_specific_extension_container::dec_use_count(){
268 if ((--use_count)==0) {
269 instance_specific_extension_container_pool::get_ispexcont_pool().free(
this);
289 txn.get_extension(carrier);
292 carrier->m_container->my_txn=&txn;
295 return *(carrier->m_container->m_ispex_per_accessor[
m_index]);
instance_specific_extension_accessor()
void clear_extension(unsigned int index)
virtual tlm::tlm_extension_base * clone() const
unsigned int max_num_ispex(bool increment=false)
friend class instance_specific_extension_carrier
ispex_base * get_extension(unsigned int index) const
virtual ~instance_specific_extension()
instance_specific_extensions_per_accessor< instance_specific_extension_container > & operator()(T &txn)
T * set_extension(T *ext)
T * set_extension(T *ext)
void copy_from(tlm::tlm_extension_base const &)
void clear_extension(const T *ext)
unsigned int max_num_ispex_accessors(bool increment=false)
static const unsigned int priv_id
static unsigned int register_private_extension()
friend class instance_specific_extension_container
ispex_base * set_extension(unsigned int index, ispex_base *ext)
void clear_extension(const T *ext)
instance_specific_extensions_per_accessor(U *container, cb inc, cb dec)
void get_extension(T *&ext) const
instance_specific_extension_carrier()