| 1 | ///////////////////////////////////////////////////////////////////////////// |
| 2 | // Name: wx/meta/if.h |
| 3 | // Purpose: declares wxIf<> metaprogramming construct |
| 4 | // Author: Vaclav Slavik |
| 5 | // Created: 2008-01-22 |
| 6 | // RCS-ID: $Id$ |
| 7 | // Copyright: (c) 2008 Vaclav Slavik |
| 8 | // Licence: wxWindows licence |
| 9 | ///////////////////////////////////////////////////////////////////////////// |
| 10 | |
| 11 | #ifndef _WX_META_IF_H_ |
| 12 | #define _WX_META_IF_H_ |
| 13 | |
| 14 | #include "wx/defs.h" |
| 15 | |
| 16 | // NB: This code is intentionally written without partial templates |
| 17 | // specialization, because some older compilers (notably VC6) don't |
| 18 | // support it. |
| 19 | |
| 20 | namespace wxPrivate |
| 21 | { |
| 22 | |
| 23 | template <bool Cond> |
| 24 | struct wxIfImpl |
| 25 | |
| 26 | // broken VC6 needs not just an incomplete template class declaration but a |
| 27 | // "skeleton" declaration of the specialized versions below as it apparently |
| 28 | // tries to look up the types in the generic template definition at some moment |
| 29 | // even though it ends up by using the correct specialization in the end -- but |
| 30 | // without this skeleton it doesn't recognize Result as a class at all below |
| 31 | #if defined(__VISUALC__) && !wxCHECK_VISUALC_VERSION(7) |
| 32 | { |
| 33 | template<typename TTrue, typename TFalse> struct Result {}; |
| 34 | } |
| 35 | #endif // VC++ <= 6 |
| 36 | ; |
| 37 | |
| 38 | // specialization for true: |
| 39 | template <> |
| 40 | struct wxIfImpl<true> |
| 41 | { |
| 42 | template<typename TTrue, typename TFalse> struct Result |
| 43 | { |
| 44 | typedef TTrue value; |
| 45 | }; |
| 46 | }; |
| 47 | |
| 48 | // specialization for false: |
| 49 | template<> |
| 50 | struct wxIfImpl<false> |
| 51 | { |
| 52 | template<typename TTrue, typename TFalse> struct Result |
| 53 | { |
| 54 | typedef TFalse value; |
| 55 | }; |
| 56 | }; |
| 57 | |
| 58 | } // namespace wxPrivate |
| 59 | |
| 60 | // wxIf<> template defines nested type "value" which is the same as |
| 61 | // TTrue if the condition Cond (boolean compile-time constant) was met and |
| 62 | // TFalse if it wasn't. |
| 63 | // |
| 64 | // See wxVector<T> in vector.h for usage example |
| 65 | template<bool Cond, typename TTrue, typename TFalse> |
| 66 | struct wxIf |
| 67 | { |
| 68 | typedef typename wxPrivate::wxIfImpl<Cond> |
| 69 | ::template Result<TTrue, TFalse>::value |
| 70 | value; |
| 71 | }; |
| 72 | |
| 73 | #endif // _WX_META_IF_H_ |