#line 68 "/home/travis/build/felix-lang/felix/src/packages/stl.fdoc"
  
  include "stl/stl";
  
  class Stl_Vector[t]
  {
      requires Cxx_headers::vector;
      type stl_vector = "::std::vector<?1>";
      fun create : unit -> stl_vector = "(FLX_GXX_PARSER_HACK std::vector<?1>())";
      fun create : int * t -> stl_vector= "(FLX_GXX_PARSER_HACK std::vector<?1>($1,$2))";
      fun create[i] : i * i -> stl_vector = "(FLX_GXX_PARSER_HACK std::vector<?1>($1,$2))";
      type stl_vector_iterator = "::std::vector<?1>::iterator";
      type stl_vector_reverse_iterator = "::std::vector<?1>::reverse_iterator";
      proc insert: stl_vector * stl_vector_iterator *  t  = "$1.insert($2,$3);";
      proc push_back : stl_vector *  t  = "$1.push_back($2);";
      fun front : stl_vector -> t = "$1.front()";
      fun front : stl_vector -> t = "$1.front()";
      lvalue fun subscript : stl_vector * size -> t = "$1.at($2)";
      proc reserve: stl_vector * size -> t = "$1.reserve($2);";
      fun add: stl_vector_iterator * int -> stl_vector_iterator = "$1+$2";
      fun sub: stl_vector_iterator * int -> stl_vector_iterator = "$1-$2";
      proc pluseq: &stl_vector_iterator * int = "*$1+=$2;";
      proc minuseq: &stl_vector_iterator * int = "*$1-=$2;";
      lvalue fun subscript: stl_vector_iterator * size -> t = "$1[$2]";
  // Stl_Vector
    instance Eq[stl_vector] {
      fun == : stl_vector * stl_vector -> bool = "$1==$2";
    }
    instance Container[stl_vector,t] {
      fun len: stl_vector -> size = "$1.size()";
      fun empty: stl_vector -> bool = "$1.empty()";
    }
    instance Sequence[stl_vector,stl_vector_iterator,t] {
      fun begin : stl_vector-> stl_vector_iterator= "$1.begin()";
      fun end : stl_vector-> stl_vector_iterator= "$1.end()";
      proc erase : stl_vector * stl_vector_iterator = "$1.erase($1);";
      proc erase_between : stl_vector * stl_vector_iterator * stl_vector_iterator = "$1.erase($1,$2);";
      proc clear : stl_vector = "$1.clear();";
    }
    instance Reversible_Sequence[stl_vector,stl_vector_iterator,stl_vector_reverse_iterator,t] {
      fun rbegin : stl_vector-> stl_vector_reverse_iterator= "$1.rbegin()";
      fun rend : stl_vector-> stl_vector_reverse_iterator= "$1.rend()";
    }
  
  // Stl_Vector iterator
    instance Eq[stl_vector_iterator] {
      fun == : stl_vector_iterator * stl_vector_iterator -> bool = "$1==$2";
    }
    instance Tord[stl_vector_iterator] {
      fun < : stl_vector_iterator * stl_vector_iterator -> bool = "$1<$2";
    }
    instance Iterator[stl_vector_iterator,t] {
      fun deref : stl_vector_iterator ->  t  = "*(#0*)(void*)&*$1";
    }
    instance Forward[stl_vector_iterator] {
      fun succ: stl_vector_iterator -> stl_vector_iterator = "$1+1";
      proc pre_incr : &stl_vector_iterator = "++*$1;";
      proc post_incr : &stl_vector_iterator = "++*$1;";
    }
    instance Forward_iterator[stl_vector_iterator,t] {}
    instance Bidirectional[stl_vector_iterator] {
      fun pred: stl_vector_iterator -> stl_vector_iterator = "$1-1;";
      proc pre_decr : &stl_vector_iterator = "--*$1;";
      proc post_decr : &stl_vector_iterator = "--*$1;";
    }
    instance Bidirectional_iterator[stl_vector_iterator,t] {}
  
  // Stl_Vector reverse iterator
    instance Eq[stl_vector_reverse_iterator] {
      fun == : stl_vector_reverse_iterator * stl_vector_reverse_iterator -> bool = "$1==$2";
    }
    instance Tord[stl_vector_reverse_iterator] {
      fun < : stl_vector_reverse_iterator * stl_vector_reverse_iterator -> bool = "$1<$2";
    }
    instance Iterator[stl_vector_reverse_iterator,t] {
      fun deref : stl_vector_reverse_iterator ->  t  = "*(#0*)(void*)&*$1";
    }
    instance Forward[stl_vector_reverse_iterator] {
      fun succ: stl_vector_reverse_iterator -> stl_vector_reverse_iterator = "$1+1";
      proc pre_incr : &stl_vector_reverse_iterator = "++*$1;";
      proc post_incr : &stl_vector_reverse_iterator = "++*$1;";
    }
    instance Forward_iterator[stl_vector_reverse_iterator,t] {}
    instance Bidirectional[stl_vector_reverse_iterator] {
      fun pred: stl_vector_reverse_iterator -> stl_vector_reverse_iterator = "$1-1;";
      proc pre_decr : &stl_vector_reverse_iterator = "--*$1;";
      proc post_decr : &stl_vector_reverse_iterator = "--*$1;";
    }
    instance Bidirectional_iterator[stl_vector_reverse_iterator,t] {}
  }
  
  open[t] Stl_Vector[t];
  open[t] Reversible_Sequence[
    Stl_Vector::stl_vector[t],
    Stl_Vector::stl_vector_iterator[t],
    Stl_Vector::stl_vector_reverse_iterator[t],t];
  open[t] Bidirectional_iterator[Stl_Vector::stl_vector_iterator[t],t];
  open[t] Bidirectional_iterator[Stl_Vector::stl_vector_reverse_iterator[t],t];