Merge pull request #1333 from jschueller/patch-1

[Python] Fix -Wstringop-overflow warning
diff --git a/CHANGES.current b/CHANGES.current
index 36712fe..b51ce02 100644
--- a/CHANGES.current
+++ b/CHANGES.current
@@ -7,6 +7,17 @@
 Version 4.0.0 (in progress)
 ===========================
 
+2018-10-09: wsfulton
+	    [D, Go, Guile, Lua, Mzscheme, Ocaml, Perl5, Php, Scilab, Tcl]
+            Allow wrapping of std::map using non-default comparison function.
+
+2018-10-09: vadz
+            [Java] #1274 Allow wrapping of std::map using non-default comparison function.
+
+2018-10-04: wsfulton
+            [Python] #1126 Fix C default arguments with -builtin and -fastunpack and -modernargs.
+            Problem occurred when there is just one (defaulted) parameter in the parameter list.
+
 2018-09-24: wsfulton
             [Python] #1319 C++11 hash tables implementation is finished now (including for -builtin):
               std::unordered_map
diff --git a/Doc/Manual/Typemaps.html b/Doc/Manual/Typemaps.html
index ed5591d..78c7036 100644
--- a/Doc/Manual/Typemaps.html
+++ b/Doc/Manual/Typemaps.html
@@ -364,7 +364,7 @@
 <p>
 In this case, the typemap is still applied to the proper arguments even though typenames don't always
 match the text "int".  This ability to track types is a critical part of SWIG--in fact, all
-of the target language modules work merely define a set of typemaps for the basic types.  Yet, it
+of the target language modules work merely define a family of typemaps for the basic types.  Yet, it
 is never necessary to write new typemaps for typenames introduced by <tt>typedef</tt>.
 </p>
 
@@ -431,7 +431,8 @@
 </div>
 
 <p>
-A more general form of copying is found in the <tt>%apply</tt> directive like this:
+There is a more powerful way to copy a family of typemaps though.
+Consider the following family of two typemap methods, "in" and "out" for type <tt>int</tt>:
 </p>
 
 <div class="code">
@@ -444,8 +445,29 @@
   /* Return an integer value */
   ...
 }
+</pre>
+</div>
 
-/* Apply all of the integer typemaps to size_t */
+<p>
+Each of the two typemap methods could be copied individually for type <tt>size_t</tt> as follows:
+</p>
+
+<div class="code">
+<pre>
+/* Apply all of the int typemaps to size_t */
+%typemap(in) size_t = int;   
+%typemap(out) size_t = int;   
+</pre>
+</div>
+
+<p>
+A more powerful form of copying is available from the <tt>%apply</tt> directive.
+The code below is identical to the above:
+</p>
+
+<div class="code">
+<pre>
+/* Apply all of the int typemaps to size_t */
 %apply int { size_t };    
 </pre>
 </div>
@@ -916,32 +938,33 @@
 
 
 <p>
-A typemap can be deleted by simply defining no code.  For example:
+A particular typemap can be deleted / cleared by simply defining no code.  For example:
 </p>
 
 <div class="code">
 <pre>
-%typemap(in) int;               // Clears typemap for int
-%typemap(in) int, long, short;  // Clears typemap for int, long, short
+%typemap(in) int;                 // Clears the "in" typemap for int
+%typemap(in) int, long, short;    // Clears the "in" typemap for int, long, short
 %typemap(in) int *output;       
 </pre>
 </div>
 
 <p>
-The <tt>%clear</tt> directive clears all typemaps for a given type.
+The above syntax deletes a typemap for just one typemap method - the "in" method in each of the examples above.
+The <tt>%clear</tt> directive is more powerful and will delete / clear a family of typemaps, that is, all the typemap methods for a given type.
 For example:
 </p>
 
 <div class="code">
 <pre>
-%clear int;                     // Removes all types for int
+%clear int;                       // Delete all typemaps ("in", "out", "varin", ...) for int
 %clear int *output, long *output;
 </pre>
 </div>
 
 <p>
 <b>Note:</b> Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like
-<tt>int</tt> will make that type unusable unless you also define a new set of typemaps immediately
+<tt>int</tt> will make that type unusable unless you also define a new family of typemaps immediately
 after the clear operation.
 </p>
 
@@ -2506,7 +2529,7 @@
 
 
 <p>
-The set of typemaps recognized by a language module may vary.  However,
+The family of typemaps recognized by a language module may vary.  However,
 the following typemap methods are nearly universal:
 </p>
 
@@ -3284,7 +3307,7 @@
 
 <p>
 The "out" typemap is the main typemap for return types.
-This typemap supports an optional attribute flag called "optimal", which is for reducing 
+This typemap supports an optional attribute flag called "optimal", which is for reducing the number of
 temporary variables and the amount of generated code, thereby giving the compiler the opportunity to 
 use <i>return value optimization</i> for generating faster executing code.
 It only really makes a difference when returning objects by value and has some limitations on usage,
@@ -4899,8 +4922,8 @@
 
 <p>
 In order to implement certain kinds of program behavior, it is sometimes necessary to
-write sets of typemaps.  For example, to support output arguments, one often writes
-a set of typemaps like this:
+write a family of typemap methods.  For example, to support output arguments, one often writes
+a family of typemaps like this:
 </p>
 
 <div class="code">
@@ -4916,7 +4939,7 @@
 
 <p>
 To make it easier to apply the typemap to different argument types and names, the <tt>%apply</tt> directive
-performs a copy of all typemaps from one type to another.  For example, if you specify this,
+performs a copy of all typemaps from a source type to one or more set of target types.  For example, if you specify this,
 </p>
 
 <div class="code">
@@ -4926,12 +4949,14 @@
 </div>
 
 <p>
-then all of the <tt>int *OUTPUT</tt> typemaps are copied to <tt>int *retvalue</tt> and <tt>int32 *output</tt>.
+then all of the <tt>int *OUTPUT</tt> (source) typemap methods are copied to <tt>int *retvalue</tt> and <tt>int32 *output</tt> (the targets).
 </p>
 
 <p>
-However, there is a subtle aspect of <tt>%apply</tt> that needs more description.  Namely, <tt>%apply</tt> does not
-overwrite a typemap rule if it is already defined for the target datatype.   This behavior allows you to do two things:
+However, there is a subtle aspect of <tt>%apply</tt> that needs clarification.  
+Namely, if a target contains a typemap method that the source does not,
+the target typemap method is not overwritten / deleted.
+This behavior allows you to do two things:
 </p>
 
 <ul>
@@ -4939,7 +4964,7 @@
 <tt>%apply</tt> to incorporate the remaining pieces.
 </li>
 
-<li>Sets of different typemaps can be applied to the same datatype using repeated <tt>%apply</tt> directives.
+<li>Different typemaps can be applied to the same datatype using repeated <tt>%apply</tt> directives.
 </li>
 </ul>
 
