00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00048 #ifndef STLSOFT_INCL_STLSOFT_UTIL_HPP_OPERATOR_BOOL
00049 #define STLSOFT_INCL_STLSOFT_UTIL_HPP_OPERATOR_BOOL
00050 
00051 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00052 # define STLSOFT_VER_STLSOFT_UTIL_HPP_OPERATOR_BOOL_MAJOR    4
00053 # define STLSOFT_VER_STLSOFT_UTIL_HPP_OPERATOR_BOOL_MINOR    0
00054 # define STLSOFT_VER_STLSOFT_UTIL_HPP_OPERATOR_BOOL_REVISION 1
00055 # define STLSOFT_VER_STLSOFT_UTIL_HPP_OPERATOR_BOOL_EDIT     36
00056 #endif 
00057 
00058 
00059 
00060 
00061 
00062 #ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
00063 # include <stlsoft/stlsoft.h>
00064 #endif 
00065 
00066 
00067 
00068 
00069 
00070 #ifndef _STLSOFT_NO_NAMESPACE
00071 namespace stlsoft
00072 {
00073 #endif 
00074 
00075 
00076 
00077 
00078 
00091 # define STLSOFT_DEFINE_OPERATOR_BOOL_TYPES(U, G, B)                                                \
00092                                                                                                     \
00093     typedef stlsoft_ns_qual(operator_bool_generator)<U>::class_type   G;                            \
00094     typedef G::return_type                                            B
00095 
00111 #if defined(STLSOFT_COMPILER_IS_BORLAND) || \
00112     (   defined(STLSOFT_COMPILER_IS_MSVC) && \
00113         _MSC_VER < 1300)
00114 
00115 # define STLSOFT_DEFINE_OPERATOR_BOOL_TYPES_T(U, G, B)                                              \
00116                                                                                                     \
00117     STLSOFT_DEFINE_OPERATOR_BOOL_TYPES(U, G, B)
00118 
00119 #else 
00120 
00121 # define STLSOFT_DEFINE_OPERATOR_BOOL_TYPES_T(U, G, B)                                              \
00122                                                                                                     \
00123     typedef ss_typename_param_k stlsoft_ns_qual(operator_bool_generator)<U>::class_type G;          \
00124     typedef ss_typename_param_k G::return_type                                          B
00125 
00126 #endif 
00127 
00128 
00129 
00130 
00131 
00137 template <ss_typename_param_k T>
00138 struct operator_bool_generator
00139 {
00140 public:
00141     typedef operator_bool_generator<T>  class_type;
00142 
00143 #ifdef STLSOFT_CF_OPERATOR_BOOL_AS_OPERATOR_POINTER_TO_MEMBER_SUPPORT
00144     typedef int class_type::*return_type;
00145 
00147     static return_type true_value()
00148     {
00149         return &class_type::i;
00150     }
00151 
00152 private:
00153     int i;
00154 public:
00155 #else
00156     typedef class_type const* return_type;
00157 
00159     static return_type true_value()
00160     {
00161         class_type  t;
00162         void        *p = static_cast<void*>(&t);
00163 
00164         return static_cast<return_type>(p);
00165     }
00166 #endif // STLSOFT_CF_OPERATOR_BOOL_AS_OPERATOR_POINTER_TO_MEMBER_SUPPORT
00167 
00169     static return_type false_value()
00170     {
00171         return static_cast<return_type>(0);
00172     }
00173 
00175 #ifdef STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT
00176     template <ss_typename_param_k U>
00177     static return_type translate(U b)
00178 #else 
00179     static return_type translate(ss_bool_t b)
00180 #endif // STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT
00181     {
00182         return b ? true_value() : false_value();
00183     }
00184 
00185 private:
00186     void operator delete(void*);
00187 };
00188 
00189 
00190 
00191 #ifndef _STLSOFT_NO_NAMESPACE
00192 } 
00193 #endif 
00194 
00195 
00196 
00197 #endif 
00198 
00199