Example #1
0
        public void GenerateClassGenericMethods(Class @class)
        {
            Indent();
            foreach (var template in @class.Templates)
            {
                if (!template.IsGenerated)
                {
                    continue;
                }

                var functionTemplate = template as FunctionTemplate;
                if (functionTemplate == null)
                {
                    continue;
                }

                PushBlock(BlockKind.Template);

                var function = functionTemplate.TemplatedFunction;

                var typePrinter = new CLITypePrinter(Context);
                typePrinter.PushContext(TypePrinterContextKind.Template);

                var retType = function.ReturnType.Visit(typePrinter);

                var typeNames  = "";
                var paramNames = template.Parameters.Select(param => param.Name).ToList();
                if (paramNames.Any())
                {
                    typeNames = "typename " + string.Join(", typename ", paramNames);
                }

                Write("generic<{0}>", typeNames);

                // Process the generic type constraints
                var constraints = new List <string>();
                foreach (var param in template.Parameters.OfType <TypeTemplateParameter>())
                {
                    if (string.IsNullOrWhiteSpace(param.Constraint))
                    {
                        continue;
                    }
                    constraints.Add(string.Format("{0} : {1}", param.Name,
                                                  param.Constraint));
                }

                if (constraints.Any())
                {
                    Write(" where {0}", string.Join(", ", constraints));
                }

                NewLine();

                WriteLine("{0} {1}({2});", retType, function.Name,
                          GenerateParametersList(function.Parameters));

                PopBlock(NewLineKind.BeforeNextBlock);
            }
            Unindent();
        }
Example #2
0
        private void GenerateFunctionTemplate(FunctionTemplate template)
        {
            PushBlock(BlockKind.Template);

            var function = template.TemplatedFunction;

            var typePrinter = new CLITypePrinter(Context)
            {
                Declaration = template
            };

            typePrinter.PushContext(TypePrinterContextKind.Template);

            var retType = function.ReturnType.Visit(typePrinter);

            var typeNames  = "";
            var paramNames = template.Parameters.Select(param => param.Name).ToList();

            if (paramNames.Any())
            {
                typeNames = "typename " + string.Join(", typename ", paramNames);
            }

            WriteLine("generic<{0}>", typeNames);
            WriteLine("{0} {1}::{2}({3})", retType,
                      QualifiedIdentifier(function.Namespace), function.Name,
                      GenerateParametersList(function.Parameters));

            WriteStartBraceIndent();

            var @class = function.Namespace as Class;

            GenerateFunctionCall(function, @class);

            WriteCloseBraceIndent();
            NewLine();

            PopBlock(NewLineKind.BeforeNextBlock);
        }