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