00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef TOOL_STATIC_BASE_HH_
00023 # define TOOL_STATIC_BASE_HH_
00024
00033
00034 namespace tool
00035 {
00036
00042 struct bottom
00043 {
00044 };
00045
00051 struct undefined_type
00052 {
00053 };
00054
00065 template <class Down, class Up>
00066 struct get_exact
00067 {
00068 typedef Down return_type;
00069 };
00070
00075 template <class Up>
00076 struct get_exact<bottom, Up>
00077 {
00078 typedef Up return_type;
00079 };
00080
00081 # define wp_get_exact(Down, Up...) \
00082 typename ::tool::get_exact<Down, Up>::return_type
00083
00152 template <class Bottom>
00153 struct static_base
00154 {
00159 typedef wp_get_exact(Bottom, static_base<Bottom>) exact_type;
00160
00162
00163
00164
00166 const exact_type& exact() const;
00167
00169 exact_type& exact();
00170
00172 const exact_type* exact_ptr() const;
00173
00175 exact_type* exact_ptr();
00177 };
00178
00179 # define wp_inherit(Class, Parent...) Class<wp_get_exact(Bottom, Parent)>
00180
00220 template <class Type>
00221 struct types
00222 {
00223 };
00224
00225 # define wp_type(Type, Base...) typename ::tool::types<Base>::Type
00226
00227 }
00228
00229 # include "static_base.hxx"
00230
00231 #endif // ! TOOL_STATIC_BASE_HH_