OSDN Git Service

bug fix and optimize
[gintenlib/gintenlib.git] / gintenlib / preprocessor / .svn / text-base / enable_if.hpp.svn-base
1 #ifndef GINTENLIB_PREPROCESSOR_INCLUDED_ENABLE_IF_HPP
2 #define GINTENLIB_PREPROCESSOR_INCLUDED_ENABLE_IF_HPP
3
4 /*
5
6       <gintenlib/preprocessor/enable_if.hpp>
7
8   preprocessor.enable_if ¡§ ¤é¤¯¤Á¤ó enable_if
9
10   Àë¸À¡§
11     #define GINTENLIB_ENABLE_IF (( condition ))   ¡Á
12     #define GINTENLIB_DISABLE_IF(( condition ))   ¡Á
13     
14   »ÈÍÑÎ㡧
15     // d_enable_if.hpp ¤ÎÎã¤ò¤ä¤Ã¤Ä¤±¤ë
16     // using namespace gintenlib; // ¤³¤ó¤Ê¤ÎɬÍפʤ¤
17     
18     // °ú¿ô¤ò Target ·¿¤Ø°ÅÌÛÊÑ´¹¤¹¤ë
19     // Ä̾ïÈÇ¡¢Target ¤¬»²¾È·¿¤Ç¤Ê¤±¤ì¤Ð¤³¤Ã¤Á¤¬¸Æ¤Ð¤ì¤ë
20     // ÂèÆó°ú¿ô¤ËÃíÌÜ¡£¤Á¤Ê¤ß¤Ë¤³¤Î°ú¿ô¤Ï¥À¥ß¡¼¤Ê¤Î¤Ç̵»ë¤·¤Æ£Ï£Ë
21     template< typename Target, typename Source >
22     inline Target cast( const Source& src,
23       GINTENLIB_DISABLE_IF(( boost::is_reference<Target> )) )
24     {
25       return src;
26     }
27     
28     // »²¾ÈÈÇ
29     template< typename Target, typename Source >
30     inline Target cast( Source& src,
31       GINTENLIB_ENABLE_IF((  boost::is_reference<Target> )) )
32     {
33       return src;
34     }
35     
36     // c.f.) d_enable_if.hpp ¤ÎÎã
37     //
38     //   // »²¾ÈÈÇ
39     //   template< typename Target, typename Source >
40     //   inline Target cast( Source& src,
41     //     typename d_enable_if<  boost::is_reference<Target> >::type = dummy_arg_t() )
42     //   {
43     //     return src;
44     //   }
45     // 
46     // Èæ³Ó¤·¤Æ¤ß¤ë¤È¡¢¤É¤ì¤À¤±³Ú¤«Ê¬¤«¤ë¤Ï¤º
47
48   ²òÀ⡧
49     ´Ø¿ô¥ª¡¼¥Ð¡¼¥í¡¼¥ÉÍѤΠenable_if ¤ò¤é¤¯¤Á¤ó¤Ë¤¹¤ë¤¿¤á¤Î¥Þ¥¯¥í¤Ç¤¹¡£
50     ¼ÂºÝ¤Ë¤É¤Î¤è¤¦¤ËŸ³«¤µ¤ì¤Æ¤¤¤ë¤«¤Ï²¼¤ÎÎã¤ò¤´Í÷¤¯¤À¤µ¤¤¡£
51     ¤Þ¡¼¿¿ÌÌÌܤ˽ñ¤¤¤Æ¤âÎɤ¤¤Î¤Ç¤¹¤¬¡¢
52       typename gintenlib::d_enable_if< ¤Ê¤ó¤¿¤é, gintenlib::dummy_arg_t >::type 
53         = gintenlib::dummy_arg_t()
54     ÀµÄ¾¤³¤ó¤ÊŤ¤¥½¡¼¥¹¥³¡¼¥É¤Ê¤ó¤Æ½ñ¤¤¤Æ¤é¤ì¤Þ¤»¤ó¤«¤é¤Í¡£
55     d_enable_if ¤È dummy_arg_t ¤Î¸ºß°ÕµÁ¤Ï <gintenlib/d_enable_if.hpp> ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
56     
57     »È¤¤Êý¤Ï¡¢¾å¤ÎÎã¤ÎÄ̤ꡢenable_if ¤Î <> ¤ÎÃæ¤Îµ­½Ò¤ò¡ÖÆó½Å³ç¸Ì¤Ç¤¯¤¯¤Ã¤Æ¡×¥Þ¥¯¥í¤ËÅϤ·¤Æ¡¢
58     ´Ø¿ô¤Î°ú¿ô¥ê¥¹¥È¤ÎºÇ¸å¤ËÃÖ¤¤¤Æ¤ª¤¯¤À¤±¡£´Êñ¤Ç¤¹¡£
59     ÉáÄÌ¡¢¤³¤¦¤¤¤¦¡Ö¥á¥¿´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ë¡×¥Þ¥¯¥í¤Ã¤Æ¤Î¤Ï¡¢¥Æ¥ó¥×¥ì¡¼¥È°ú¿ô¥ê¥¹¥È¤Î¥«¥ó¥Þ¤¬¼ÙËâ¤ò¤·¤Æ
60     Àµ¾ï¤Ë¥Þ¥¯¥íŸ³«¤µ¤ì¤Ê¤«¤Ã¤¿¤ê¤¹¤ë¤Î¤Ç¤¹¤¬¡¢¤³¤ì¤Ë´Ø¤·¤Æ¤Ïµ¤¤Ë¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£
61     ¥æ¡¼¥¶Â¦¤ÇÃí°Õ¤¹¤Ù¤­¤Ï°ìÅÀ¤Î¤ß¡¢¥Þ¥¯¥í¤Î°ú¿ô¤Ïɬ¤ºÆó½Å³ç¸Ì¤Ç¤¯¤ë¤à¤³¤È¡£
62     ¤½¤³¤Ë¤µ¤¨µ¤¤ò¤Ä¤±¤ì¤Ð´Êñ¤Ë´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎÀÚ¤êÂؤ¨¤¬½ÐÍè¤Þ¤¹¡£ÊØÍø¤Ç¤¹¡£
63
64 */
65
66 #include "../d_enable_if.hpp"
67 #include "dequote.hpp"
68
69 namespace gintenlib
70 {
71   // GINTENLIB_DEQUOTE(( TYPE )) ¤Ï¡¢ ¤Ê¤ó¤È¤«<¡Á>::type ¤È¤¤¤¦·Á¤ÇŸ³«¤µ¤ì¤ë
72   // ¤³¤Î type ¤¬ TYPE ·¿¤ËÄêµÁ¤µ¤ì¤ë¤è¤¦¤Ê»Å³Ý¤±¤È¤Ê¤Ã¤Æ¤¤¤ë
73   // ¤è¤Ã¤Æ GINTENLIB_DEQUOTE Á°¤Î typename ¤Ïɬ¿Ü
74   #define GINTENLIB_ENABLE_IF( quoted_type )    \
75     typename ::gintenlib::d_enable_if<          \
76       typename GINTENLIB_DEQUOTE( quoted_type ) \
77     >::type = ::gintenlib::dummy_arg_t()
78   
79   #define GINTENLIB_DISABLE_IF( quoted_type )   \
80     typename ::gintenlib::d_disable_if<         \
81       typename GINTENLIB_DEQUOTE( quoted_type ) \
82     >::type = ::gintenlib::dummy_arg_t()
83
84 }   // namespace gintenlib
85
86
87 #endif  // #ifndef GINTENLIB_PREPROCESSOR_INCLUDED_ENABLE_IF_HPP