#line 445 "/home/travis/build/felix-lang/felix/src/packages/stl.fdoc"
  
  include "stl/stl";
  class Stl_MultiMap[k,v]
    {
      requires Cxx_headers::map;
      type stl_multimap = "::std::multimap<?1,?2>";
      type stl_multimap_iterator = "::std::multimap<?1,?2>::iterator";
      type stl_multimap_reverse_iterator = "::std::multimap<?1,?2>::reverse_iterator";
      fun create : unit -> stl_multimap = "(FLX_GXX_PARSER_HACK std::multimap<?1,?2>())";
      fun subscript: stl_multimap * k -> v = "$1[$2]";
      fun find : stl_multimap * k ->  stl_multimap_iterator = "$1.find($2)";
      fun mem : stl_multimap * k -> bool = "$1.find($2) != $1.end()";
      proc insert : stl_multimap * k * v = "$1.insert(std::make_pair($2,$3));";
  // Stl_MultiMap
    instance Eq[stl_multimap] {
      fun == : stl_multimap * stl_multimap -> bool = "$1==$2";
    }
    instance Container[stl_multimap,k*v] {
      fun len: stl_multimap -> size = "$1.size()";
      fun empty: stl_multimap -> bool = "$1.empty()";
    }
    instance Sequence[stl_multimap,stl_multimap_iterator,k*v] {
      fun begin : stl_multimap-> stl_multimap_iterator= "$1.begin()";
      fun end : stl_multimap-> stl_multimap_iterator= "$1.end()";
      proc erase : stl_multimap * stl_multimap_iterator = "$1.erase($1);";
      proc erase_between : stl_multimap * stl_multimap_iterator * stl_multimap_iterator = "$1.erase($1,$2);";
      proc clear : stl_multimap = "$1.clear();";
    }
    instance Reversible_Sequence[stl_multimap,stl_multimap_iterator,stl_multimap_reverse_iterator,k*v] {
      fun rbegin : stl_multimap-> stl_multimap_reverse_iterator= "$1.rbegin()";
      fun rend : stl_multimap-> stl_multimap_reverse_iterator= "$1.rend()";
    }
  
  // Stl_MultiMap iterator
    instance Eq[stl_multimap_iterator] {
      fun == : stl_multimap_iterator * stl_multimap_iterator -> bool = "$1==$2";
    }
    instance Tord[stl_multimap_iterator] {
      fun < : stl_multimap_iterator * stl_multimap_iterator -> bool = "$1<$2";
    }
    instance Iterator[stl_multimap_iterator,k*v] {
      fun deref : stl_multimap_iterator ->  k*v  = "*(#0*)(void*)&*$1";
    }
    instance Forward[stl_multimap_iterator] {
      fun succ: stl_multimap_iterator -> stl_multimap_iterator = "$1+1";
      proc pre_incr : &stl_multimap_iterator = "++*$1;";
      proc post_incr : &stl_multimap_iterator = "++*$1;";
    }
    instance Forward_iterator[stl_multimap_iterator,k*v] {}
    instance Bidirectional[stl_multimap_iterator] {
      fun pred: stl_multimap_iterator -> stl_multimap_iterator = "$1-1;";
      proc pre_decr : &stl_multimap_iterator = "--*$1;";
      proc post_decr : &stl_multimap_iterator = "--*$1;";
    }
    instance Bidirectional_iterator[stl_multimap_iterator,k*v] {}
  
  //Stl_MultiMap reverse iterator
    instance Eq[stl_multimap_reverse_iterator] {
      fun == : stl_multimap_reverse_iterator * stl_multimap_reverse_iterator -> bool = "$1==$2";
    }
    instance Tord[stl_multimap_reverse_iterator] {
      fun < : stl_multimap_reverse_iterator * stl_multimap_reverse_iterator -> bool = "$1<$2";
    }
    instance Iterator[stl_multimap_reverse_iterator,k*v] {
      fun deref : stl_multimap_reverse_iterator ->  k*v  = "*(#0*)(void*)&*$1";
    }
    instance Forward[stl_multimap_reverse_iterator] {
      fun succ: stl_multimap_reverse_iterator -> stl_multimap_reverse_iterator = "$1+1";
      proc pre_incr : &stl_multimap_reverse_iterator = "++*$1;";
      proc post_incr : &stl_multimap_reverse_iterator = "++*$1;";
    }
    instance Forward_iterator[stl_multimap_reverse_iterator,k*v] {}
    instance Bidirectional[stl_multimap_reverse_iterator] {
      fun pred: stl_multimap_reverse_iterator -> stl_multimap_reverse_iterator = "$1-1;";
      proc pre_decr : &stl_multimap_reverse_iterator = "--*$1;";
      proc post_decr : &stl_multimap_reverse_iterator = "--*$1;";
    }
    instance Bidirectional_iterator[stl_multimap_reverse_iterator,k*v] {}
  
  }
  
  open Stl_MultiMap;
  open[k,v] Reversible_Sequence[
    Stl_MultiMap::stl_multimap[k,v],
    Stl_MultiMap::stl_multimap_iterator[k,v],
    Stl_MultiMap::stl_multimap_reverse_iterator[k,v],k*v];
  open[k,v] Bidirectional_iterator[Stl_MultiMap::stl_multimap_iterator[k,v],k*v];
  open[k,v] Bidirectional_iterator[Stl_MultiMap::stl_multimap_reverse_iterator[k,v],k*v];