@@ -4961,6 +4986,10 @@
   }
 }
 
+%typemap(arginit) int *invalue %{
+  $1 = NULL;
+%}
+
 ...
 %apply int *INPUT     { int *invalue };
 %apply int *POSITIVE  { int *invalue };
@@ -4968,9 +4997,11 @@
 </div>
 
 <p>
-Since <tt>%apply</tt> does not overwrite or replace any existing rules, the only way to reset behavior is to
-use the <tt>%clear</tt> directive.  <tt>%clear</tt> removes all typemap rules defined for a specific datatype.  For
-example:
+In this example, neither of the two <tt>%apply</tt> directives will overwrite / delete the "arginit" typemap as neither has an "arginit" typemap.
+The result is a family of three relevant typemaps for <tt>int *invalue</tt>.
+Since <tt>%apply</tt> does not overwrite / delete any existing rules, the only way to reset behavior is to
+delete them, such as with the <tt>%clear</tt> directive.
+For example:
 </p>
 
 <div class="code">
@@ -4979,6 +5010,17 @@
 </pre>
 </div>
 
+<p>
+will delete the typemaps for all the typemap methods; namely "in", "check" and "arginit". Alternatively delete each one individually:
+</p>
+
+<div class="code">
+<pre>
+%typemap(in) int *invalue;
+%typemap(check) int *invalue;
+%typemap(arginit) int *invalue;
+</pre>
+</div>
 
 <H2><a name="Typemaps_nn47">12.15 Passing data between typemaps</a></H2>
 
diff --git a/Examples/test-suite/csharp/li_std_map_runme.cs b/Examples/test-suite/csharp/li_std_map_runme.cs
index b21c81e..51510c9 100644
--- a/Examples/test-suite/csharp/li_std_map_runme.cs
+++ b/Examples/test-suite/csharp/li_std_map_runme.cs
@@ -240,6 +240,20 @@
                 throw new Exception("Key test (2) on complex key map failed");
         }
 
+        // Custom compare function
+        {
+          StringLengthNumberMap slmap = new StringLengthNumberMap();
+          li_std_map.populate(slmap);
+
+          string keys = string.Join(" ", new List<string>(slmap.Keys));
+          if (keys != "a aa zzz xxxx aaaaa")
+            throw new Exception("Keys are wrong or in wrong order: " + keys);
+
+          string values = string.Join(" ", new List<int>(slmap.Values));
+          if (values != "1 2 3 4 5")
+            throw new Exception("Values are wrong or in wrong order: " + values);
+        }
+
         // All done
     }
 }
diff --git a/Examples/test-suite/default_args_c.i b/Examples/test-suite/default_args_c.i
index ed1c4de..f507aa7 100644
--- a/Examples/test-suite/default_args_c.i
+++ b/Examples/test-suite/default_args_c.i
@@ -20,3 +20,34 @@
   return x;
 }
 %}
+
+%inline %{
+struct FooStruct {
+  int num;
+};
+%}
+%extend FooStruct {
+  void no_arg() {}
+  void one_req(int *required) {}
+  void one_opt(int *optional = NULL) {}
+  void two_arg(int *required, int *optional = NULL) {}
+}
+
+%inline %{
+struct StaticStruct {
+  int snum;
+};
+%}
+%extend StaticStruct {
+  static void no_arg() {}
+  static void one_req(int *required) {}
+  static void one_opt(int *optional = NULL) {}
+  static void two_arg(int *required, int *optional = NULL) {}
+}
+
+%{
+void global_opts1(int *optional) {}
+void global_opts2(int *required, int *optional) {}
+%}
+void global_opts1(int *optional = NULL) {}
+void global_opts2(int *required, int *optional = NULL) {}
diff --git a/Examples/test-suite/li_std_map.i b/Examples/test-suite/li_std_map.i
index bf24c35..238cc33 100644
--- a/Examples/test-suite/li_std_map.i
+++ b/Examples/test-suite/li_std_map.i
@@ -117,4 +117,25 @@
   }
 }
 
+%ignore LengthCompare::operator();
+%inline %{
+struct LengthCompare {
+  bool operator() (std::string s1, std::string s2) const {
+    return s1.size() < s2.size();
+  }
+};
+%}
 
+// A map sorted by string lengths
+%template(StringLengthNumberMap) std::map< std::string, int, LengthCompare >;
+
+%inline %{
+std::map< std::string, int, LengthCompare > MyMap;
+void populate(std::map< std::string, int, LengthCompare >&m) {
+  m["aa"] = 2;
+  m["xxxx"] = 4;
+  m["a"] = 1;
+  m["aaaaa"] = 5;
+  m["zzz"] = 3;
+}
+%}
diff --git a/Examples/test-suite/php/director_basic_runme.php b/Examples/test-suite/php/director_basic_runme.php
index de6b505..af61101 100644
--- a/Examples/test-suite/php/director_basic_runme.php
+++ b/Examples/test-suite/php/director_basic_runme.php
@@ -4,7 +4,7 @@
 require "director_basic.php";
 
 // No new functions
-check::functions(array(foo_ping,foo_pong,foo_get_self,a_f,a_rg,a1_ff,myclass_method,myclass_vmethod,myclass_pmethod,myclass_cmethod,myclass_get_self,myclass_call_pmethod,myclasst_i_method));
+check::functions(array(foo_ping,foo_pong,foo_get_self,a_f,a_rg,a1_ff,myclass_method,myclass_vmethod,myclass_pmethod,myclass_cmethod,myclass_get_self,myclass_call_pmethod,myclasst_i_method,myclass_nonvirtual,myclass_nonoverride,myclass_call_nonvirtual,myclass_call_nonoverride,myclass_connect));
 // No new classes
 check::classes(array(Foo,A,A1,Bar,MyClass,MyClassT_i));
 // now new vars
diff --git a/Examples/test-suite/python/default_args_c_runme.py b/Examples/test-suite/python/default_args_c_runme.py
index 5985fd7..65ca917 100644
--- a/Examples/test-suite/python/default_args_c_runme.py
+++ b/Examples/test-suite/python/default_args_c_runme.py
@@ -4,3 +4,23 @@
   raise RuntimeError("failed")
 if default_args_c.foo43() != 43:
   raise RuntimeError("failed")
+
+f = default_args_c.FooStruct()
+f.no_arg()
+f.one_req(None)
+f.one_opt()
+f.one_opt(None)
+f.two_arg(None)
+f.two_arg(None, None)
+
+default_args_c.StaticStruct.no_arg()
+default_args_c.StaticStruct.one_req(None)
+default_args_c.StaticStruct.one_opt()
+default_args_c.StaticStruct.one_opt(None)
+default_args_c.StaticStruct.two_arg(None)
+default_args_c.StaticStruct.two_arg(None, None)
+
+default_args_c.global_opts1()
+default_args_c.global_opts1(None)
+default_args_c.global_opts2(None)
+default_args_c.global_opts2(None, None)
diff --git a/Examples/test-suite/python/li_std_map_runme.py b/Examples/test-suite/python/li_std_map_runme.py
index 5b5e8f1..ac214dd 100644
--- a/Examples/test-suite/python/li_std_map_runme.py
+++ b/Examples/test-suite/python/li_std_map_runme.py
@@ -67,3 +67,15 @@
     raise RuntimeError("itervalues")
 if [i for i in mii.iteritems()] != [(1, 2)]:
     raise RuntimeError("iteritems")
