Beispiel #1
0
        internal static void SetField <T>(t_field_type accessor, string fieldName, int field_name_idx, T value)
        {
            uint member_id;

            int field_divider_idx = fieldName.IndexOf('.', field_name_idx);

            if (-1 != field_divider_idx)
            {
                string member_name_string = fieldName.Substring(field_name_idx, field_divider_idx - field_name_idx);
                if (!FieldLookupTable_t_field_name.TryGetValue(member_name_string, out member_id))
                {
                    Throw.undefined_field();
                }

                switch (member_id)
                {
                /*FOREACH*/
                /*USE_LIST("t_member")*/
                /*  IF("$t_member_type->is_struct()")*/
                case t_uint:
                    GenericFieldAccessor.SetField(accessor.t_member_name, fieldName, field_divider_idx + 1, value);
                    break;

                /*  END*/
                /*END*/
                default:
                    // @note   We cannot go further unless it's a struct.
                    //         Throw exception now.
                    Throw.member_access_on_non_struct__field(member_name_string);
                    break;
                }
                return;
            }

            fieldName = fieldName.Substring(field_name_idx);
            if (!FieldLookupTable_t_field_name.TryGetValue(fieldName, out member_id))
            {
                Throw.undefined_field();
            }
            switch (member_id)
            {
            /*FOREACH*/
            /*USE_LIST("t_member")*/
            case t_uint:
            {
                t_field_type_2 conversion_result = TypeConverter <T> .ConvertTo_t_field_type_2_display(value);

                MODULE_CALL("ValueToAccessorFieldAssignment", "$t_member", "\"accessor\"", "\"conversion_result\"");
                break;
            }
                /*END*/
            }
        }
 internal static unsafe bool TryParse_t_field_type_2_display(t_field_type value, out t_field_type_2 intermediate_result)
 {
     throw new NotImplementedException();
 }
            /// <summary>
            /// ONLY VALID FOR TC_CONVERTLIST AND TC_ARRAYTOLIST.
            /// </summary>
            IEnumerable <t_field_type> ITypeConverter <t_field_type_2> .Enumerate_t_field_type_display(t_field_type_2 value)
            {
                //META_VAR("TypeConversionAction", "action", "$t_field_type->get_type_conversion_action($t_field_type_2)");
                IF("$t_field_type_2->is_list() && $t_field_type->is_convertible_from($t_field_type_2->listElementType)");
                foreach (var element in value)
                {
                    yield return(TypeConverter <t_field_type> .ConvertFrom_t_field_type_2_element_type_display(element));
                }
                ELIF("$t_field_type_2->is_array() && $t_field_type->is_convertible_from($t_field_type_2->arrayInfo.arrayElement)");
                {
                    MUTE();
                    int t_array_iterator_length = 1;
                    MUTE_END();
                    MAP_VAR("t_field_type_2_array_element_type_display", "Trinity::Codegen::GetDataTypeDisplayString($$->arrayInfo.arrayElement)", MemberOf = "t_field_type_2");
                    MAP_LIST("t_array_iterator_list", "arrayInfo.array_dimension_size", MemberOf = "t_field_type_2");
                    MAP_VAR("t_array_iterator_prefix", "Trinity::Codegen::GetDataTypeDisplayString($$->arrayInfo.arrayElement)", MemberOf = "t_field_type_2");
                    MAP_VAR("t_array_iterator_length", "", MemberOf = "t_array_iterator_list");
                    MAP_VAR("t_array_iterator_string", "t_array_iterator_prefix + '_' + GetString(GET_ITERATOR_VALUE()) + Discard($$)", MemberOf = "t_array_iterator_list");

                    FOREACH();
                    for (int t_array_iterator_string = 0; t_array_iterator_string < t_array_iterator_length; ++t_array_iterator_string)
                    /*END*/
                    {
                        IF("$t_field_type->is_assignable_from($t_field_type_2->arrayInfo.arrayElement)");
                        yield return(value[/*FOREACH(",")*/ t_array_iterator_string /*END*/]);

                        ELSE();
                        yield return(TypeConverter <t_field_type> .ConvertFrom_t_field_type_2_array_element_type_display(value[/*FOREACH(",")*/ t_array_iterator_string /*END*/]));

                        END();
                    }
                }
                END();
                yield break;
            }
 t_field_type ITypeConverter <t_field_type_2> .ConvertTo_t_field_type_display(t_field_type_2 value)
 {
     return(TypeConverter <t_field_type> .ConvertFrom_t_field_type_2_display(value));
 }
            t_field_type_2 ITypeConverter <t_field_type_2> .ConvertFrom_t_field_type_display(t_field_type value)
            {
                META_VAR("TypeConversionAction", "conversion_action", "$t_field_type_2->get_type_conversion_action($t_field_type)");
                IF("%conversion_action == TypeConversionAction::TC_ASSIGN");
                return((t_field_type_2)value);

                ELIF("%conversion_action == TypeConversionAction::TC_TOSTRING");
                return(Serializer.ToString(value));

                ELIF("%conversion_action == TypeConversionAction::TC_PARSESTRING");
                {
                    #region String parse
                    t_field_type_2 intermediate_result;
                    bool           conversion_success;
                    IF("data_type_need_external_parser($t_field_type_2)");
                    {
                        conversion_success = ExternalParser.TryParse_t_field_type_2_display(value, out intermediate_result);
                    }
                    ELSE();
                    {
                        conversion_success = t_field_type_2.TryParse(value, out intermediate_result);
                    }
                    END();
                    if (!conversion_success)
                    {
                        IF("$t_field_type_2->is_list()");
                        try
                        {
                            t_field_type_2_element_type element = TypeConverter <t_field_type_2_element_type> .ConvertFrom_t_field_type_display(value);

                            intermediate_result = new t_field_type_2();
                            intermediate_result.Add(element);
                        }
                        catch
                        {
                            throw new ArgumentException("Cannot parse \"" + value + "\" into either 't_field_type_2' or 't_field_type_2_element_type'.");
                        }
                        ELSE();
                        Throw.cannot_parse(value, "t_field_type_2");
                        END();
                    }
                    return(intermediate_result);

                    #endregion
                }
                ELIF("%conversion_action == TypeConversionAction::TC_TOBOOL");
                return(value != 0);

                ELIF("%conversion_action == TypeConversionAction::TC_CONVERTLIST");
                {
                    t_field_type_2 intermediate_result = new t_field_type_2();
                    foreach (var element in value)
                    {
                        intermediate_result.Add(TypeConverter <t_field_type_2_element_type> .ConvertFrom_t_field_type_element_type_display(element));
                    }
                    return(intermediate_result);
                }
                ELIF("%conversion_action == TypeConversionAction::TC_WRAPINLIST");
                {
                    t_field_type_2 intermediate_result = new t_field_type_2();
                    intermediate_result.Add(TypeConverter <t_field_type_2_element_type> .ConvertFrom_t_field_type_display(value));
                    return(intermediate_result);
                }
                ELIF("%conversion_action == TypeConversionAction::TC_ARRAYTOLIST");
                return(TypeConverter <t_field_type> .Enumerate_t_field_type_2_element_type_display(value).ToList());

                ELIF("%conversion_action == TypeConversionAction::TC_EXTRACTNULLABLE");
                return(TypeConverter <t_field_type_2> .ConvertFrom_t_field_type_remove_nullable(value.Value));

                ELSE();
                throw new InvalidCastException("Invalid cast from '[META_OUTPUT($t_field_type)]' to '[META_OUTPUT($t_field_type_2)]'.");
                END();
            }