protected virtual AbstractTypeDefinition CreateTemplateOneTypeParamType(TypedefDefinition typedef)
        {
            if (typedef.IsSharedPtr)
            {
                return(new DefSharedPtr(typedef.Namespace, typedef.SurroundingClass, typedef.DefiningXmlElement));
            }

            if (AbstractCodeProducer.IsIteratorWrapper(typedef))
            {
                return(new DefIterator(typedef.Namespace, typedef.SurroundingClass, typedef.DefiningXmlElement));
            }

            if (typedef.BaseTypeName.StartsWith("TRect"))
            {
                return(new DefTRect(typedef.Namespace, typedef.SurroundingClass, typedef.DefiningXmlElement));
            }

            return(CreateSTLCollectionType(typedef));
        }
        /// <summary>
        /// Generates the code for all types (enums, classes, typedefs, ...) that are nested within the current class.
        /// </summary>
        /// <seealso cref="GenerateCodePreNestedTypes"/>
        /// <seealso cref="GenerateCodePostNestedTypes"/>
        protected virtual void GenerateCodeAllNestedTypes()
        {
            List <AbstractTypeDefinition> enums            = new List <AbstractTypeDefinition>();
            List <AbstractTypeDefinition> nativePtrClasses = new List <AbstractTypeDefinition>();
            List <AbstractTypeDefinition> typedefs         = new List <AbstractTypeDefinition>();
            List <AbstractTypeDefinition> otherTypes       = new List <AbstractTypeDefinition>();

            // Only output nested types on interfaces if we are the abstract class
            if (_classDefinition.IsInterface && !((this is IncOverridableClassProducer) || (this is OverridableClassCppProducer)))
            {
                return;
            }

            foreach (AbstractTypeDefinition nested in _classDefinition.NestedTypes)
            {
                if (nested.ProtectionLevel == ProtectionLevel.Public ||
                    ((AllowProtectedMembers || AllowSubclassing) &&
                     nested.ProtectionLevel == ProtectionLevel.Protected))
                {
                    if (nested is EnumDefinition)
                    {
                        enums.Add(nested);
                    }
                    else if (Wrapper.IsTypeWrappable(nested))
                    {
                        if (nested.HasWrapType(WrapTypes.NativePtrValueType))
                        {
                            if (nested.HasAttribute <DefinitionIndexAttribute>())
                            {
                                nativePtrClasses.Insert(nested.GetAttribute <DefinitionIndexAttribute>().Index, nested);
                            }
                            else
                            {
                                nativePtrClasses.Add(nested);
                            }
                        }
                        else if (nested is TypedefDefinition)
                        {
                            typedefs.Add(nested);
                        }
                        else
                        {
                            otherTypes.Add(nested);
                        }
                    }
                }
            }

            // Add typedefs for value types
            foreach (TypedefDefinition nested in typedefs)
            {
                if (nested.BaseType.Name == "uint32" || nested.BaseType.HasAttribute <ValueTypeAttribute>())
                {
                    GenerateCodeNestedType(nested);
                }
            }

            foreach (AbstractTypeDefinition nested in enums)
            {
                GenerateCodeNestedType(nested);
            }

            foreach (AbstractTypeDefinition nested in nativePtrClasses)
            {
                GenerateCodeNestedType(nested);
            }

            foreach (AbstractTypeDefinition nested in otherTypes)
            {
                GenerateCodeNestedType(nested);
            }

            List <AbstractTypeDefinition> iterators = new List <AbstractTypeDefinition>();

            //Add typedefs after class declarations
            foreach (TypedefDefinition nested in typedefs)
            {
                if (nested.BaseType.Name == "uint32" || nested.BaseType.HasAttribute <ValueTypeAttribute>())
                {
                    continue;
                }

                if (AbstractCodeProducer.IsIteratorWrapper((TypedefDefinition)nested))
                {
                    iterators.Add(nested);
                }
                else
                {
                    GenerateCodeNestedType(nested);
                }
            }

            //Add iterators last
            foreach (AbstractTypeDefinition nested in iterators)
            {
                GenerateCodeNestedType(nested);
            }

            // Exit out here if this is CPP
            if ((this is OverridableClassCppProducer))
            {
                return;
            }

            //Add STL wrappers for fields that doesn't have proper typedefs

            List <string> stls = new List <string>();

            foreach (MemberDefinitionBase m in _classDefinition.Members)
            {
                if ((m is MemberFieldDefinition || (m is MemberMethodDefinition && (m as MemberMethodDefinition).IsDeclarableFunction)) &&
                    !m.IsIgnored &&
                    (m.ProtectionLevel == ProtectionLevel.Public ||
                     ((AllowSubclassing || AllowProtectedMembers) && m.ProtectionLevel == ProtectionLevel.Protected)))
                {
                    if (m.MemberType.IsUnnamedSTLContainer &&
                        !stls.Contains(m.MemberType.CLRName))
                    {
                        GenerateCodeNestedType(m.MemberType);
                        stls.Add(m.MemberType.CLRName);
                    }
                }
            }

            foreach (ClassDefinition iface in _interfaces)
            {
                if (iface == _classDefinition)
                {
                    continue;
                }

                foreach (MemberDefinitionBase m in iface.Members)
                {
                    if ((m is MemberFieldDefinition || (m is MemberMethodDefinition && (m as MemberMethodDefinition).IsDeclarableFunction)) &&
                        !m.IsIgnored &&
                        (m.ProtectionLevel == ProtectionLevel.Public ||
                         ((AllowSubclassing || AllowProtectedMembers) && m.ProtectionLevel == ProtectionLevel.Protected)))
                    {
                        if (m.MemberType.IsUnnamedSTLContainer &&
                            !stls.Contains(m.MemberType.CLRName))
                        {
                            GenerateCodeNestedType(m.MemberType);
                            stls.Add(m.MemberType.CLRName);
                        }
                    }
                }
            }
        }