public static MappingParameter Create(Parameter _p, Component _direct_parent, TypeNode _tn, bool _as_example, bool _match_name, out MappingError err)
        {
            if (!(MappingParameter.PerliminaryMapping(_p, _direct_parent, _tn, _as_example, _match_name, out err)))
            {
                return(null);
            }

            MappingParameter mp = new MappingParameter(_p, _direct_parent, _tn, _as_example);

            _tn.MostRecentMapping = mp;
            return(mp);
        }
        public static List <MappingObject> CreateMultipleFrom(Component _comp, TypeNode _tn, bool _as_example, List <KeyValuePair <string, TypeNode> > _correspondencies, out MappingError err)
        {
            err = MappingError.NONE;
            List <MappingObject> created_mappings = new List <MappingObject>();

            if (_comp == null || _tn == null || _correspondencies == null || _correspondencies.Count < 2)
            {
                err = MappingError.MISSING_MAPPING_END;
                return(created_mappings);
            }

            Component    current_comp = _comp;
            MappingError tmp_err      = MappingError.NONE;

            foreach (var entry in _correspondencies)
            {
                string[] key_comps = entry.Key.Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries);
                if (key_comps == null || key_comps.Length < 2)
                {
                    err = MappingError.MISSING_MAPPING_END;
                    return(created_mappings);
                }

                if ((key_comps[0] + "_") == MappingComponent.PREFIX_COMP)
                {
                    // -------------------------- COMPONENTS --------------------------- //
                    long comp_id = -1;
                    bool success = long.TryParse(key_comps[1], out comp_id);
                    if (!success)
                    {
                        err = MappingError.MISSING_MAPPING_END;
                        return(created_mappings);
                    }

                    if (comp_id != current_comp.ID)
                    {
                        // look for the component in the children of current_comp
                        List <Component> all_sub_comps = current_comp.GetFlatSubCompList();
                        Component        next          = all_sub_comps.FirstOrDefault(x => x.ID == comp_id);
                        if (next == null)
                        {
                            err = MappingError.MISSING_MAPPING_END;
                            return(created_mappings);
                        }
                        else
                        {
                            current_comp = next;
                        }
                    }
                }
                else if ((key_comps[0] + "_") == MappingComponent.PREFIX_ID)
                {
                    // ------------------------ COMPONENT IDS -------------------------- //
                    MappingString ms = MappingString.Create(current_comp, entry.Key, entry.Value, _as_example, out tmp_err);
                    if (tmp_err != MappingError.NONE)
                    {
                        err = tmp_err;
                        return(created_mappings);
                    }
                    else
                    {
                        created_mappings.Add(ms);
                    }
                }
                else if ((key_comps[0] + "_") == MappingComponent.PREFIX_PARAM)
                {
                    // -------------------------- PARAMETERS --------------------------- //
                    long param_id = -1;
                    bool success  = long.TryParse(key_comps[1], out param_id);
                    if (!success || !current_comp.ContainedParameters.ContainsKey(param_id))
                    {
                        err = MappingError.MISSING_MAPPING_END;
                        return(created_mappings);
                    }
                    Parameter        p  = current_comp.ContainedParameters[param_id];
                    MappingParameter mp = MappingParameter.Create(p, current_comp, entry.Value, _as_example, false, out tmp_err);
                    if (tmp_err != MappingError.NONE)
                    {
                        err = tmp_err;
                        return(created_mappings);
                    }
                    else
                    {
                        created_mappings.Add(mp);
                    }
                }
                else if ((key_comps[0] + "_") == MappingComponent.PREFIX_P3DC)
                {
                    // --------------------------- GEOMETRY ---------------------------- //
                    if (key_comps.Length < 3)
                    {
                        err = MappingError.MISSING_MAPPING_END;
                        return(created_mappings);
                    }
                    long id_primary = -1;
                    int  id_second  = -1;
                    bool success_1  = long.TryParse(key_comps[1], out id_primary);
                    bool success_2  = int.TryParse(key_comps[2], out id_second);
                    if (!success_1 || !success_2)
                    {
                        err = MappingError.MISSING_MAPPING_END;
                        return(created_mappings);
                    }
                    GeometricRelationship gr = current_comp.R2GInstances.FirstOrDefault(x => x.ID == id_primary);
                    if (gr == null)
                    {
                        err = MappingError.MISSING_MAPPING_END;
                        return(created_mappings);
                    }
                    Point3DContainer p3dc = gr.GeometricContent.FirstOrDefault(x => x.ID_primary == id_primary && x.ID_secondary == id_second) as Point3DContainer;
                    if (p3dc == null)
                    {
                        err = MappingError.MISSING_MAPPING_END;
                        return(created_mappings);
                    }

                    MappingSinglePoint msp = MappingSinglePoint.Create(p3dc, current_comp, entry.Value, _as_example, out tmp_err);
                    if (tmp_err != MappingError.NONE)
                    {
                        err = tmp_err;
                        return(created_mappings);
                    }
                    else
                    {
                        created_mappings.Add(msp);
                    }
                }
            }

            return(created_mappings);
        }