1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Licensed under the Apache License, Version 2.0 (the "License");
3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// you may not use this file except in compliance with the License.
4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// You may obtain a copy of the License at
5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//     http://www.apache.org/licenses/LICENSE-2.0
7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Unless required by applicable law or agreed to in writing, software
9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// distributed under the License is distributed on an "AS IS" BASIS,
10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// See the License for the specific language governing permissions and
12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// limitations under the License.
13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Copyright 2005-2010 Google, Inc.
15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Author: jpr@google.com (Jake Ratkiewicz)
16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Convenience templates for defining arg packs for the FstClass operations.
18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// See operation-templates.h for a discussion about why these are needed; the
20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// short story is that all FstClass operations must be implemented by a version
21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// that takes one argument, most likely a struct bundling all the
22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// logical arguments together. These template structs provide convenient ways
23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// to specify these bundles (e.g. by means of appropriate typedefs).
24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// The ArgPack template is sufficient for bundling together all the args for
26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// a particular function. The function is assumed to be void-returning. If
27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// you want a space for a return value, use the WithReturnValue template
28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// as follows:
29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WithReturnValue<bool, ArgPack<...> >
31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_SCRIPT_ARG_PACKS_H_
33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_SCRIPT_ARG_PACKS_H_
34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst {
36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace script {
37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace args {
38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Sentinel value that means "no arg here."
40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass none_type { };
41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Base arg pack template class. Specializations follow that allow
43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// fewer numbers of arguments (down to 2). If the maximum number of arguments
44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// increases, you will need to change three things:
45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//   1) Add more template parameters to this template
46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//   2) Add more specializations to allow fewer numbers of parameters than
47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//      the new max.
48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//   3) Add extra none_types to all existing specializations to fill
49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//      the new slots.
50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 9 args (max)
53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class T1,
54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T2 = none_type,
55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T3 = none_type,
56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T4 = none_type,
57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T5 = none_type,
58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T6 = none_type,
59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T7 = none_type,
60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T8 = none_type,
61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T9 = none_type>
62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct Package {
63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T1 arg1;
64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T2 arg2;
65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T3 arg3;
66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T4 arg4;
67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T5 arg5;
68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T6 arg6;
69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T7 arg7;
70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T8 arg8;
71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T9 arg9;
72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6,
74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson          T7 arg7, T8 arg8, T9 arg9) :
75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5),
76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg6(arg6), arg7(arg7), arg8(arg8), arg9(arg9) { }
77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 8 args
80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class T1,
81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T2,
82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T3,
83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T4,
84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T5,
85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T6,
86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T7,
87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T8>
88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct Package<T1, T2, T3, T4, T5, T6, T7, T8, none_type> {
89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T1 arg1;
90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T2 arg2;
91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T3 arg3;
92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T4 arg4;
93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T5 arg5;
94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T6 arg6;
95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T7 arg7;
96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T8 arg8;
97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6,
99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson          T7 arg7, T8 arg8) :
100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5),
101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg6(arg6), arg7(arg7), arg8(arg8) { }
102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 7 args
105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class T1,
106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T2,
107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T3,
108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T4,
109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T5,
110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T6,
111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T7>
112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct Package<T1, T2, T3, T4, T5, T6, T7,
113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson               none_type, none_type> {
114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T1 arg1;
115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T2 arg2;
116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T3 arg3;
117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T4 arg4;
118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T5 arg5;
119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T6 arg6;
120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T7 arg7;
121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6,
123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson          T7 arg7) :
124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5),
125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg6(arg6), arg7(arg7) { }
126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 6 args
129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class T1,
130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T2,
131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T3,
132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T4,
133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T5,
134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T6>
135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct Package<T1, T2, T3, T4, T5, T6, none_type,
136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson               none_type, none_type> {
137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T1 arg1;
138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T2 arg2;
139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T3 arg3;
140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T4 arg4;
141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T5 arg5;
142f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T6 arg6;
143f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
144f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) :
145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5),
146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg6(arg6) { }
147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 5 args
150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class T1,
151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T2,
152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T3,
153f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T4,
154f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T5>
155f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct Package<T1, T2, T3, T4, T5, none_type, none_type,
156f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson               none_type, none_type> {
157f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T1 arg1;
158f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T2 arg2;
159f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T3 arg3;
160f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T4 arg4;
161f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T5 arg5;
162f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
163f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) :
164f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5) { }
165f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
166f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
167f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 4 args
168f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class T1,
169f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T2,
170f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T3,
171f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T4>
172f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct Package<T1, T2, T3, T4, none_type, none_type,
173f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson               none_type, none_type, none_type> {
174f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T1 arg1;
175f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T2 arg2;
176f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T3 arg3;
177f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T4 arg4;
178f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
179f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4) :
180f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) { }
181f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
182f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
183f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 3 args
184f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class T1,
185f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T2,
186f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T3>
187f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct Package<T1, T2, T3, none_type, none_type,
188f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson               none_type, none_type, none_type,
189f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson               none_type> {
190f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T1 arg1;
191f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T2 arg2;
192f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T3 arg3;
193f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
194f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Package(T1 arg1, T2 arg2, T3 arg3) :
195f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg1(arg1), arg2(arg2), arg3(arg3) { }
196f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
197f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
198f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 2 args (minimum)
199f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class T1,
200f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson         class T2>
201f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct Package<T1, T2, none_type, none_type,
202f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson               none_type, none_type, none_type,
203f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson               none_type, none_type> {
204f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T1 arg1;
205f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  T2 arg2;
206f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
207f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Package(T1 arg1, T2 arg2) :
208f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      arg1(arg1), arg2(arg2) { }
209f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
210f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
211f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Tack this on to an existing arg pack to add a return value.
212f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// The syntax for accessing the args is then slightly more stilted,
213f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// as you must do an extra member access (since the args are stored
214f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// as a member of this class).
215f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// The alternative is to declare another slew of templates for functions
216f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// that return a value, analogous to the above.
217f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
218f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class Retval, class ArgPackage>
219f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct WithReturnValue {
220f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Retval retval;
221f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  const ArgPackage &args;
222f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
223f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  explicit WithReturnValue(const ArgPackage &args) : args(args) { }
224f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
225f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
226f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// We don't want to store a reference to a reference, if ArgPackage is
227f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// already some reference type.
228f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class Retval, class ArgPackage>
229f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct WithReturnValue<Retval, ArgPackage&> {
230f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Retval retval;
231f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  const ArgPackage &args;
232f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
233f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  explicit WithReturnValue(const ArgPackage &args) : args(args) { }
234f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
235f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
236f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}  // namespace args
237f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}  // namespace script
238f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}  // namespace fst
239f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
240f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif  // FST_SCRIPT_ARG_PACKS_H_
241