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
00037 #ifndef RC_FALLBACK_INTERFACE_H_
00038 #define RC_FALLBACK_INTERFACE_H_
00039
00040 #include <boost/type_traits/is_empty.hpp>
00041
00042
00043 namespace ReChannel {
00044
00048 template<class T>
00049 inline
00050 T rc_undefined_value()
00051 {
00052 return T();
00053 }
00054
00058 template<class IF>
00059 class rc_fallback_interface
00060 {
00061
00062 };
00063
00067 template<
00068 class IF, bool IF_EXISTS =
00069 !(boost::is_empty<rc_fallback_interface<IF> >::value)
00070 >
00071 class rc_fallback_interface_factory;
00072
00076 template<class IF>
00077 class rc_fallback_interface_factory<IF, true>
00078 {
00079 public:
00080 static inline IF* create()
00081 { return (IF*)(new rc_fallback_interface<IF>()); }
00082
00083 private:
00084 rc_fallback_interface_factory() {}
00085 };
00086
00090 template<class IF>
00091 class rc_fallback_interface_factory<IF, false>
00092 {
00093 public:
00094 static inline IF* create()
00095 { return 0; }
00096
00097 private:
00098 rc_fallback_interface_factory() {}
00099 };
00100
00101 }
00102
00103 #define RC_UNDEFINED_VALUE(value_type, value) \
00104 namespace ReChannel { \
00105 template<> \
00106 inline value_type rc_undefined_value<value_type >() \
00107 { return (value); } \
00108 }
00109
00110 #define RC_FALLBACK_INTERFACE(interface_type) \
00111 template<> \
00112 struct rc_fallback_interface<interface_type> \
00113 : virtual public interface_type
00114
00115 #define RC_FALLBACK_INTERFACE_TEMPLATE(interface_type) \
00116 struct rc_fallback_interface<interface_type > \
00117 : virtual public interface_type
00118
00119 #define RC_FALLBACK_INTERFACE_CTOR(interface_type) \
00120 rc_fallback_interface()
00121
00122 #define RC_FALLBACK_INTERFACE_TEMPLATE_CTOR(interface_type) \
00123 RC_FALLBACK_INTERFACE_CTOR(interface_type)
00124
00125 #endif // RC_FALLBACK_INTERFACE_H_
00126
00127
00128
00129
00130