<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
{
}; // 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 )
{
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 );
}