+
+
+slmap = li_std_map.StringLengthNumberMap()
+li_std_map.populate(slmap)
+
+keys = " ".join([k for k in slmap.keys()])
+if keys != "a aa zzz xxxx aaaaa":
+    raise RuntimeError("Keys are wrong or in wrong order: " + keys)
+
+values = " ".join([str(v) for v in slmap.values()])
+if values != "1 2 3 4 5":
+    raise RuntimeError("Values are wrong or in wrong order: " + values)
diff --git a/Lib/d/std_map.i b/Lib/d/std_map.i
index d2ba041..968def2 100644
--- a/Lib/d/std_map.i
+++ b/Lib/d/std_map.i
@@ -17,21 +17,21 @@
 %}
 
 namespace std {
-  template<class K, class T> class map {
+  template<class K, class T, class C = std::less<K> > class map {
     public:
       typedef size_t size_type;
       typedef ptrdiff_t difference_type;
       typedef K key_type;
       typedef T mapped_type;
       map();
-      map(const map<K,T> &);
+      map(const map< K, T, C > &);
 
       unsigned int size() const;
       bool empty() const;
       void clear();
       %extend {
         const T& get(const K& key) throw (std::out_of_range) {
-          std::map<K,T >::iterator i = self->find(key);
+          std::map< K, T, C >::iterator i = self->find(key);
           if (i != self->end())
             return i->second;
           else
@@ -41,14 +41,14 @@
           (*self)[key] = x;
         }
         void del(const K& key) throw (std::out_of_range) {
-          std::map<K,T >::iterator i = self->find(key);
+          std::map< K, T, C >::iterator i = self->find(key);
           if (i != self->end())
             self->erase(i);
           else
             throw std::out_of_range("key not found");
         }
         bool has_key(const K& key) {
-          std::map<K,T >::iterator i = self->find(key);
+          std::map< K, T, C >::iterator i = self->find(key);
           return i != self->end();
         }
       }
diff --git a/Lib/go/std_map.i b/Lib/go/std_map.i
index 84b0c74..f514cf7 100644
--- a/Lib/go/std_map.i
+++ b/Lib/go/std_map.i
@@ -20,7 +20,7 @@
 
 namespace std {
 
-    template<class K, class T> class map {
+    template<class K, class T, class C = std::less<K> > class map {
         // add typemaps here
       public:
         typedef size_t size_type;
@@ -28,14 +28,14 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             const T& get(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -45,14 +45,14 @@
                 (*self)[key] = x;
             }
             void del(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
         }
diff --git a/Lib/guile/std_map.i b/Lib/guile/std_map.i
index 489acc1..ca98836 100644
--- a/Lib/guile/std_map.i
+++ b/Lib/guile/std_map.i
@@ -40,12 +40,12 @@
 
 namespace std {
 
-    template<class K, class T> class map {
-        %typemap(in) map<K,T> {
+    template<class K, class T, class C = std::less<K> > class map {
+        %typemap(in) map< K, T, C > {
             if (scm_is_null($input)) {
-                $1 = std::map< K, T >();
+                $1 = std::map< K, T, C >();
             } else if (scm_is_pair($input)) {
-                $1 = std::map< K, T >();
+                $1 = std::map< K, T, C >();
                 SCM alist = $input;
                 while (!scm_is_null(alist)) {
                     K* k;
@@ -72,13 +72,13 @@
                        SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
             }
         }
-        %typemap(in) const map<K,T>& (std::map<K,T> temp),
-                     const map<K,T>* (std::map<K,T> temp) {
+        %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp),
+                     const map< K, T, C >* (std::map< K, T, C > temp) {
             if (scm_is_null($input)) {
-                temp = std::map< K, T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
             } else if (scm_is_pair($input)) {
-                temp = std::map< K, T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
                 SCM alist = $input;
                 while (!scm_is_null(alist)) {
@@ -105,9 +105,9 @@
                 $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
             }
         }
-        %typemap(out) map<K,T> {
+        %typemap(out) map< K, T, C > {
             SCM alist = SCM_EOL;
-            for (std::map< K, T >::reverse_iterator i=$i.rbegin(); i!=$i.rend(); ++i) {
+            for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) {
                 K* key = new K(i->first);
                 T* val = new T(i->second);
                 SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1);
@@ -117,7 +117,7 @@
             }
             $result = alist;
         }
-        %typecheck(SWIG_TYPECHECK_MAP) map<K,T> {
+        %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
             /* native sequence? */
             if (scm_is_null($input)) {
                 /* an empty sequence can be of any type */
@@ -153,7 +153,7 @@
                 }
             } else {
                 /* wrapped map? */
-                std::map< K, T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $&1_descriptor, 0) == 0)
                     $1 = 1;
@@ -161,8 +161,8 @@
                     $1 = 0;
             }
         }
-        %typecheck(SWIG_TYPECHECK_MAP) const map<K,T>&,
-                                       const map<K,T>* {
+        %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
+                                       const map< K, T, C >* {
             /* native sequence? */
             if (scm_is_null($input)) {
                 /* an empty sequence can be of any type */
@@ -198,7 +198,7 @@
                 }
             } else {
                 /* wrapped map? */
-                std::map< K, T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $1_descriptor, 0) == 0)
                     $1 = 1;
@@ -219,14 +219,14 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map< K, T> &);
+        map(const map< K, T, C> &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             const T& __getitem__(const K& key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -236,19 +236,19 @@
                 (*self)[key] = x;
             }
             void __delitem__(const K& key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
             SCM keys() {
                 SCM result = SCM_EOL;
-                for (std::map< K, T >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) {
+                for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) {
                     K* key = new K(i->first);
                     SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1);
                     result = scm_cons(k,result);
@@ -263,12 +263,12 @@
 
     %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO)
 
-    template<class T> class map<K,T> {
-        %typemap(in) map<K,T> {
+    template<class T> class map< K, T, C > {
+        %typemap(in) map< K, T, C > {
             if (scm_is_null($input)) {
-                $1 = std::map< K, T >();
+                $1 = std::map< K, T, C >();
             } else if (scm_is_pair($input)) {
-                $1 = std::map< K, T >();
+                $1 = std::map< K, T, C >();
                 SCM alist = $input;
                 while (!scm_is_null(alist)) {
                     T* x;
@@ -280,7 +280,7 @@
                     val = SCM_CDR(entry);
                     if (!CHECK(key))
                         SWIG_exception(SWIG_TypeError,
-                                       "map<" #K "," #T "> expected");
+                                       "map<" #K "," #T "," #C "> expected");
                     if (SWIG_ConvertPtr(val,(void**) &x,
                                     $descriptor(T *), 0) != 0) {
                         if (!scm_is_pair(val))
@@ -296,13 +296,13 @@
                        SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
             }
         }
-        %typemap(in) const map<K,T>& (std::map<K,T> temp),
-                     const map<K,T>* (std::map<K,T> temp) {
+        %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp),
+                     const map< K, T, C >* (std::map< K, T, C > temp) {
             if (scm_is_null($input)) {
-                temp = std::map< K, T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
             } else if (scm_is_pair($input)) {
-                temp = std::map< K, T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
                 SCM alist = $input;
                 while (!scm_is_null(alist)) {
@@ -315,7 +315,7 @@
                     val = SCM_CDR(entry);
                     if (!CHECK(key))
                         SWIG_exception(SWIG_TypeError,
-                                       "map<" #K "," #T "> expected");
+                                       "map<" #K "," #T "," #C "> expected");
                     if (SWIG_ConvertPtr(val,(void**) &x,
                                     $descriptor(T *), 0) != 0) {
                         if (!scm_is_pair(val))
@@ -330,9 +330,9 @@
                 $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
             }
         }
-        %typemap(out) map<K,T> {
+        %typemap(out) map< K, T, C > {
             SCM alist = SCM_EOL;
-            for (std::map< K, T >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) {
+            for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) {
                 T* val = new T(i->second);
                 SCM k = CONVERT_TO(i->first);
                 SCM x = SWIG_NewPointerObj(val,$descriptor(T *), 1);
@@ -341,7 +341,7 @@
             }
             $result = alist;
         }
-        %typecheck(SWIG_TYPECHECK_MAP) map<K,T> {
+        %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
             // native sequence?
             if (scm_is_null($input)) {
                 /* an empty sequence can be of any type */
@@ -375,7 +375,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map< K, T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $&1_descriptor, 0) == 0)
                     $1 = 1;
@@ -383,8 +383,8 @@
                     $1 = 0;
             }
         }
-        %typecheck(SWIG_TYPECHECK_MAP) const map<K,T>&,
-                                       const map<K,T>* {
+        %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
+                                       const map< K, T, C >* {
             // native sequence?
             if (scm_is_null($input)) {
                 /* an empty sequence can be of any type */
@@ -418,7 +418,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map< K, T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $1_descriptor, 0) == 0)
                     $1 = 1;
@@ -435,14 +435,14 @@
         %rename("has-key?") has_key;
       public:
         map();
-        map(const map< K, T > &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             T& __getitem__(K key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -452,19 +452,19 @@
                 (*self)[key] = x;
             }
             void __delitem__(K key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(K key) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
             SCM keys() {
                 SCM result = SCM_EOL;
-                for (std::map< K, T >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) {
+                for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) {
                     SCM k = CONVERT_TO(i->first);
                     result = scm_cons(k,result);
                 }
@@ -475,12 +475,12 @@
     %enddef
 
     %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO)
-    template<class K> class map<K,T> {
-        %typemap(in) map<K,T> {
+    template<class K> class map< K, T, C > {
+        %typemap(in) map< K, T, C > {
             if (scm_is_null($input)) {
-                $1 = std::map< K, T >();
+                $1 = std::map< K, T, C >();
             } else if (scm_is_pair($input)) {
-                $1 = std::map< K, T >();
+                $1 = std::map< K, T, C >();
                 SCM alist = $input;
                 while (!scm_is_null(alist)) {
                     K* k;
@@ -497,7 +497,7 @@
                         val = SCM_CAR(val);
                         if (!CHECK(val))
                             SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     }
                     (($1_type &)$1)[*k] = CONVERT_FROM(val);
                     alist = SCM_CDR(alist);
@@ -507,13 +507,13 @@
                        SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
             }
         }
-        %typemap(in) const map<K,T>& (std::map<K,T> temp),
-                     const map<K,T>* (std::map<K,T> temp) {
+        %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp),
+                     const map< K, T, C >* (std::map< K, T, C > temp) {
             if (scm_is_null($input)) {
-                temp = std::map< K, T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
             } else if (scm_is_pair($input)) {
-                temp = std::map< K, T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
                 SCM alist = $input;
                 while (!scm_is_null(alist)) {
@@ -531,7 +531,7 @@
                         val = SCM_CAR(val);
                         if (!CHECK(val))
                             SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     }
                     temp[*k] = CONVERT_FROM(val);
                     alist = SCM_CDR(alist);
@@ -540,9 +540,9 @@
                 $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
             }
         }
-        %typemap(out) map<K,T> {
+        %typemap(out) map< K, T, C > {
             SCM alist = SCM_EOL;
-            for (std::map< K, T >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) {
+            for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) {
                 K* key = new K(i->first);
                 SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1);
                 SCM x = CONVERT_TO(i->second);
@@ -551,7 +551,7 @@
             }
             $result = alist;
         }
-        %typecheck(SWIG_TYPECHECK_MAP) map<K,T> {
+        %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
             // native sequence?
             if (scm_is_null($input)) {
                 /* an empty sequence can be of any type */
@@ -583,7 +583,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map< K, T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $&1_descriptor, 0) == 0)
                     $1 = 1;
@@ -591,8 +591,8 @@
                     $1 = 0;
             }
         }
-        %typecheck(SWIG_TYPECHECK_MAP) const map<K,T>&,
-                                       const map<K,T>* {
+        %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
+                                       const map< K, T, C >* {
             // native sequence?
             if (scm_is_null($input)) {
                 /* an empty sequence can be of any type */
@@ -624,7 +624,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map< K, T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $1_descriptor, 0) == 0)
                     $1 = 1;
@@ -641,14 +641,14 @@
         %rename("has-key?") has_key;
       public:
         map();
-        map(const map< K, T > &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             T __getitem__(const K& key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -658,19 +658,19 @@
                 (*self)[key] = x;
             }
             void __delitem__(const K& key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
             SCM keys() {
                 SCM result = SCM_EOL;
-                for (std::map< K, T >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) {
+                for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) {
                     K* key = new K(i->first);
                     SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1);
                     result = scm_cons(k,result);
@@ -683,12 +683,12 @@
 
     %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO,
                                        T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO)
-    template<> class map<K,T> {
-        %typemap(in) map<K,T> {
+    template<> class map< K, T, C > {
+        %typemap(in) map< K, T, C > {
             if (scm_is_null($input)) {
-                $1 = std::map< K, T >();
+                $1 = std::map< K, T, C >();
             } else if (scm_is_pair($input)) {
-                $1 = std::map< K, T >();
+                $1 = std::map< K, T, C >();
                 SCM alist = $input;
                 while (!scm_is_null(alist)) {
                     SCM entry, key, val;
@@ -699,14 +699,14 @@
                     val = SCM_CDR(entry);
                     if (!CHECK_K(key))
                         SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     if (!CHECK_T(val)) {
                         if (!scm_is_pair(val))
                             SWIG_exception(SWIG_TypeError,"alist expected");
                         val = SCM_CAR(val);
                         if (!CHECK_T(val))
                             SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     }
                     (($1_type &)$1)[CONVERT_K_FROM(key)] = 
                                                CONVERT_T_FROM(val);
@@ -717,13 +717,13 @@
                        SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
             }
         }
-        %typemap(in) const map<K,T>& (std::map<K,T> temp),
-                     const map<K,T>* (std::map<K,T> temp) {
+        %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp),
+                     const map< K, T, C >* (std::map< K, T, C > temp) {
             if (scm_is_null($input)) {
-                temp = std::map< K, T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
             } else if (scm_is_pair($input)) {
-                temp = std::map< K, T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
                 SCM alist = $input;
                 while (!scm_is_null(alist)) {
@@ -735,14 +735,14 @@
                     val = SCM_CDR(entry);
                     if (!CHECK_K(key))
                         SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     if (!CHECK_T(val)) {
                         if (!scm_is_pair(val))
                             SWIG_exception(SWIG_TypeError,"alist expected");
                         val = SCM_CAR(val);
                         if (!CHECK_T(val))
                             SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     }
                     temp[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val);
                     alist = SCM_CDR(alist);
@@ -751,9 +751,9 @@
                 $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
             }
         }
-        %typemap(out) map<K,T> {
+        %typemap(out) map< K, T, C > {
             SCM alist = SCM_EOL;
-            for (std::map< K, T >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) {
+            for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) {
                 SCM k = CONVERT_K_TO(i->first);
                 SCM x = CONVERT_T_TO(i->second);
                 SCM entry = scm_cons(k,x);
@@ -761,7 +761,7 @@
             }
             $result = alist;
         }
-        %typecheck(SWIG_TYPECHECK_MAP) map<K,T> {
+        %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
             // native sequence?
             if (scm_is_null($input)) {
                 /* an empty sequence can be of any type */
@@ -792,7 +792,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map< K, T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $&1_descriptor, 0) == 0)
                     $1 = 1;
@@ -800,8 +800,8 @@
                     $1 = 0;
             }
         }
-        %typecheck(SWIG_TYPECHECK_MAP) const map<K,T>&,
-                                       const map<K,T>* {
+        %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
+                                       const map< K, T, C >* {
             // native sequence?
             if (scm_is_null($input)) {
                 /* an empty sequence can be of any type */
@@ -832,7 +832,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map< K, T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $1_descriptor, 0) == 0)
                     $1 = 1;
@@ -849,14 +849,14 @@
         %rename("has-key?") has_key;
       public:
         map();
-        map(const map< K, T> &);
+        map(const map< K, T, C> &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             T __getitem__(K key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -866,19 +866,19 @@
                 (*self)[key] = x;
             }
             void __delitem__(K key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(K key) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
             SCM keys() {
                 SCM result = SCM_EOL;
-                for (std::map< K, T >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) {
+                for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) {
                     SCM k = CONVERT_K_TO(i->first);
                     result = scm_cons(k,result);
                 }
diff --git a/Lib/java/std_map.i b/Lib/java/std_map.i
index 2405571..75d523c 100644
--- a/Lib/java/std_map.i
+++ b/Lib/java/std_map.i
@@ -18,21 +18,21 @@
 
 namespace std {
 
-  template<class K, class T> class map {
+  template<class K, class T, class C = std::less<K> > class map {
     public:
       typedef size_t size_type;
       typedef ptrdiff_t difference_type;
       typedef K key_type;
       typedef T mapped_type;
       map();
-      map(const map<K,T> &);
+      map(const map< K, T, C > &);
 
       unsigned int size() const;
       bool empty() const;
       void clear();
       %extend {
         const T& get(const K& key) throw (std::out_of_range) {
-          std::map<K,T >::iterator i = self->find(key);
+          std::map< K, T, C >::iterator i = self->find(key);
           if (i != self->end())
             return i->second;
           else
@@ -42,14 +42,14 @@
           (*self)[key] = x;
         }
         void del(const K& key) throw (std::out_of_range) {
-          std::map<K,T >::iterator i = self->find(key);
+          std::map< K, T, C >::iterator i = self->find(key);
           if (i != self->end())
             self->erase(i);
           else
             throw std::out_of_range("key not found");
         }
         bool has_key(const K& key) {
-          std::map<K,T >::iterator i = self->find(key);
+          std::map< K, T, C >::iterator i = self->find(key);
           return i != self->end();
         }
       }
diff --git a/Lib/javascript/jsc/std_map.i b/Lib/javascript/jsc/std_map.i
index e7812f3..903f77a 100644
--- a/Lib/javascript/jsc/std_map.i
+++ b/Lib/javascript/jsc/std_map.i
@@ -20,7 +20,7 @@
 
 namespace std {
 
-    template<class K, class T> class map {
+    template<class K, class T, class C = std::less<K> > class map {
         // add typemaps here
       public:
         typedef size_t size_type;
@@ -28,14 +28,14 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             const T& get(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -45,14 +45,14 @@
                 (*self)[key] = x;
             }
             void del(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
         }
diff --git a/Lib/javascript/v8/std_map.i b/Lib/javascript/v8/std_map.i
index e7812f3..903f77a 100644
--- a/Lib/javascript/v8/std_map.i
+++ b/Lib/javascript/v8/std_map.i
@@ -20,7 +20,7 @@
 
 namespace std {
 
-    template<class K, class T> class map {
+    template<class K, class T, class C = std::less<K> > class map {
         // add typemaps here
       public:
         typedef size_t size_type;
@@ -28,14 +28,14 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             const T& get(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -45,14 +45,14 @@
                 (*self)[key] = x;
             }
             void del(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
         }
diff --git a/Lib/lua/std_map.i b/Lib/lua/std_map.i
index 84b0c74..8a203e1 100644
--- a/Lib/lua/std_map.i
+++ b/Lib/lua/std_map.i
@@ -20,7 +20,7 @@
 
 namespace std {
 
-    template<class K, class T> class map {
+    template<class K, class T, class C = std::less<K> > class map {
         // add typemaps here
       public:
         typedef size_t size_type;
@@ -28,14 +28,14 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C> &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             const T& get(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -45,14 +45,14 @@
                 (*self)[key] = x;
             }
             void del(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
         }
diff --git a/Lib/mzscheme/std_map.i b/Lib/mzscheme/std_map.i
index 849f8ba..6a0cb2d 100644
--- a/Lib/mzscheme/std_map.i
+++ b/Lib/mzscheme/std_map.i
@@ -40,12 +40,12 @@
 
 namespace std {
 
-    template<class K, class T> class map {
-        %typemap(in) map<K,T> (std::map<K,T>* m) {
+    template<class K, class T, class C = std::less<K> > class map {
+        %typemap(in) map< K, T, C > (std::map< K, T, C >* m) {
             if (SCHEME_NULLP($input)) {
-                $1 = std::map<K,T >();
+                $1 = std::map< K, T, C >();
             } else if (SCHEME_PAIRP($input)) {
-                $1 = std::map<K,T >();
+                $1 = std::map< K, T, C >();
                 Scheme_Object* alist = $input;
                 while (!SCHEME_NULLP(alist)) {
                     K* k;
@@ -72,15 +72,15 @@
                        SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
             }
         }
-        %typemap(in) const map<K,T>& (std::map<K,T> temp,
-                                      std::map<K,T>* m),
-                     const map<K,T>* (std::map<K,T> temp,
-                                      std::map<K,T>* m) {
+        %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp,
+                                      std::map< K, T, C >* m),
+                     const map< K, T, C >* (std::map< K, T, C > temp,
+                                      std::map< K, T, C >* m) {
             if (SCHEME_NULLP($input)) {
-                temp = std::map<K,T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
             } else if (SCHEME_PAIRP($input)) {
-                temp = std::map<K,T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
                 Scheme_Object* alist = $input;
                 while (!SCHEME_NULLP(alist)) {
@@ -107,9 +107,9 @@
                 $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
             }
         }
-        %typemap(out) map<K,T> {
+        %typemap(out) map< K, T, C > {
             Scheme_Object* alist = scheme_null;
-            for (std::map<K,T >::reverse_iterator i=$1.rbegin(); 
+            for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); 
                                                   i!=$1.rend(); ++i) {
                 K* key = new K(i->first);
                 T* val = new T(i->second);
@@ -120,7 +120,7 @@
             }
             $result = alist;
         }
-        %typecheck(SWIG_TYPECHECK_MAP) map<K,T> {
+        %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
             /* native sequence? */
             if (SCHEME_NULLP($input)) {
                 /* an empty sequence can be of any type */
@@ -156,7 +156,7 @@
                 }
             } else {
                 /* wrapped map? */
-                std::map<K,T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $&1_descriptor, 0) != -1)
                     $1 = 1;
@@ -164,8 +164,8 @@
                     $1 = 0;
             }
         }
-        %typecheck(SWIG_TYPECHECK_MAP) const map<K,T>&,
-                                       const map<K,T>* {
+        %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
+                                       const map< K, T, C >* {
             /* native sequence? */
             if (SCHEME_NULLP($input)) {
                 /* an empty sequence can be of any type */
@@ -201,7 +201,7 @@
                 }
             } else {
                 /* wrapped map? */
-                std::map<K,T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $1_descriptor, 0) != -1)
                     $1 = 1;
@@ -222,14 +222,14 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             T& __getitem__(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -239,19 +239,19 @@
                 (*self)[key] = x;
             }
             void __delitem__(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
             Scheme_Object* keys() {
                 Scheme_Object* result = scheme_null;
-                for (std::map<K,T >::reverse_iterator i=self->rbegin(); 
+                for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); 
                                                       i!=self->rend(); ++i) {
                     K* key = new K(i->first);
                     Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1);
@@ -267,12 +267,12 @@
 
     %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO)
 
-    template<class T> class map<K,T> {
-        %typemap(in) map<K,T> (std::map<K,T>* m) {
+    template<class T> class map< K, T, C > {
+        %typemap(in) map< K, T, C > (std::map< K, T, C >* m) {
             if (SCHEME_NULLP($input)) {
-                $1 = std::map<K,T >();
+                $1 = std::map< K, T, C >();
             } else if (SCHEME_PAIRP($input)) {
-                $1 = std::map<K,T >();
+                $1 = std::map< K, T, C >();
                 Scheme_Object* alist = $input;
                 while (!SCHEME_NULLP(alist)) {
                     T* x;
@@ -284,7 +284,7 @@
                     val = scheme_cdr(entry);
                     if (!CHECK(key))
                         SWIG_exception(SWIG_TypeError,
-                                       "map<" #K "," #T "> expected");
+                                       "map<" #K "," #T "," #C "> expected");
                     if (SWIG_ConvertPtr(val,(void**) &x,
                                     $descriptor(T *), 0) == -1) {
                         if (!SCHEME_PAIRP(val))
@@ -300,15 +300,15 @@
                        SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
             }
         }
-        %typemap(in) const map<K,T>& (std::map<K,T> temp,
-                                      std::map<K,T>* m),
-                     const map<K,T>* (std::map<K,T> temp,
-                                      std::map<K,T>* m) {
+        %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp,
+                                      std::map< K, T, C >* m),
+                     const map< K, T, C >* (std::map< K, T, C > temp,
+                                      std::map< K, T, C >* m) {
             if (SCHEME_NULLP($input)) {
-                temp = std::map<K,T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
             } else if (SCHEME_PAIRP($input)) {
-                temp = std::map<K,T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
                 Scheme_Object* alist = $input;
                 while (!SCHEME_NULLP(alist)) {
@@ -321,7 +321,7 @@
                     val = scheme_cdr(entry);
                     if (!CHECK(key))
                         SWIG_exception(SWIG_TypeError,
-                                       "map<" #K "," #T "> expected");
+                                       "map<" #K "," #T "," #C "> expected");
                     if (SWIG_ConvertPtr(val,(void**) &x,
                                     $descriptor(T *), 0) == -1) {
                         if (!SCHEME_PAIRP(val))
@@ -336,9 +336,9 @@
                 $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
             }
         }
-        %typemap(out) map<K,T> {
+        %typemap(out) map< K, T, C > {
             Scheme_Object* alist = scheme_null;
-            for (std::map<K,T >::reverse_iterator i=$1.rbegin(); 
+            for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); 
                                                   i!=$1.rend(); ++i) {
                 T* val = new T(i->second);
                 Scheme_Object* k = CONVERT_TO(i->first);
@@ -348,7 +348,7 @@
             }
             $result = alist;
         }
-        %typecheck(SWIG_TYPECHECK_MAP) map<K,T> {
+        %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
             // native sequence?
             if (SCHEME_NULLP($input)) {
                 /* an empty sequence can be of any type */
@@ -382,7 +382,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map<K,T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $&1_descriptor, 0) != -1)
                     $1 = 1;
@@ -390,8 +390,8 @@
                     $1 = 0;
             }
         }
-        %typecheck(SWIG_TYPECHECK_MAP) const map<K,T>&,
-                                       const map<K,T>* {
+        %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
+                                       const map< K, T, C >* {
             // native sequence?
             if (SCHEME_NULLP($input)) {
                 /* an empty sequence can be of any type */
@@ -425,7 +425,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map<K,T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $1_descriptor, 0) != -1)
                     $1 = 1;
@@ -442,14 +442,14 @@
         %rename("has-key?") has_key;
       public:
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             T& __getitem__(K key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -459,19 +459,19 @@
                 (*self)[key] = x;
             }
             void __delitem__(K key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(K key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
             Scheme_Object* keys() {
                 Scheme_Object* result = scheme_null;
-                for (std::map<K,T >::reverse_iterator i=self->rbegin(); 
+                for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); 
                                                       i!=self->rend(); ++i) {
                     Scheme_Object* k = CONVERT_TO(i->first);
                     result = scheme_make_pair(k,result);
@@ -483,12 +483,12 @@
     %enddef
 
     %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO)
-    template<class K> class map<K,T> {
-        %typemap(in) map<K,T> (std::map<K,T>* m) {
+    template<class K> class map< K, T, C > {
+        %typemap(in) map< K, T, C > (std::map< K, T, C >* m) {
             if (SCHEME_NULLP($input)) {
-                $1 = std::map<K,T >();
+                $1 = std::map< K, T, C >();
             } else if (SCHEME_PAIRP($input)) {
-                $1 = std::map<K,T >();
+                $1 = std::map< K, T, C >();
                 Scheme_Object* alist = $input;
                 while (!SCHEME_NULLP(alist)) {
                     K* k;
@@ -505,7 +505,7 @@
                         val = scheme_car(val);
                         if (!CHECK(val))
                             SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     }
                     (($1_type &)$1)[*k] = CONVERT_FROM(val);
                     alist = scheme_cdr(alist);
@@ -515,15 +515,15 @@
                        SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
             }
         }
-        %typemap(in) const map<K,T>& (std::map<K,T> temp,
-                                      std::map<K,T>* m),
-                     const map<K,T>* (std::map<K,T> temp,
-                                      std::map<K,T>* m) {
+        %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp,
+                                      std::map< K, T, C >* m),
+                     const map< K, T, C >* (std::map< K, T, C > temp,
+                                      std::map< K, T, C >* m) {
             if (SCHEME_NULLP($input)) {
-                temp = std::map<K,T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
             } else if (SCHEME_PAIRP($input)) {
-                temp = std::map<K,T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
                 Scheme_Object* alist = $input;
                 while (!SCHEME_NULLP(alist)) {
@@ -541,7 +541,7 @@
                         val = scheme_car(val);
                         if (!CHECK(val))
                             SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     }
                     temp[*k] = CONVERT_FROM(val);
                     alist = scheme_cdr(alist);
@@ -550,9 +550,9 @@
                 $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
             }
         }
-        %typemap(out) map<K,T> {
+        %typemap(out) map< K, T, C > {
             Scheme_Object* alist = scheme_null;
-            for (std::map<K,T >::reverse_iterator i=$1.rbegin(); 
+            for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); 
                                                   i!=$1.rend(); ++i) {
                 K* key = new K(i->first);
                 Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1);
@@ -562,7 +562,7 @@
             }
             $result = alist;
         }
-        %typecheck(SWIG_TYPECHECK_MAP) map<K,T> {
+        %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
             // native sequence?
             if (SCHEME_NULLP($input)) {
                 /* an empty sequence can be of any type */
@@ -595,7 +595,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map<K,T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $&1_descriptor, 0) != -1)
                     $1 = 1;
@@ -603,8 +603,8 @@
                     $1 = 0;
             }
         }
-        %typecheck(SWIG_TYPECHECK_MAP) const map<K,T>&,
-                                       const map<K,T>* {
+        %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
+                                       const map< K, T, C >* {
             // native sequence?
             if (SCHEME_NULLP($input)) {
                 /* an empty sequence can be of any type */
@@ -637,7 +637,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map<K,T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $1_descriptor, 0) != -1)
                     $1 = 1;
@@ -654,14 +654,14 @@
         %rename("has-key?") has_key;
       public:
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             T __getitem__(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -671,19 +671,19 @@
                 (*self)[key] = x;
             }
             void __delitem__(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
             Scheme_Object* keys() {
                 Scheme_Object* result = scheme_null;
-                for (std::map<K,T >::reverse_iterator i=self->rbegin(); 
+                for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); 
                                                       i!=self->rend(); ++i) {
                     K* key = new K(i->first);
                     Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1);
@@ -697,12 +697,12 @@
 
     %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO,
                                        T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO)
-    template<> class map<K,T> {
-        %typemap(in) map<K,T> (std::map<K,T>* m) {
+    template<> class map< K, T, C > {
+        %typemap(in) map< K, T, C > (std::map< K, T, C >* m) {
             if (SCHEME_NULLP($input)) {
-                $1 = std::map<K,T >();
+                $1 = std::map< K, T, C >();
             } else if (SCHEME_PAIRP($input)) {
-                $1 = std::map<K,T >();
+                $1 = std::map< K, T, C >();
                 Scheme_Object* alist = $input;
                 while (!SCHEME_NULLP(alist)) {
                     Scheme_Object *entry, *key, *val;
@@ -713,14 +713,14 @@
                     val = scheme_cdr(entry);
                     if (!CHECK_K(key))
                         SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     if (!CHECK_T(val)) {
                         if (!SCHEME_PAIRP(val))
                             SWIG_exception(SWIG_TypeError,"alist expected");
                         val = scheme_car(val);
                         if (!CHECK_T(val))
                             SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     }
                     (($1_type &)$1)[CONVERT_K_FROM(key)] = 
                                                CONVERT_T_FROM(val);
@@ -731,15 +731,15 @@
                        SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
             }
         }
-        %typemap(in) const map<K,T>& (std::map<K,T> temp,
-                                      std::map<K,T>* m),
-                     const map<K,T>* (std::map<K,T> temp,
-                                      std::map<K,T>* m) {
+        %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp,
+                                      std::map< K, T, C >* m),
+                     const map< K, T, C >* (std::map< K, T, C > temp,
+                                      std::map< K, T, C >* m) {
             if (SCHEME_NULLP($input)) {
-                temp = std::map<K,T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
             } else if (SCHEME_PAIRP($input)) {
-                temp = std::map<K,T >();
+                temp = std::map< K, T, C >();
                 $1 = &temp;
                 Scheme_Object* alist = $input;
                 while (!SCHEME_NULLP(alist)) {
@@ -751,14 +751,14 @@
                     val = scheme_cdr(entry);
                     if (!CHECK_K(key))
                         SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     if (!CHECK_T(val)) {
                         if (!SCHEME_PAIRP(val))
                             SWIG_exception(SWIG_TypeError,"alist expected");
                         val = scheme_car(val);
                         if (!CHECK_T(val))
                             SWIG_exception(SWIG_TypeError,
-                                           "map<" #K "," #T "> expected");
+                                           "map<" #K "," #T "," #C "> expected");
                     }
                     temp[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val);
                     alist = scheme_cdr(alist);
@@ -767,9 +767,9 @@
                 $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
             }
         }
-        %typemap(out) map<K,T> {
+        %typemap(out) map< K, T, C > {
             Scheme_Object* alist = scheme_null;
-            for (std::map<K,T >::reverse_iterator i=$1.rbegin(); 
+            for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); 
                                                   i!=$1.rend(); ++i) {
                 Scheme_Object* k = CONVERT_K_TO(i->first);
                 Scheme_Object* x = CONVERT_T_TO(i->second);
@@ -778,7 +778,7 @@
             }
             $result = alist;
         }
-        %typecheck(SWIG_TYPECHECK_MAP) map<K,T> {
+        %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
             // native sequence?
             if (SCHEME_NULLP($input)) {
                 /* an empty sequence can be of any type */
@@ -809,7 +809,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map<K,T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $&1_descriptor, 0) != -1)
                     $1 = 1;
@@ -817,8 +817,8 @@
                     $1 = 0;
             }
         }
-        %typecheck(SWIG_TYPECHECK_MAP) const map<K,T>&,
-                                       const map<K,T>* {
+        %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
+                                       const map< K, T, C >* {
             // native sequence?
             if (SCHEME_NULLP($input)) {
                 /* an empty sequence can be of any type */
@@ -849,7 +849,7 @@
                 }
             } else {
                 // wrapped map?
-                std::map<K,T >* m;
+                std::map< K, T, C >* m;
                 if (SWIG_ConvertPtr($input,(void **) &m,
                                 $1_descriptor, 0) != -1)
                     $1 = 1;
@@ -866,14 +866,14 @@
         %rename("has-key?") has_key;
       public:
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             T __getitem__(K key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -883,19 +883,19 @@
                 (*self)[key] = x;
             }
             void __delitem__(K key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(K key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
             Scheme_Object* keys() {
                 Scheme_Object* result = scheme_null;
-                for (std::map<K,T >::reverse_iterator i=self->rbegin(); 
+                for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); 
                                                       i!=self->rend(); ++i) {
                     Scheme_Object* k = CONVERT_K_TO(i->first);
                     result = scheme_make_pair(k,result);
diff --git a/Lib/ocaml/std_map.i b/Lib/ocaml/std_map.i
index 5656b7f..91756be 100644
--- a/Lib/ocaml/std_map.i
+++ b/Lib/ocaml/std_map.i
@@ -19,7 +19,7 @@
 // exported class
 
 namespace std {
-    template<class K, class T> class map {
+    template<class K, class T, class C = std::less<K> > class map {
         // add typemaps here
       public:
         typedef size_t size_type;
@@ -27,14 +27,14 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             const T& get(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -44,14 +44,14 @@
                 (*self)[key] = x;
             }
             void del(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
         }
diff --git a/Lib/perl5/std_map.i b/Lib/perl5/std_map.i
index af49ed3..ae7c266 100644
--- a/Lib/perl5/std_map.i
+++ b/Lib/perl5/std_map.i
@@ -20,7 +20,7 @@
 
 namespace std {
 
-    template<class K, class T> class map {
+    template<class K, class T, class C = std::less<K> > class map {
         // add typemaps here
       public:
         typedef size_t size_type;
@@ -28,14 +28,14 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             const T& get(const K& key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -45,14 +45,14 @@
                 (*self)[key] = x;
             }
             void del(const K& key) throw (std::out_of_range) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map< K, T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
         }
diff --git a/Lib/php/std_map.i b/Lib/php/std_map.i
index 6d5e3db..020c201 100644
--- a/Lib/php/std_map.i
+++ b/Lib/php/std_map.i
@@ -20,7 +20,7 @@
 
 namespace std {
 
-    template<class K, class T> class map {
+    template<class K, class T, class C = std::less<K> > class map {
         // add typemaps here
       public:
         typedef size_t size_type;
@@ -28,13 +28,13 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         void clear();
         %extend {
             const T& get(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -44,14 +44,14 @@
                 (*self)[key] = x;
             }
             void del(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
             bool is_empty() const {
diff --git a/Lib/scilab/std_map.i b/Lib/scilab/std_map.i
index 250d2d8..0255e2f 100644
--- a/Lib/scilab/std_map.i
+++ b/Lib/scilab/std_map.i
@@ -19,18 +19,18 @@
 
 namespace std {
 
-    template<class K, class T> class map {
+    template<class K, class T, class C = std::less<K> > class map {
         // add typemaps here
       public:
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             const T& get(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -40,14 +40,14 @@
                 (*self)[key] = x;
             }
             void del(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
         }
diff --git a/Lib/tcl/std_map.i b/Lib/tcl/std_map.i
index ade2b0a..96e7cae 100644
--- a/Lib/tcl/std_map.i
+++ b/Lib/tcl/std_map.i
@@ -19,7 +19,7 @@
 
 namespace std {
 
-    template<class K, class T> class map {
+    template<class K, class T, class C = std::less<K> > class map {
         // add typemaps here
       public:
         typedef size_t size_type;
@@ -27,14 +27,14 @@
         typedef K key_type;
         typedef T mapped_type;
         map();
-        map(const map<K,T> &);
+        map(const map< K, T, C > &);
         
         unsigned int size() const;
         bool empty() const;
         void clear();
         %extend {
             const T& get(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     return i->second;
                 else
@@ -44,14 +44,14 @@
                 (*self)[key] = x;
             }
             void del(const K& key) throw (std::out_of_range) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 if (i != self->end())
                     self->erase(i);
                 else
                     throw std::out_of_range("key not found");
             }
             bool has_key(const K& key) {
-                std::map<K,T >::iterator i = self->find(key);
+                std::map< K, T, C >::iterator i = self->find(key);
                 return i != self->end();
             }
         }
diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx
index 62f6fd4..c2952d6 100755
--- a/Source/Modules/python.cxx
+++ b/Source/Modules/python.cxx
@@ -19,7 +19,6 @@
 #include <stdlib.h>
 #include "pydoc.h"
 
-#include <iostream>
 #include <stdint.h>
 
 #define PYSHADOW_MEMBER  0x2
@@ -2865,11 +2864,13 @@
     int noargs = funpack && (tuple_required == 0 && tuple_arguments == 0);
     int onearg = funpack && (tuple_required == 1 && tuple_arguments == 1);
 
-    if (builtin && funpack && !overname && !builtin_ctor && 
-      !(GetFlag(n, "feature:compactdefaultargs") && (tuple_arguments > tuple_required || varargs))) {
-      String *argattr = NewStringf("%d", tuple_arguments);
-      Setattr(n, "python:argcount", argattr);
-      Delete(argattr);
+    if (builtin && funpack && !overname && !builtin_ctor) {
+      int compactdefargs = ParmList_is_compactdefargs(l);
+      if (!(compactdefargs && (tuple_arguments > tuple_required || varargs))) {
+	String *argattr = NewStringf("%d", tuple_arguments);
+	Setattr(n, "python:argcount", argattr);
+	Delete(argattr);
+      }
     }
 
     /* Generate code for argument marshalling */