コード例 #1
0
        private static EnumThunkReaderDelegate <EnumType> CreateFindFlagsEnumThunkReader(IReadOnlyList <Tuple <string, object> > names)
        {
            var thunkReaderRef = typeof(ThunkReader).MakeByRefType();

            var underlyingType = Enum.GetUnderlyingType(typeof(EnumType));

            var resultValue = "result_value";

            var nameToResults =
                names
                .Select(name =>
                        NameAutomata <EnumType> .CreateName(
                            thunkReaderRef,
                            name.Item1,
                            emit =>
            {
                LoadConstantOfType(emit, name.Item2, underlyingType);
                emit.LoadLocal(resultValue);
                emit.Or();
                emit.StoreLocal(resultValue);
            }))
                .ToList();

            var underlyingDefault = underlyingType.DefaultValue();

            var ret =
                NameAutomata <EnumType> .CreateFold <EnumThunkReaderDelegate <EnumType> >(
                    thunkReaderRef,
                    nameToResults,
                    emit =>
            {
                emit.DeclareLocal(underlyingType, resultValue);
                LoadConstantOfType(emit, Convert.ChangeType(0, underlyingType), underlyingType);
                emit.StoreLocal(resultValue);
            },
                    emit =>
            {
                emit.LoadLocal(resultValue);
                emit.Return();
            },
                    true,
                    true,
                    false,
                    defaultValue : underlyingDefault
                    );

            return((EnumThunkReaderDelegate <EnumType>)ret);
        }
コード例 #2
0
        private static Func <TextReader, EnumType> CreateFindFlagsEnum(IReadOnlyList <Tuple <string, object> > names)
        {
            var underlyingType = Enum.GetUnderlyingType(typeof(EnumType));

            var resultValue = "result_value";

            var nameToResults =
                names
                .Select(name =>
                        NameAutomata <EnumType> .CreateName(
                            typeof(TextReader),
                            name.Item1,
                            emit =>
            {
                LoadConstantOfType(emit, name.Item2, underlyingType);
                emit.LoadLocal(resultValue);
                emit.Or();
                emit.StoreLocal(resultValue);
            }))
                .ToList();


            var ret =
                NameAutomata <EnumType> .CreateFold <Func <TextReader, EnumType> >(
                    typeof(TextReader),
                    nameToResults,
                    emit =>
            {
                emit.DeclareLocal(underlyingType, resultValue);
                LoadConstantOfType(emit, 0, underlyingType);
                emit.StoreLocal(resultValue);
            },
                    emit =>
            {
                emit.LoadLocal(resultValue);
                emit.Return();
            },
                    true,
                    true,
                    false,
                    defaultValue : null
                    );

            return((Func <TextReader, EnumType>)ret);
        }