~brian-sidebotham/wxwidgets-cmake/wxpython-2.9.4

« back to all changes in this revision

Viewing changes to include/wx/meta/if.h

  • Committer: Brian Sidebotham
  • Date: 2013-08-03 14:30:08 UTC
  • Revision ID: brian.sidebotham@gmail.com-20130803143008-c7806tkych1tp6fc
Initial import into Bazaar

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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: if.h 61724 2009-08-21 10:41:26Z VZ $
 
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_