rc_abstract_interface_wrapper.h

Go to the documentation of this file.
00001 // vim:set et sts=4 ts=4 tw=75 sw=4 ai ci cin cino=g0,t0:
00002 /*
00003  * Copyright (C) 2007, Technical Computer Science Group,
00004  *                     University of Bonn
00005  *
00006  * This file is part of the ReChannel library.
00007  *
00008  * The ReChannel library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU General Public License as
00010  * published by the Free Software Foundation; either version 2 of the
00011  * License, or (at your option) any later version.
00012  *
00013  * This library is distributed in the hope that it will be
00014  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  * along with this library; see the file COPYING. If not, write to the
00020  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
00021  * Boston, MA 02110-1301, USA.
00022  *
00023  * Authors: Andreas Raabe and Armin Felke. Implementation by Armin Felke.
00024  *          {raabe, felke}@cs.uni-bonn.de
00025  */
00037 #ifndef RC_ABSTRACT_INTERFACE_WRAPPER_H_
00038 #define RC_ABSTRACT_INTERFACE_WRAPPER_H_
00039 
00040 #include "ReChannel/communication/rc_interface_wrapper.h"
00041 #include "ReChannel/communication/rc_fallback_interface.h"
00042 #include "ReChannel/communication/rc_report_ids.h"
00043 
00044 #ifndef RC_INTERFACE_WRAPPER_MAX_DRIVER_COUNT
00045  #define RC_INTERFACE_WRAPPER_MAX_DRIVER_COUNT 32
00046 #endif
00047 
00048 namespace ReChannel {
00049 
00050 template<class IF> class rc_abstract_interface_wrapper;
00051 
00055 class rc_abstract_interface_wrapper_b
00056     : virtual public rc_interface_wrapper_base,
00057       virtual protected rc_event_forwarder_host
00058 {
00059     template<class IF> friend class rc_abstract_interface_wrapper;
00060 
00061 private:
00062     typedef std::vector<void*> vector;
00063     typedef std::vector<std::string> string_vector;
00064     typedef std::map<std::string, rc_event_forwarder_base*>
00065         event_forwarder_base_map;
00066     typedef std::vector<rc_event_forwarder_base*> ef_vector;
00067     typedef std::pair<rc_event_forwarder_base*, ef_vector>
00068         event_ef_map_entry;
00069     typedef std::map<const sc_event*, event_ef_map_entry> event_ef_map;
00070 
00071 private:
00072     explicit rc_abstract_interface_wrapper_b(void* if_);
00073 
00074 public:
00075 
00076     virtual std::string get_interface_wrapper_name() const
00077         { return "(unknown)"; }
00078 
00079     virtual rc_event_forwarder_host* get_event_forwarder_host()
00080         { return static_cast<rc_event_forwarder_host*>(this); }
00081 
00082 protected:
00083 
00085     virtual void add_event_forwarder(
00086         rc_event_forwarder_base& forwarder, const sc_event& e,
00087         const std::string& event_name=NULL);
00088 
00090     virtual void add_event_forwarder_target(
00091         sc_interface& if_, rc_event_filter* filter=NULL);
00092 
00094     virtual bool add_event_forwarder_target(
00095         const std::string& event_name, sc_interface& if_,
00096         rc_event_filter* filter=NULL);
00097 
00099     virtual bool get_event_forwarder_target_count() const
00100         { return p_event_forwarder_base_map.size(); }
00101 
00103     virtual void clear_event_forwarder_targets();
00104 
00106     virtual void clear_event_forwarder_targets(
00107         const std::string& event_name);
00108 
00110     virtual string_vector get_event_forwarder_names() const;
00111 
00113     virtual void notify_event(const std::string& event_name);
00114 
00115     virtual void register_port(
00116         sc_port_base& port_, const char* if_typename)
00117     { this->get_wrapped_interface().register_port(port_, if_typename); }
00118 
00119     virtual rc_process_behavior_change begin_access_callback()
00120         { return rc_process_behavior_change(); }
00121 
00122     virtual void end_access_callback() { };
00123 
00124     inline int get_driver_count() const
00125         { return p_drv_obj_vector.size(); }
00126 
00127     inline int get_nb_driver_count() const
00128         { return p_nb_drv_obj_vector.size(); }
00129 
00130     virtual ~rc_abstract_interface_wrapper_b();
00131 
00132 private:
00133 
00134     inline void* get_wrapped_if() const
00135         { return p_interface; }
00136 
00137     void set_wrapped_if(void* if_);
00138 
00140     void* find_driver_object(int index);
00141 
00143     inline void* find_nb_driver_object(int index);
00144 
00145     void* create_driver_object(int index);
00146 
00147     void* create_nb_driver_object(int index);
00148 
00149     void delete_all_drivers();
00150 
00151     void delete_all_event_forwarders();
00152 
00153     void missing_fallback_if_error() const;
00154 
00155 private:
00156 
00157 /* for internal use only */
00158 
00159     rc_event_forwarder_base& _rc_get_event_forwarder(
00160         const std::string& event_name);
00161 
00163     void _rc_spawn_event_forwarder_process(
00164         rc_event_forwarder_base& forwarder, const sc_event& e);
00165 
00167     static void _rc_event_forwarder_proc(
00168         event_ef_map_entry& map_entry);
00169 
00170 /* special (untyped!!!) callback methods */
00171 
00172     virtual void* _rc_create_driver_object(void* if_) const = 0;
00173 
00174     virtual void* _rc_create_nb_driver_object(void* if_) const = 0;
00175 
00176     virtual void _rc_set_driver_channel(
00177         void* drv_obj, void* if_) const = 0;
00178 
00179     virtual void _rc_set_nb_driver_channel(
00180         void* nb_drv_obj, void* if_) const = 0;
00181 
00182     virtual void _rc_delete_driver_object(void* drv_obj) const = 0;
00183 
00184     virtual void _rc_delete_nb_driver_object(void* nb_drv_obj) const = 0;
00185 
00186 private:
00187 
00189     event_forwarder_base_map p_event_forwarder_base_map;
00190 
00191 private:
00192 
00194     static event_ef_map s_event_ef_map;
00195 
00196 private:
00197 
00198 /* for internal use only! */
00199 
00200     void*  p_interface;
00201     vector p_drv_obj_vector;
00202     vector p_nb_drv_obj_vector;
00203 
00204 private:
00205     // disabled
00206     rc_abstract_interface_wrapper_b(
00207         const rc_abstract_interface_wrapper_b& orig) { }
00208     rc_abstract_interface_wrapper_b& operator=(
00209         const rc_abstract_interface_wrapper_b& orig);
00210 };
00211 
00215 template<class IF>
00216 class rc_abstract_interface_wrapper
00217     : public rc_abstract_interface_wrapper_b,
00218       virtual public rc_interface_wrapper<IF>
00219 {
00220     RC_STATIC_ASSERT_VALID_INTERFACE(IF);
00221 
00222 private:
00223     typedef rc_abstract_interface_wrapper_b base_type;
00224     typedef rc_driver_object<IF>            drv_obj_type;
00225     typedef rc_nb_driver_object<IF>         nb_drv_obj_type;
00226 
00227 protected:
00228     typedef typename rc_interface_wrapper<IF>::interface_access
00229         interface_access;
00230     typedef typename rc_interface_wrapper<IF>::nb_interface_access
00231         nb_interface_access;
00232     typedef typename rc_interface_wrapper<IF>::driver_access
00233         driver_access;
00234     typedef typename rc_interface_wrapper<IF>::nb_driver_access
00235         nb_driver_access;
00236 
00237 public:
00238     typedef rc_interface_wrapper<IF> interface_wrapper_type;
00239     typedef typename rc_interface_wrapper<IF>::accessor accessor_type;
00240 
00241 protected:
00242     rc_abstract_interface_wrapper();
00243 
00244     explicit rc_abstract_interface_wrapper(IF& if_);
00245 
00246 public:
00247 
00248     virtual interface_access get_interface_access()
00249         { return interface_access(*this); }
00250 
00251     virtual nb_interface_access get_nb_interface_access()
00252         { return nb_interface_access(*this); }
00253 
00254     virtual driver_access get_driver_access(int driver_index)
00255         { return driver_access(*this, driver_index); }
00256 
00257     virtual nb_driver_access get_nb_driver_access(int driver_index)
00258         { return nb_driver_access(*this, driver_index); }
00259 
00260     virtual int get_driver_count() const
00261         { return base_type::get_driver_count(); }
00262 
00263     virtual int get_nb_driver_count() const
00264         { return base_type::get_nb_driver_count(); }
00265 
00266     inline virtual sc_interface& get_wrapped_interface() const
00267         { return this->get_wrapped_if(); }
00268 
00269 protected:
00270 
00271     inline IF& get_wrapped_if() const
00272     { return *(reinterpret_cast<IF*>(base_type::get_wrapped_if())); }
00273 
00274     virtual bool set_wrapped_interface(sc_interface& if_);
00275 
00276     inline virtual bool set_wrapped_interface(IF& if_)
00277         { base_type::set_wrapped_if(&if_); return true; }
00278 
00279     virtual IF& rc_get_fallback_if() const;
00280 
00281     virtual IF* nb_interface_access_callback()
00282     { return reinterpret_cast<IF*>(base_type::get_wrapped_if()); }
00283 
00284     virtual IF* interface_access_callback()
00285     { return reinterpret_cast<IF*>(base_type::get_wrapped_if()); }
00286 
00287     virtual typename rc_nb_driver_object<IF>::driver_access*
00288         nb_driver_access_callback(int driver_index)
00289         { return &(this->get_nb_driver_object(driver_index).access); }
00290 
00291     virtual typename rc_driver_object<IF>::driver_access*
00292         driver_access_callback(int driver_index)
00293         { return &(this->get_driver_object(driver_index).access); }
00294 
00296     inline rc_driver_object<IF>& get_driver_object(int index);
00297 
00299     inline rc_nb_driver_object<IF>& get_nb_driver_object(int index);
00300 
00302     rc_event_forwarder<IF>& add_event_forwarder(
00303         const sc_event& source_event,
00304         boost::function<const sc_event& (IF*)> event_getter,
00305         const std::string& event_name=NULL);
00306 
00308     rc_event_forwarder<IF>& add_event_forwarder(
00309         IF& trigger_if,
00310         boost::function<const sc_event& (IF*)> event_getter,
00311         const std::string& event_name=NULL);
00312 
00313     virtual ~rc_abstract_interface_wrapper();
00314 
00315 private:
00316 
00317 /* (for internal use only) */
00318 
00319     virtual void* _rc_create_driver_object(void* if_) const;
00320 
00321     virtual void* _rc_create_nb_driver_object(void* if_) const;
00322 
00323     virtual void _rc_set_driver_channel(void* drv_obj, void* if_) const;
00324 
00325     virtual void _rc_set_nb_driver_channel(void* nb_drv_obj, void* if_) const;
00326 
00327     virtual void _rc_delete_driver_object(void* drv_obj) const;
00328 
00329     virtual void _rc_delete_nb_driver_object(void* nb_drv_obj) const;
00330 };
00331 
00332 /* inline code */
00333 
00334 inline
00335 void* rc_abstract_interface_wrapper_b::find_driver_object(int index)
00336 {
00337     int size = (int)p_drv_obj_vector.size();
00338     if (size > 0 && index >= 0 && index < size) {
00339          return p_drv_obj_vector[index];
00340     } else {
00341         return NULL;
00342     }
00343 }
00344 
00345 inline
00346 void* rc_abstract_interface_wrapper_b::find_nb_driver_object(int index)
00347 {
00348     int size = (int)p_nb_drv_obj_vector.size();
00349     if (size > 0 && index >= 0 && index < size) {
00350          return p_nb_drv_obj_vector[index];
00351     } else {
00352         return NULL;
00353     }
00354 }
00355 
00356 /* template code */
00357 
00358 template<class IF>
00359 rc_abstract_interface_wrapper<IF>::rc_abstract_interface_wrapper()
00360     : base_type(&rc_get_fallback_if())
00361 { }
00362 
00363 template<class IF>
00364 rc_abstract_interface_wrapper<IF>::rc_abstract_interface_wrapper(
00365     IF& if_)
00366     : base_type(&if_)
00367 { }
00368 
00369 template<class IF>
00370 rc_abstract_interface_wrapper<IF>::~rc_abstract_interface_wrapper()
00371 {
00372     this->delete_all_drivers();
00373     this->delete_all_event_forwarders();
00374 }
00375 
00376 template<class IF>
00377 rc_event_forwarder<IF>&
00378 rc_abstract_interface_wrapper<IF>::add_event_forwarder(
00379     const sc_event& source_event,
00380     boost::function<const sc_event& (IF*)> event_getter,
00381     const std::string& event_name)
00382 {
00383     std::auto_ptr<rc_event_forwarder<IF> > forwarder(
00384         new rc_event_forwarder<IF>(event_getter));
00385     base_type::add_event_forwarder(
00386         *forwarder, source_event, event_name);
00387     return *(forwarder.release());
00388 }
00389 
00390 template<class IF>
00391 rc_event_forwarder<IF>&
00392 rc_abstract_interface_wrapper<IF>::add_event_forwarder(
00393     IF& trigger_if,
00394     boost::function<const sc_event& (IF*)> event_getter,
00395     const std::string& event_name)
00396 {
00397     const sc_event& source_event = event_getter(&trigger_if);
00398     return this->add_event_forwarder(
00399         source_event, event_getter, event_name);
00400 }
00401 
00402 template<class IF>
00403 bool rc_abstract_interface_wrapper<IF>::set_wrapped_interface(
00404     sc_interface& if_)
00405 {
00406     IF* if__ = dynamic_cast<IF*>(&if_);
00407     if (if__ == NULL) {
00408         return false;
00409     } else {
00410         base_type::set_wrapped_if(if__);
00411         return true;
00412     }
00413 }
00414 
00415 template<class IF>
00416 IF& rc_abstract_interface_wrapper<IF>::rc_get_fallback_if() const
00417 {
00418     static IF* s_fallback_if =
00419         rc_fallback_interface_factory<IF>::create();
00420 
00421     if (s_fallback_if != NULL) {
00422         return *s_fallback_if;
00423     } else {
00424         base_type::missing_fallback_if_error();
00425         throw 0;
00426     }
00427 }
00428 
00429 template<class IF>
00430 inline
00431 rc_driver_object<IF>&
00432 rc_abstract_interface_wrapper<IF>::get_driver_object(int index)
00433 {
00434     void* drv = base_type::find_driver_object(index);
00435     if (drv == NULL) {
00436         drv = base_type::create_driver_object(index);
00437     }
00438     return *(reinterpret_cast<drv_obj_type*>(drv));
00439 }
00440 
00441 template<class IF>
00442 inline
00443 rc_nb_driver_object<IF>&
00444 rc_abstract_interface_wrapper<IF>::get_nb_driver_object(int index)
00445 {
00446     void* drv = base_type::find_nb_driver_object(index);
00447     if (drv == NULL) {
00448         drv = base_type::create_nb_driver_object(index);
00449     }
00450     return *(reinterpret_cast<nb_drv_obj_type*>(drv));
00451 }
00452 
00453 template<class IF>
00454 void* rc_abstract_interface_wrapper<IF>::_rc_create_driver_object(
00455     void* if_) const
00456 {
00457     IF* if__ = reinterpret_cast<IF*>(if_);
00458     return new drv_obj_type(*if__);
00459 }
00460 
00461 template<class IF>
00462 void* rc_abstract_interface_wrapper<IF>::_rc_create_nb_driver_object(
00463     void* if_) const
00464 {
00465     IF* if__ = reinterpret_cast<IF*>(if_);
00466     return new nb_drv_obj_type(*if__);
00467 }
00468 
00469 template<class IF>
00470 void rc_abstract_interface_wrapper<IF>::_rc_set_driver_channel(
00471     void* drv_obj, void* if_) const
00472 {
00473     IF* if__ = reinterpret_cast<IF*>(if_);
00474     drv_obj_type* drv_obj__ = reinterpret_cast<drv_obj_type*>(drv_obj);
00475     drv_obj__->set_channel(*if__);
00476 }
00477 
00478 template<class IF>
00479 void rc_abstract_interface_wrapper<IF>::_rc_set_nb_driver_channel(
00480     void* nb_drv_obj, void* if_) const
00481 {
00482     IF* if__ = reinterpret_cast<IF*>(if_);
00483     nb_drv_obj_type* nb_drv_obj__ =
00484         reinterpret_cast<nb_drv_obj_type*>(nb_drv_obj);
00485     nb_drv_obj__->set_channel(*if__);
00486 }
00487 
00488 template<class IF>
00489 void rc_abstract_interface_wrapper<IF>::_rc_delete_driver_object(
00490     void* drv_obj) const
00491 {
00492     drv_obj_type* drv_obj__ =
00493         reinterpret_cast<drv_obj_type*>(drv_obj);
00494     delete drv_obj__;
00495 }
00496 
00497 template<class IF>
00498 void rc_abstract_interface_wrapper<IF>::_rc_delete_nb_driver_object(
00499     void* nb_drv_obj) const
00500 {
00501     nb_drv_obj_type* nb_drv_obj__ =
00502         reinterpret_cast<nb_drv_obj_type*>(nb_drv_obj);
00503     delete nb_drv_obj__;
00504 }
00505 
00506 } // namespace ReChannel
00507 
00508 #endif // RC_ABSTRACT_SWITCH_H_
00509 
00510 //
00511 // $Id: rc_abstract_interface_wrapper.h,v 1.17 2008/01/01 13:46:06 felke Exp $
00512 // $Source: /var/cvs/projekte/ReChannel-v2/src/ReChannel/communication/rc_abstract_interface_wrapper.h,v $
00513 //

Generated on Tue Jan 1 23:13:30 2008 for ReChannel by  doxygen 1.5.3