OSDN Git Service

memberwise_swap を追加
[gintenlib/gintenlib.git] / gintenlib / intrusive_to_shared.hpp
index 963a447..e5e1ca1 100644 (file)
@@ -5,24 +5,24 @@
 
       <gintenlib/intrusive_to_shared.hpp>
 
-  intrusive_to_shared ¡§ intrusive_ptr ¤ò shared_ptr ¤ËÊÑ´¹
+  intrusive_to_shared : intrusive_ptr を shared_ptr に変換
 
-  Àë¸À¡§
+  宣言:
     template<typename T>
-    boost::shared_ptr<T> intrusive_to_shared( const boost::intrusive_ptr<T>& p );
+    shared_ptr<T> intrusive_to_shared( const boost::intrusive_ptr<T>& p );
     
     template<typename T>
-    boost::shared_ptr<T> intrusive_to_shared( T* p, bool add_ref = true );
+    shared_ptr<T> intrusive_to_shared( T* p, bool add_ref = true );
     
     template<typename T>
-    boost::shared_ptr<T> to_shared( const boost::intrusive_ptr<T>& p );
+    shared_ptr<T> to_shared( const boost::intrusive_ptr<T>& p );
 
-  µ¡Ç½¡§
-    intrusive_ptr ¤ò shared_ptr ¤ËÊÑ´¹¤·¤Þ¤¹¡£
-    intrusive_ptr_add_ref ¤ä intrusive_ptr_release ¤Î¥³¥¹¥È¤¬¹â¤¤¾ì¹ç¤ä¡¢
-    ¤¢¤ë¤¤¤Ïñ¤Ë shared_ptr ¤È¤·¤Æ¤ÎÃͤ¬Íߤ·¤¤¾ì¹ç¤Ê¤É¤Ë»È¤¨¤Þ¤¹¡£
-    ¤Ê¤ª¥Ø¥Ã¥À̾¤Ï intrusive_to_shared ¤Ç¤¹¤¬¡¢¾Êά̾¤Ç¤¢¤ë to_shared ¤Ç¤â»È¤¨¤Þ¤¹¡£
-    ¤à¤·¤í <gintenlib/to_shared.hpp> ¤È¤Î·ó¤Í¹ç¤¤¤«¤é¡¢¤³¤Á¤é¤ò»È¤¦¤³¤È¤ò¿ä¾©¤·¤Æ¤¤¤Þ¤¹¡£
+  機能:
+    intrusive_ptr を shared_ptr に変換します。
+    intrusive_ptr_add_ref や intrusive_ptr_release のコストが高い場合や、
+    あるいは単に shared_ptr としての値が欲しい場合などに使えます。
+    なおヘッダ名は intrusive_to_shared ですが、省略名である to_shared でも使えます。
+    むしろ <gintenlib/to_shared.hpp> との兼ね合いから、こちらを使うことを推奨しています。
 
 */
 
 
 namespace gintenlib
 {
-  // deleter ¤È¤·¤Æ»È¤¦Êä½õ¥Õ¥¡¥ó¥¯¥¿
+  // deleter ã\81¨ã\81\97ã\81¦ä½¿ã\81\86è£\9cå\8a©ã\83\95ã\82¡ã\83³ã\82¯ã\82¿
   struct intrusive_ptr_releaser
   {
     typedef void result_type;
     
-    // ptr ¤ò¥ê¥ê¡¼¥¹¤¹¤ë
+    // ptr をリリースする
     template<typename T>
     void operator()( T* ptr ) const
     {
@@ -51,15 +51,15 @@ namespace gintenlib
   
   };  // class intrusive_ptr_releaser
   
-  // ËÜÂÎ
-  // intrusive_ptr ÈÇ
+  // 本体
+  // intrusive_ptr 
   template<typename T>
   inline shared_ptr<T> intrusive_to_shared( const boost::intrusive_ptr<T>& p )
   {
-    // À¸¥Ý¥¤¥ó¥¿ÈǤËñ½ã¤ËžÁ÷¤¹¤ë¤À¤±
+    // 生ポインタ版に単純に転送するだけ
     return intrusive_to_shared( p.get(), true );
   }
-  // À¸¥Ý¥¤¥ó¥¿ÈÇ
+  // 生ポインタ版
   template<typename T>
   inline shared_ptr<T> intrusive_to_shared( T* p, bool add_ref = true )
   {
@@ -67,24 +67,24 @@ namespace gintenlib
     
     if(p)
     {
-      // »²¾È¥«¥¦¥ó¥ÈÁý¤ä¤·¤Æ¤«¤é shared_ptr ¤ËÆͤùþ¤à
-      // boost::shared_ptr ¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ÇÎã³°¤òÅꤲ¤¦¤ë¤¬¡¢¤½¤Î¾ì¹ç¤Ç¤â
-      // ¤Á¤ã¤ó¤Èºï½ü¥Õ¥¡¥ó¥¯¥¿¤ò¸Æ¤Ó½Ð¤·¤Æ¤¯¤ì¤ë¤Î¤ÇÌäÂê¤Ê¤¤
+      // 参照カウント増やしてから shared_ptr に突っ込む
+      // boost::shared_ptr はコンストラクタで例外を投げうるが、その場合でも
+      // ちゃんと削除ファンクタを呼び出してくれるので問題ない
       if( add_ref ){ intrusive_ptr_add_ref( p ); }
       return shared_ptr<T>( p, intrusive_ptr_releaser() );
     }
     
-    // NULL ¤Î¾ì¹ç¤Ï¶õ¤Î shared_ptr ¤òÊÖ¤¹
+    // NULL の場合は空の shared_ptr を返す
     return shared_ptr<T>();
   }
   
-  // ¾Êά̾¾Î
-  // Â¾¤Î¾ì½ê¤Ç to_shared ¤Î°ìÈÌŪ¤Ê¥¹¥Þ¡¼¥È¥Ý¥¤¥ó¥¿¤ËÂФ¹¤ëÄêµÁ¤â¤¢¤ë¤¬¡¢
-  // intrusive_ptr ¤Ë´Ø¤·¤Æ¤Ï¤³¤Á¤é¤ÎÊý¤¬¸úΨ¤¬Îɤ¤¡£
+  // 省略名称
+  // 他の場所で to_shared の一般的なスマートポインタに対する定義もあるが、
+  // intrusive_ptr に関してはこちらの方が効率が良い。
   template<typename T>
   inline shared_ptr<T> to_shared( const boost::intrusive_ptr<T>& p )
   {
-    // Ã±½ã¤ËžÁ÷¤¹¤ë¤À¤±
+    // 単純に転送するだけ
     return intrusive_to_shared( p );
   }