summaryrefslogtreecommitdiff
path: root/libcult/cult/cli/mapper.hxx.m4
blob: 7ac67600edc0b16960edd514a1ba5874b605114c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
divert(-1)

# file      : cult/cli/mapper.hxx.m4
# author    : Boris Kolpackov <boris@kolpackov.net>
# copyright : Copyright (c) 2005-2010 Boris Kolpackov
# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file

define(`N', 100)

define(`forloop',
  `pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')

define(`_forloop',
  `$4`'ifelse($1, `$3', ,
    `define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')

define(`specialization',`
template
<
forloop(`i', 1, $1, `  char const* x`'i, typename Y`'i`'ifelse(i, $1, ,`,')
')dnl
>
struct Mapper
<
forloop(`i', 1, $1, `  x`'i, Y`'i,
')dnl
forloop(`i', $1, N, `  null, Null`'ifelse(i, N, ,`,')
')dnl
>
{
`#ifdef __GNUC__'
forloop(`i', 1, $1, `  static Y`'i f (Tag<x`'i>*);
')dnl

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
`#else'
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,ifelse($1, 1, ` Void', `
    typename Mapper
    <
forloop(`i', 2, $1, `      x`'i, Y`'i`'ifelse(i, $1, ,`,')
')    >::template Selector<x>::Type')>::Type Type;
  };
`#endif'
};
')

divert(0)dnl

template
<
forloop(`i', 1, incr(N),
  `  char const* x`'i`'ifelse(i, 1, ,`= null'), dnl
typename Y`'i`'ifelse(i, 1, ,`= Null')`'ifelse(i, incr(N), ,`,')
')dnl
>
struct Mapper;

forloop(`n', 1, N, `specialization(n)')