From: William F. <wsf...@us...> - 2004-10-16 20:37:34
|
Update of /cvsroot/swig/SWIG/Source/CParse In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28808/Source/CParse Modified Files: templ.c Log Message: templated function overloading support Index: templ.c =================================================================== RCS file: /cvsroot/swig/SWIG/Source/CParse/templ.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** templ.c 5 Oct 2004 00:19:25 -0000 1.12 --- templ.c 16 Oct 2004 20:37:24 -0000 1.13 *************** *** 282,286 **** Parm *tp = Getattr(n,"templateparms"); Parm *p = tparms; ! /* Printf(stdout,"%s\n", ParmList_str(tp)); */ if (tp) { --- 282,286 ---- Parm *tp = Getattr(n,"templateparms"); Parm *p = tparms; ! /* Printf(stdout,"%s\n", ParmList_str_defaultargs(tp)); */ if (tp) { *************** *** 382,392 **** /* ----------------------------------------------------------------------------- ! * cparse_template_locate() * * Search for a template that matches name with given parameters. * ----------------------------------------------------------------------------- */ ! Node * ! Swig_cparse_template_locate(String *name, Parm *tparms) { Node *n; String *tname, *rname = 0; --- 382,392 ---- /* ----------------------------------------------------------------------------- ! * template_locate() * * Search for a template that matches name with given parameters. * ----------------------------------------------------------------------------- */ ! static Node * ! template_locate(String *name, Parm *tparms) { Node *n; String *tname, *rname = 0; *************** *** 544,548 **** Delete(mpartials); if ((template_debug) && (n)) { ! Printf(stdout,"Node: %x\n", n); Swig_print_node(n); } --- 544,548 ---- Delete(mpartials); if ((template_debug) && (n)) { ! Printf(stdout,"Node: %p\n", n); Swig_print_node(n); } *************** *** 552,554 **** --- 552,608 ---- + /* ----------------------------------------------------------------------------- + * Swig_cparse_template_locate() + * + * Search for a template that matches name with given parameters. + * For templated classes finds the specialized template should there be one. + * For templated functions finds the unspecialized template even if a specialized + * template exists. + * ----------------------------------------------------------------------------- */ + + Node * + Swig_cparse_template_locate(String *name, Parm *tparms) { + Node *n = 0; + n = template_locate(name, tparms); /* this function does what we want for templated classes */ + + if (n) { + int isclass = 0; + assert(Strcmp(nodeType(n),"template") == 0); + isclass = (Strcmp(Getattr(n,"templatetype"),"class") == 0); + if (!isclass) { + /* If not a templated class we must have a templated function. + The template found is not necessarily the one we want when dealing with templated + functions. We don't want any specialized templated functions as they won't have + the default parameters. Lets look for the unspecialized template. Also make sure + the number of template parameters is correct as it is possible to overload a + templated function with different numbers of template parameters. */ + + if (template_debug) { + Printf(stdout," Not a templated class, seeking most appropriate templated function\n"); + } + + n = Swig_symbol_clookup_local(name,0); + while (n) { + Parm *tparmsfound = Getattr(n,"templateparms"); + if (ParmList_len(tparms) == ParmList_len(tparmsfound)) { + /* successful match */ + break; + } + /* repeat until we find a match with correct number of templated parameters */ + n = Getattr(n,"sym:nextSibling"); + } + + if (!n) { + Swig_error(cparse_file, cparse_line, "Template '%s' undefined.\n", name); + } + + if ((template_debug) && (n)) { + Printf(stdout,"Templated function found: %p\n", n); + Swig_print_node(n); + } + } + } + + return n; + } |