📄 pfactory_8h-source.html
字号:
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->second->isDynamic)00320 <span class="keyword">delete</span> entry->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> & <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 & 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->second != NULL, <span class="stringliteral">"Factory map returned NULL for existing key"</span>);00332 <a class="code" href="classPFactoryBase.html">PFactoryBase</a> * b = entry->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<PFactory*>(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 & 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 & 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 & 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 & 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->second->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 & 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]->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->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> &) {}00400 <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classPFactory.html">PFactory</a> &) {}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> <<span class="keyword">class</span> AbstractType, <span class="keyword">typename</span> KeyType>00413 <span class="keyword">class </span>Loader00414 {00415 <span class="keyword">public</span>:00416 Loader()00417 { <a class="code" href="classPFactory.html">PFactory<AbstractType, KeyType></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<AbstractType, KeyType> 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<AbstractType, KeyType>::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 + -