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_COMPILER_OPTIMISATION_TRAITS
00049 #define STLSOFT_INCL_STLSOFT_UTIL_HPP_COMPILER_OPTIMISATION_TRAITS
00050 
00051 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00052 # define STLSOFT_VER_H_STLSOFT_COMPILER_OPTIMISATION_TRAITS_MAJOR       4
00053 # define STLSOFT_VER_H_STLSOFT_COMPILER_OPTIMISATION_TRAITS_MINOR       0
00054 # define STLSOFT_VER_H_STLSOFT_COMPILER_OPTIMISATION_TRAITS_REVISION    1
00055 # define STLSOFT_VER_H_STLSOFT_COMPILER_OPTIMISATION_TRAITS_EDIT        21
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 
00079 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00080 
00085 struct compiler_optimisation_traits_ebo_parent
00086 {};
00087 
00088 
00089 
00090 
00101 struct compiler_optimisation_traits_ebo_thin_child
00102     : compiler_optimisation_traits_ebo_parent
00103 {};
00104 
00115 struct compiler_optimisation_traits_ebo_thick_child
00116     : compiler_optimisation_traits_ebo_parent
00117 {
00118     int i;
00119 };
00120 
00126 struct compiler_optimisation_traits_ebo_thick_peer
00127 {
00128     int i;
00129 };
00130 
00144 struct compiler_optimisation_traits_ebo_thin_grandchild
00145     : compiler_optimisation_traits_ebo_thin_child
00146 {};
00147 
00161 struct compiler_optimisation_traits_ebo_thick_grandchild
00162     : compiler_optimisation_traits_ebo_thin_child
00163 {
00164     int i;
00165 };
00166 
00172 struct compiler_optimisation_traits_ebo_parent2
00173 {};
00174 
00185 struct compiler_optimisation_traits_ebo_mi_thin_child
00186     : compiler_optimisation_traits_ebo_parent, compiler_optimisation_traits_ebo_parent2
00187 {};
00188 
00199 struct compiler_optimisation_traits_ebo_mi_thick_child
00200     : compiler_optimisation_traits_ebo_parent, compiler_optimisation_traits_ebo_parent2
00201 {
00202     int i;
00203 };
00204 
00215 struct compiler_optimisation_traits_ebo_mi_mixin_child
00216     : compiler_optimisation_traits_ebo_parent, compiler_optimisation_traits_ebo_thick_peer
00217 {};
00218 
00219 
00220 
00221 
00222 
00228 struct compiler_optimisation_traits_edo_thin_base
00229 {};
00230 
00236 struct compiler_optimisation_traits_edo_thick_base
00237 {
00238     int i;
00239 };
00240 
00246 struct compiler_optimisation_traits_edo_thin_base2
00247 {};
00248 
00254 template <ss_typename_param_k T>
00255 struct compiler_optimisation_traits_edo_child
00256     : T
00257 {};
00258 
00269 struct compiler_optimisation_traits_edo_child_of_thick_base
00270     : compiler_optimisation_traits_edo_thick_base
00271 {};
00272 
00273 
00279 template<   ss_typename_param_k T1
00280         ,   ss_typename_param_k T2
00281         >
00282 struct compiler_optimisation_traits_edo_mi_child
00283     : T1, T2
00284 {};
00285 
00286 #endif 
00287 
00293 struct compiler_optimisation_traits
00294 {
00295 public:
00296     
00297     
00299     enum { supportsEBO1 = sizeof(compiler_optimisation_traits_ebo_thin_child) == sizeof(compiler_optimisation_traits_ebo_parent) };
00301     enum { supportsEBO2 = sizeof(compiler_optimisation_traits_ebo_thick_child) == sizeof(compiler_optimisation_traits_ebo_thick_peer) };
00303     enum { supportsEBO3 = sizeof(compiler_optimisation_traits_ebo_thin_grandchild) == sizeof(compiler_optimisation_traits_ebo_parent) };
00305     enum { supportsEBO4 = sizeof(compiler_optimisation_traits_ebo_thick_grandchild) == sizeof(compiler_optimisation_traits_ebo_thick_peer) };
00307     enum { supportsEBO5 = sizeof(compiler_optimisation_traits_ebo_mi_thin_child) == sizeof(compiler_optimisation_traits_ebo_parent) };
00309     enum { supportsEBO6 = sizeof(compiler_optimisation_traits_ebo_mi_thick_child) == sizeof(compiler_optimisation_traits_ebo_thick_peer) };
00311     enum { supportsEBO7 = sizeof(compiler_optimisation_traits_ebo_mi_mixin_child) == sizeof(compiler_optimisation_traits_ebo_thick_peer) };
00312 
00313     enum { supportsEBO = supportsEBO1 & supportsEBO2 & supportsEBO3 & supportsEBO4 };
00314     enum { supportsMIEBO = supportsEBO5 & supportsEBO6 & supportsEBO7  };
00315     enum { supportsExtendedEBO = supportsEBO & supportsMIEBO };
00316 
00317     
00318     
00320     enum { supportsEDO1 = supportsEBO1 };
00322     enum { supportsEDO2 = sizeof(compiler_optimisation_traits_edo_child<compiler_optimisation_traits_edo_thin_base>) == sizeof(compiler_optimisation_traits_edo_thin_base) };
00324     enum { supportsEDO3 = sizeof(compiler_optimisation_traits_edo_child_of_thick_base) == sizeof(compiler_optimisation_traits_edo_thick_base) };
00326     enum { supportsEDO4 = sizeof(compiler_optimisation_traits_edo_child<compiler_optimisation_traits_edo_thick_base>) == sizeof(compiler_optimisation_traits_edo_thick_base) };
00327 
00329     enum { supportsEDO5 = supportsEBO5 };
00331     enum { supportsEDO6 = sizeof(compiler_optimisation_traits_edo_mi_child<compiler_optimisation_traits_edo_thin_base, compiler_optimisation_traits_edo_thin_base2>) == sizeof(compiler_optimisation_traits_edo_thin_base) };
00333     enum { supportsEDO7 = supportsEBO7 };
00335     enum { supportsEDO8 = sizeof(compiler_optimisation_traits_edo_mi_child<compiler_optimisation_traits_edo_thick_base, compiler_optimisation_traits_edo_thin_base>) == sizeof(compiler_optimisation_traits_edo_thick_base) };
00336 
00337     enum { supportsEDO = supportsEDO1 & supportsEDO2 & supportsEDO3 & supportsEDO4 };
00338     enum { supportsMIEDO = supportsEDO5 & supportsEDO6 & supportsEDO7 & supportsEDO8 };
00339     enum { supportsExtendedEDO = supportsEDO & supportsMIEDO };
00340 };
00341 
00342 
00343 
00344 #ifndef _STLSOFT_NO_NAMESPACE
00345 } 
00346 #endif 
00347 
00348 
00349 
00350 #endif 
00351 
00352