![]() |
User Manual, Developers Guide and API Documentation |
![]() |
00001 /****************************************************************************** 00002 * WNS (Wireless Network Simulator) * 00003 * __________________________________________________________________________ * 00004 * * 00005 * Copyright (C) 2004-2008 * 00006 * Chair of Communication Networks (ComNets) * 00007 * Kopernikusstr. 1, D-52074 Aachen, Germany * 00008 * phone: ++49-241-80-27910 (phone), fax: ++49-241-80-22242 * 00009 * email: wns@comnets.rwth-aachen.de * 00010 * www: http://wns.comnets.rwth-aachen.de * 00011 ******************************************************************************/ 00012 00013 #ifndef WNS_LDK_HASDELIVERERRECEPTACLE_HPP 00014 #define WNS_LDK_HASDELIVERERRECEPTACLE_HPP 00015 00016 #include <WNS/ldk/IDelivererReceptacle.hpp> 00017 #include <WNS/ldk/DelivererReceptacleRegistry.hpp> 00018 #include <WNS/ldk/LinkHandlerInterface.hpp> 00019 #include <WNS/ldk/SinglePort.hpp> 00020 #include <WNS/ldk/Port.hpp> 00021 #include <WNS/ldk/fun/FUN.hpp> 00022 #include <WNS/ldk/CommandTypeSpecifierInterface.hpp> 00023 00024 #include <WNS/Assure.hpp> 00025 00026 #include <string> 00027 00028 namespace wns { namespace ldk { 00029 00030 template <typename CLASS, typename PORTID = SinglePort> 00031 class HasDelivererReceptacle 00032 : public virtual DelivererReceptacleRegistry 00033 { 00034 public: 00035 HasDelivererReceptacle(CLASS* fu) 00036 : DelivererReceptacleRegistry(), 00037 delivererReceptacle_(new DelivererReceptacle(fu)) 00038 { 00039 addToDelivererReceptacleRegistry(PORTID().name, delivererReceptacle_); 00040 } 00041 00042 HasDelivererReceptacle(const HasDelivererReceptacle&) 00043 { 00044 wns::Exception e; 00045 e << "The copy constructor of class HasDelivererReceptacle must not be called!"; 00046 throw e; 00047 } 00048 00049 virtual 00050 ~HasDelivererReceptacle() 00051 { 00052 delete delivererReceptacle_; 00053 } 00054 00055 class DelivererReceptacle 00056 : public virtual IDelivererReceptacle 00057 { 00058 public: 00059 DelivererReceptacle(CLASS* fu) 00060 : fu_(fu) 00061 {} 00062 00063 virtual 00064 ~DelivererReceptacle() 00065 {} 00066 00067 virtual void 00068 onData(const CompoundPtr& compound) 00069 { 00070 fu_->getFUN()->getLinkHandler()->onData(this, compound); 00071 } 00072 00073 virtual void 00074 doOnData(const CompoundPtr& compound) 00075 { 00076 fu_->doOnData(compound, Port<PORTID>()); 00077 } 00078 00079 virtual FunctionalUnit* 00080 getFU() 00081 { 00082 return fu_; 00083 } 00084 00085 private: 00086 CLASS* fu_; 00087 }; 00088 00089 private: 00090 HasDelivererReceptacle() 00091 {} 00092 00093 DelivererReceptacle* delivererReceptacle_; 00094 }; 00095 00096 00097 template <typename CLASS> 00098 class HasDelivererReceptacle<CLASS, SinglePort> 00099 : public virtual IDelivererReceptacle, 00100 public virtual DelivererReceptacleRegistry, 00101 public virtual CommandTypeSpecifierInterface 00102 { 00103 public: 00104 HasDelivererReceptacle() 00105 : DelivererReceptacleRegistry() 00106 { 00107 addToDelivererReceptacleRegistry(SinglePort().name, this); 00108 } 00109 00110 HasDelivererReceptacle(FunctionalUnit*) 00111 : DelivererReceptacleRegistry() 00112 { 00113 addToDelivererReceptacleRegistry(SinglePort().name, this); 00114 } 00115 00116 HasDelivererReceptacle(const HasDelivererReceptacle&) 00117 : DelivererReceptacleRegistry() 00118 { 00119 addToDelivererReceptacleRegistry(SinglePort().name, this); 00120 } 00121 00122 virtual 00123 ~HasDelivererReceptacle() 00124 {} 00125 00126 virtual void 00127 onData(const CompoundPtr& compound) 00128 { 00129 getFUN()->getLinkHandler()->onData(this, compound); 00130 } 00131 00132 virtual FunctionalUnit* 00133 getFU() 00134 { 00135 return dynamic_cast<CLASS*>(this); 00136 } 00137 }; 00138 00139 00140 } // ldk 00141 } // wns 00142 00143 #endif // NOT defined WNS_LDK_HASDELIVERERRECEPTACLE_HPP
1.5.5