⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pfactory_8h-source.html

📁 pwlib开发文档
💻 HTML
📖 第 1 页 / 共 3 页
字号:
00317       <span class="keyword">typename</span> KeyMap_T::const_iterator entry;00318       <span class="keywordflow">for</span> (entry = <a class="code" href="classPFactory.html#n0">keyMap</a>.begin(); entry != <a class="code" href="classPFactory.html#n0">keyMap</a>.end(); ++entry) {00319         <span class="keywordflow">if</span> (entry-&gt;second-&gt;isDynamic)00320           <span class="keyword">delete</span> entry-&gt;second;00321       }00322     }00323 <a name="l00324"></a><a class="code" href="classPFactory.html#e0">00324</a>     <span class="keyword">static</span> <a class="code" href="classPFactory.html">PFactory</a> &amp; <a class="code" href="classPFactory.html#e0">GetInstance</a>()00325     {00326       std::string className = <span class="keyword">typeid</span>(PFactory).name();00327       <a class="code" href="classPWaitAndSignal.html">PWaitAndSignal</a> m(<a class="code" href="classPFactoryBase.html#d1">GetFactoriesMutex</a>());00328       FactoryMap &amp; factories = <a class="code" href="classPFactoryBase.html#d0">GetFactories</a>();00329       FactoryMap::const_iterator entry = factories.find(className);00330       <span class="keywordflow">if</span> (entry != factories.end()) {00331         <a class="code" href="object_8h.html#a5">PAssert</a>(entry-&gt;second != NULL, <span class="stringliteral">"Factory map returned NULL for existing key"</span>);00332         <a class="code" href="classPFactoryBase.html">PFactoryBase</a> * b = entry-&gt;second;00333         <span class="comment">// don't use the following dynamic cast, because gcc does not like it</span>00334         <span class="comment">//PFactory * f = dynamic_cast&lt;PFactory*&gt;(b);</span>00335         <span class="keywordflow">return</span> *(<a class="code" href="classPFactory.html">PFactory</a> *)b;00336       }00337 00338       <a class="code" href="classPFactory.html">PFactory</a> * factory = <span class="keyword">new</span> <a class="code" href="classPFactory.html">PFactory</a>;00339       factories[className] = factory;00340       <span class="keywordflow">return</span> *factory;00341     }00342 00343 <a name="l00344"></a><a class="code" href="classPFactory.html#b2">00344</a>     <span class="keywordtype">void</span> <a class="code" href="classPFactory.html#b2">Register_Internal</a>(<span class="keyword">const</span> _Key_T &amp; key, <a class="code" href="classPFactory_1_1WorkerBase.html">WorkerBase</a> * worker)00345     {00346       <a class="code" href="classPWaitAndSignal.html">PWaitAndSignal</a> m(<a class="code" href="classPFactoryBase.html#m0">mutex</a>);00347       <span class="keywordflow">if</span> (<a class="code" href="classPFactory.html#n0">keyMap</a>.find(key) == <a class="code" href="classPFactory.html#n0">keyMap</a>.end())00348         <a class="code" href="classPFactory.html#n0">keyMap</a>[key] = worker;00349     }00350 <a name="l00351"></a><a class="code" href="classPFactory.html#b3">00351</a>     <span class="keywordtype">void</span> <a class="code" href="classPFactory.html#b3">Unregister_Internal</a>(<span class="keyword">const</span> _Key_T &amp; key)00352     {00353       <a class="code" href="classPWaitAndSignal.html">PWaitAndSignal</a> m(<a class="code" href="classPFactoryBase.html#m0">mutex</a>);00354       <a class="code" href="classPFactory.html#n0">keyMap</a>.erase(key);00355     }00356 <a name="l00357"></a><a class="code" href="classPFactory.html#b4">00357</a>     <span class="keywordtype">void</span> <a class="code" href="classPFactory.html#b4">UnregisterAll_Internal</a>()00358     {00359       <a class="code" href="classPWaitAndSignal.html">PWaitAndSignal</a> m(<a class="code" href="classPFactoryBase.html#m0">mutex</a>);00360       <a class="code" href="classPFactory.html#n0">keyMap</a>.erase(<a class="code" href="classPFactory.html#n0">keyMap</a>.begin(), <a class="code" href="classPFactory.html#n0">keyMap</a>.end());00361     }00362 <a name="l00363"></a><a class="code" href="classPFactory.html#b5">00363</a>     <span class="keywordtype">bool</span> <a class="code" href="classPFactory.html#b5">IsRegistered_Internal</a>(<span class="keyword">const</span> _Key_T &amp; key)00364     {00365       <a class="code" href="classPWaitAndSignal.html">PWaitAndSignal</a> m(<a class="code" href="classPFactoryBase.html#m0">mutex</a>);00366       <span class="keywordflow">return</span> <a class="code" href="classPFactory.html#n0">keyMap</a>.find(key) != <a class="code" href="classPFactory.html#n0">keyMap</a>.end();00367     }00368 <a name="l00369"></a><a class="code" href="classPFactory.html#b6">00369</a>     _Abstract_T * <a class="code" href="classPFactory.html#b6">CreateInstance_Internal</a>(<span class="keyword">const</span> _Key_T &amp; key)00370     {00371       <a class="code" href="classPWaitAndSignal.html">PWaitAndSignal</a> m(<a class="code" href="classPFactoryBase.html#m0">mutex</a>);00372       <span class="keyword">typename</span> KeyMap_T::const_iterator entry = <a class="code" href="classPFactory.html#n0">keyMap</a>.find(key);00373       <span class="keywordflow">if</span> (entry != <a class="code" href="classPFactory.html#n0">keyMap</a>.end())00374         <span class="keywordflow">return</span> entry-&gt;second-&gt;CreateInstance(key);00375       <span class="keywordflow">return</span> NULL;00376     }00377 <a name="l00378"></a><a class="code" href="classPFactory.html#b7">00378</a>     <span class="keywordtype">bool</span> <a class="code" href="classPFactory.html#b7">IsSingleton_Internal</a>(<span class="keyword">const</span> _Key_T &amp; key)00379     {00380       <a class="code" href="classPWaitAndSignal.html">PWaitAndSignal</a> m(<a class="code" href="classPFactoryBase.html#m0">mutex</a>);00381       <span class="keywordflow">if</span> (<a class="code" href="classPFactory.html#n0">keyMap</a>.find(key) == <a class="code" href="classPFactory.html#n0">keyMap</a>.end())00382         <span class="keywordflow">return</span> <span class="keyword">false</span>;00383       <span class="keywordflow">return</span> <a class="code" href="classPFactory.html#n0">keyMap</a>[key]-&gt;isSingleton;00384     }00385 <a name="l00386"></a><a class="code" href="classPFactory.html#b8">00386</a>     <a class="code" href="classPFactory.html#s3">KeyList_T</a> <a class="code" href="classPFactory.html#b8">GetKeyList_Internal</a>()00387     { 00388       <a class="code" href="classPWaitAndSignal.html">PWaitAndSignal</a> m(<a class="code" href="classPFactoryBase.html#m0">mutex</a>);00389       <a class="code" href="classPFactory.html#s3">KeyList_T</a> list;00390       <span class="keyword">typename</span> KeyMap_T::const_iterator entry;00391       <span class="keywordflow">for</span> (entry = <a class="code" href="classPFactory.html#n0">keyMap</a>.begin(); entry != <a class="code" href="classPFactory.html#n0">keyMap</a>.end(); ++entry)00392         list.push_back(entry-&gt;first);00393       <span class="keywordflow">return</span> list;00394     }00395 <a name="l00396"></a><a class="code" href="classPFactory.html#n0">00396</a>     <a class="code" href="classPFactory.html#s2">KeyMap_T</a> <a class="code" href="classPFactory.html#n0">keyMap</a>;00397 00398   <span class="keyword">private</span>:00399     <a class="code" href="classPFactory.html#b0">PFactory</a>(<span class="keyword">const</span> <a class="code" href="classPFactory.html">PFactory</a> &amp;) {}00400     <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classPFactory.html">PFactory</a> &amp;) {}00401 00402 <span class="preprocessor">#ifdef _WIN32</span>00403 <span class="preprocessor"></span>  <span class="keyword">public</span>:00404     <span class="keyword">static</span> <span class="keywordtype">int</span> factoryLoader;00405 <span class="preprocessor">#endif</span>00406 <span class="preprocessor"></span>};00407 00408 <span class="preprocessor">#ifdef _WIN32</span>00409 <span class="preprocessor"></span>00410 <span class="keyword">namespace </span>PWLibFactoryLoader { 00411 00412 <span class="keyword">template</span> &lt;<span class="keyword">class</span> AbstractType, <span class="keyword">typename</span> KeyType&gt;00413 <span class="keyword">class </span>Loader00414 {00415   <span class="keyword">public</span>:00416     Loader()00417     { <a class="code" href="classPFactory.html">PFactory&lt;AbstractType, KeyType&gt;</a>::factoryLoader = 1; }00418 };00419 };00420 00421 00422 <span class="comment">//</span>00423 <span class="comment">//  this macro is used to declare the static member variable used to force factories to instantiate</span>00424 <span class="comment">//</span>00425 <span class="preprocessor">#define PLOAD_FACTORY(AbstractType, KeyType) \</span>00426 <span class="preprocessor">namespace PWLibFactoryLoader { \</span>00427 <span class="preprocessor">static Loader&lt;AbstractType, KeyType&gt; AbstractType##_##KeyType##; \</span>00428 <span class="preprocessor">}; </span>00429 <span class="preprocessor"></span>00430 <span class="comment">//</span>00431 <span class="comment">//  this macro is used to instantiate a static variable that accesses the static member variable </span>00432 <span class="comment">//  in a factory forcing it to load</span>00433 <span class="comment">//</span>00434 <span class="preprocessor">#define PINSTANTIATE_FACTORY(AbstractType, KeyType) \</span>00435 <span class="preprocessor">int PFactory&lt;AbstractType, KeyType&gt;::factoryLoader;</span>00436 <span class="preprocessor"></span>00437 <span class="preprocessor">#endif // _WIN32</span>00438 <span class="preprocessor"></span>00439 <span class="preprocessor">#endif // _PFACTORY_H</span></pre></div><hr><address style="align: right;"><small>Generated on Wed Sep 29 22:44:11 2004 for PWLib by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.18 </small></address></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -