Docs GODI Archive
Projects Blog Link DB

Search GODI:


More options
File lib/felix/lib/stl.flx GODI Package apps-felix
 
   stl.flx  
#include "flx_categories.flx"

include "std";
header std_stl_vector = "#include <vector>";
header std_stl_list = "#include <list>";
header std_stl_deque = "#include <deque>";
header std_stl_queue = "#include <queue>";
header std_stl_set = "#include <set>";
header std_stl_map = "#include <map>";
header std_stl_stack = "#include <stack>";
header ext_hash_set = "#include <ext/hash_set>";
header ext_hash_map = "#include <ext/hash_map>";
header ext_slist = "#include <ext/slist>";
// hash for std::string for use with hash containers
header ext_string_hash = """
  namespace __gnu_cxx {
    template<> struct hash<std::string> {
      size_t operator()(std::string const& s)const;
    };
  }
""";

body ext_string_hash = """
// this is a sick hash .. fix it!
size_t __gnu_cxx::hash<std::string>::
  operator()(std::string const& s)const {
    char const *p = s.data();
    int n = s.size();
    int h = 0;
    for(; n; --n,++p) h+= 5 * *p;
    return h;
  }
""";

module Stl
{
  type pair[k,v] = "std::pair<?1 const,?2>";
  fun make_pair[k,v]: k * v ->pair[k,v] = "std::make_pair($1,$2)";

  module Vector[t]
  {
    requires std_stl_vector;
    type stl_vector = "std::vector<?1>";
    fun create : unit -> stl_vector[t] = "(GXX_PARSER_HACK std::vector<?1>())";
    fun create : int * t -> stl_vector[t]= "(GXX_PARSER_HACK std::vector<?1>($1,$2))";
    fun create[i] : i * i -> stl_vector[t] = "(GXX_PARSER_HACK std::vector<?1>($1,$2))";
    gen_cmp stl_vector[t];
    fun len: stl_vector[t] -> int = "$1.size()";
    fun empty: stl_vector[t] -> int = "$1.empty()";
    type stl_vector_iterator = "std::vector<?1>::iterator";
    gen_cmp stl_vector_iterator[t];
    gen_forward stl_vector_iterator[t];
    fun deref : stl_vector_iterator[t] ->  lvalue[t]  = "*$1";
    fun begin : stl_vector[t]-> stl_vector_iterator[t]= "$1.begin()";
    fun end : stl_vector[t]-> stl_vector_iterator[t]= "$1.end()";
    proc erase : stl_vector[t] * stl_vector_iterator[t] = "$1.erase($1);";
    proc erase : stl_vector[t] * stl_vector_iterator[t] * stl_vector_iterator[t] = "$1.erase($1,$2);";
    proc clear : stl_vector[t] = "$1.clear();";
    proc pre_incr : lvalue[stl_vector_iterator[t]] = "++$1;";
    proc post_incr : stl_vector_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_vector_iterator[t]] = "--$1;";
    proc post_decr : stl_vector_iterator[t] = "--$1;";
    type stl_vector_reverse_iterator = "std::vector<?1>::reverse_iterator";
    fun rbegin : stl_vector[t]-> stl_vector_reverse_iterator[t]= "$1.rbegin()";
    fun rend : stl_vector[t]-> stl_vector_reverse_iterator[t]= "$1.rend()";
    fun deref : stl_vector_reverse_iterator[t] ->  lvalue[t]  = "*$1";
    gen_cmp stl_vector_reverse_iterator[t];
    proc pre_incr : lvalue[stl_vector_reverse_iterator[t]] = "++$1;";
    proc post_incr : stl_vector_reverse_iterator[t] = "++$1;";
    proc pre_decr: lvalue[stl_vector_reverse_iterator[t]] = "--$1;";
    proc post_decr : stl_vector_reverse_iterator[t] = "--$1;";
    proc insert: stl_vector[t] * stl_vector_iterator[t] *  t  = "$1.insert($2,$3);";
    proc push_back : stl_vector[t] *  t  = "$1.push_back($2);";
    fun front : stl_vector[t] -> t = "$1.front()";
    fun front : stl_vector[t] -> t = "$1.front()";
    fun subscript : lvalue[stl_vector[t]] * int -> lvalue[t] = "$1.at($2)";
    fun subscript : stl_vector[t] * int -> t = "$1.at($2)";
    fun add: stl_vector_iterator[t] * int -> stl_vector_iterator[t] = "$1+$2";
    fun sub: stl_vector_iterator[t] * int -> stl_vector_iterator[t] = "$1-$2";
    proc pluseq: lvalue[stl_vector_iterator[t]] * int = "$1+=$2;";
    proc minuseq: lvalue[stl_vector_iterator[t]] * int -> stl_vector_iterator[t] = "$1-=$2;";
    fun subscript: stl_vector_iterator[t] * int -> lvalue[t] = "$1[$2]";
  }
  module List[t]
  {
    requires std_stl_list;
    type stl_list = "std::list<?1>";
    fun create : unit -> stl_list[t] = "(GXX_PARSER_HACK std::list<?1>())";
    fun create : int * t -> stl_list[t]= "(GXX_PARSER_HACK std::list<?1>($1,$2))";
    fun create[i] : i * i -> stl_list[t] = "(GXX_PARSER_HACK std::list<?1>($1,$2))";
    gen_cmp stl_list[t];
    fun len: stl_list[t] -> int = "$1.size()";
    fun empty: stl_list[t] -> int = "$1.empty()";
    type stl_list_iterator = "std::list<?1>::iterator";
    gen_cmp stl_list_iterator[t];
    gen_forward stl_list_iterator[t];
    fun deref : stl_list_iterator[t] ->  lvalue[t]  = "*$1";
    fun begin : stl_list[t]-> stl_list_iterator[t]= "$1.begin()";
    fun end : stl_list[t]-> stl_list_iterator[t]= "$1.end()";
    proc erase : stl_list[t] * stl_list_iterator[t] = "$1.erase($1);";
    proc erase : stl_list[t] * stl_list_iterator[t] * stl_list_iterator[t] = "$1.erase($1,$2);";
    proc clear : stl_list[t] = "$1.clear();";
    proc pre_incr : lvalue[stl_list_iterator[t]] = "++$1;";
    proc post_incr : stl_list_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_list_iterator[t]] = "--$1;";
    proc post_decr : stl_list_iterator[t] = "--$1;";
    type stl_list_reverse_iterator = "std::list<?1>::reverse_iterator";
    fun rbegin : stl_list[t]-> stl_list_reverse_iterator[t]= "$1.rbegin()";
    fun rend : stl_list[t]-> stl_list_reverse_iterator[t]= "$1.rend()";
    fun deref : stl_list_reverse_iterator[t] ->  lvalue[t]  = "*$1";
    gen_cmp stl_list_reverse_iterator[t];
    proc pre_incr : lvalue[stl_list_reverse_iterator[t]] = "++$1;";
    proc post_incr : stl_list_reverse_iterator[t] = "++$1;";
    proc pre_decr: lvalue[stl_list_reverse_iterator[t]] = "--$1;";
    proc post_decr : stl_list_reverse_iterator[t] = "--$1;";
    proc insert: stl_list[t] * stl_list_iterator[t] *  t  = "$1.insert($2,$3);";
    proc push_front : stl_list[t] *  t  = "$1.push_front($2);";
    proc push_back : stl_list[t] *  t  = "$1.push_back($2);";
    fun front : stl_list[t] -> t = "$1.front()";
    fun front : stl_list[t] -> t = "$1.front()";
    proc pop_front : stl_list[t] = "$1.pop_back();";
  }
  module Queue[t]
  {
    requires std_stl_queue;
    type stl_queue = "std::queue<?1>";
    fun create : unit -> stl_queue[t] = "(GXX_PARSER_HACK std::queue<?1>())";
    fun create : int * t -> stl_queue[t]= "(GXX_PARSER_HACK std::queue<?1>($1,$2))";
    fun create[i] : i * i -> stl_queue[t] = "(GXX_PARSER_HACK std::queue<?1>($1,$2))";
    gen_cmp stl_queue[t];
    fun len: stl_queue[t] -> int = "$1.size()";
    fun empty: stl_queue[t] -> int = "$1.empty()";
    type stl_queue_iterator = "std::queue<?1>::iterator";
    gen_cmp stl_queue_iterator[t];
    gen_forward stl_queue_iterator[t];
    fun deref : stl_queue_iterator[t] ->  lvalue[t]  = "*$1";
    fun begin : stl_queue[t]-> stl_queue_iterator[t]= "$1.begin()";
    fun end : stl_queue[t]-> stl_queue_iterator[t]= "$1.end()";
    proc erase : stl_queue[t] * stl_queue_iterator[t] = "$1.erase($1);";
    proc erase : stl_queue[t] * stl_queue_iterator[t] * stl_queue_iterator[t] = "$1.erase($1,$2);";
    proc clear : stl_queue[t] = "$1.clear();";
    proc pre_incr : lvalue[stl_queue_iterator[t]] = "++$1;";
    proc post_incr : stl_queue_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_queue_iterator[t]] = "--$1;";
    proc post_decr : stl_queue_iterator[t] = "--$1;";
    proc insert: stl_queue[t] * stl_queue_iterator[t] *  t  = "$1.insert($2,$3);";
  }
  module Deque[t]
  {
    requires std_stl_deque;
    type stl_deque = "std::deque<?1>";
    fun create : unit -> stl_deque[t] = "(GXX_PARSER_HACK std::deque<?1>())";
    fun create : int * t -> stl_deque[t]= "(GXX_PARSER_HACK std::deque<?1>($1,$2))";
    fun create[i] : i * i -> stl_deque[t] = "(GXX_PARSER_HACK std::deque<?1>($1,$2))";
    gen_cmp stl_deque[t];
    fun len: stl_deque[t] -> int = "$1.size()";
    fun empty: stl_deque[t] -> int = "$1.empty()";
    type stl_deque_iterator = "std::deque<?1>::iterator";
    gen_cmp stl_deque_iterator[t];
    gen_forward stl_deque_iterator[t];
    fun deref : stl_deque_iterator[t] ->  lvalue[t]  = "*$1";
    fun begin : stl_deque[t]-> stl_deque_iterator[t]= "$1.begin()";
    fun end : stl_deque[t]-> stl_deque_iterator[t]= "$1.end()";
    proc erase : stl_deque[t] * stl_deque_iterator[t] = "$1.erase($1);";
    proc erase : stl_deque[t] * stl_deque_iterator[t] * stl_deque_iterator[t] = "$1.erase($1,$2);";
    proc clear : stl_deque[t] = "$1.clear();";
    proc pre_incr : lvalue[stl_deque_iterator[t]] = "++$1;";
    proc post_incr : stl_deque_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_deque_iterator[t]] = "--$1;";
    proc post_decr : stl_deque_iterator[t] = "--$1;";
    type stl_deque_reverse_iterator = "std::deque<?1>::reverse_iterator";
    fun rbegin : stl_deque[t]-> stl_deque_reverse_iterator[t]= "$1.rbegin()";
    fun rend : stl_deque[t]-> stl_deque_reverse_iterator[t]= "$1.rend()";
    fun deref : stl_deque_reverse_iterator[t] ->  lvalue[t]  = "*$1";
    gen_cmp stl_deque_reverse_iterator[t];
    proc pre_incr : lvalue[stl_deque_reverse_iterator[t]] = "++$1;";
    proc post_incr : stl_deque_reverse_iterator[t] = "++$1;";
    proc pre_decr: lvalue[stl_deque_reverse_iterator[t]] = "--$1;";
    proc post_decr : stl_deque_reverse_iterator[t] = "--$1;";
    proc insert: stl_deque[t] * stl_deque_iterator[t] *  t  = "$1.insert($2,$3);";
    proc push_front : stl_deque[t] *  t  = "$1.push_front($2);";
    proc push_back : stl_deque[t] *  t  = "$1.push_back($2);";
    proc pop_front : stl_deque[t] = "$1.pop_back();";
    fun front : stl_deque[t] -> t = "$1.front()";
    fun front : stl_deque[t] -> t = "$1.front()";
    fun subscript : lvalue[stl_deque[t]] * int -> lvalue[t] = "$1.at($2)";
    fun subscript : stl_deque[t] * int -> t = "$1.at($2)";
  }
  module PriorityQueue[t]
  {
    requires std_stl_queue;
    type stl_priorityqueue = "std::priorityqueue<?1>";
    fun create : unit -> stl_priorityqueue[t] = "(GXX_PARSER_HACK std::priorityqueue<?1>())";
    fun create : int * t -> stl_priorityqueue[t]= "(GXX_PARSER_HACK std::priorityqueue<?1>($1,$2))";
    fun create[i] : i * i -> stl_priorityqueue[t] = "(GXX_PARSER_HACK std::priorityqueue<?1>($1,$2))";
    gen_cmp stl_priorityqueue[t];
    fun len: stl_priorityqueue[t] -> int = "$1.size()";
    fun empty: stl_priorityqueue[t] -> int = "$1.empty()";
    type stl_priorityqueue_iterator = "std::priorityqueue<?1>::iterator";
    gen_cmp stl_priorityqueue_iterator[t];
    gen_forward stl_priorityqueue_iterator[t];
    fun deref : stl_priorityqueue_iterator[t] ->  lvalue[t]  = "*$1";
    fun begin : stl_priorityqueue[t]-> stl_priorityqueue_iterator[t]= "$1.begin()";
    fun end : stl_priorityqueue[t]-> stl_priorityqueue_iterator[t]= "$1.end()";
    proc erase : stl_priorityqueue[t] * stl_priorityqueue_iterator[t] = "$1.erase($1);";
    proc erase : stl_priorityqueue[t] * stl_priorityqueue_iterator[t] * stl_priorityqueue_iterator[t] = "$1.erase($1,$2);";
    proc clear : stl_priorityqueue[t] = "$1.clear();";
    proc pre_incr : lvalue[stl_priorityqueue_iterator[t]] = "++$1;";
    proc post_incr : stl_priorityqueue_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_priorityqueue_iterator[t]] = "--$1;";
    proc post_decr : stl_priorityqueue_iterator[t] = "--$1;";
  }
  module Stack[t]
  {
    requires std_stl_stack;
    type stl_stack = "std::stack<?1>";
    fun create : unit -> stl_stack[t] = "(GXX_PARSER_HACK std::stack<?1>())";
    fun create : int * t -> stl_stack[t]= "(GXX_PARSER_HACK std::stack<?1>($1,$2))";
    fun create[i] : i * i -> stl_stack[t] = "(GXX_PARSER_HACK std::stack<?1>($1,$2))";
    gen_cmp stl_stack[t];
    fun len: stl_stack[t] -> int = "$1.size()";
    fun empty: stl_stack[t] -> int = "$1.empty()";
    type stl_stack_iterator = "std::stack<?1>::iterator";
    gen_cmp stl_stack_iterator[t];
    gen_forward stl_stack_iterator[t];
    fun deref : stl_stack_iterator[t] ->  lvalue[t]  = "*$1";
    fun begin : stl_stack[t]-> stl_stack_iterator[t]= "$1.begin()";
    fun end : stl_stack[t]-> stl_stack_iterator[t]= "$1.end()";
    proc erase : stl_stack[t] * stl_stack_iterator[t] = "$1.erase($1);";
    proc erase : stl_stack[t] * stl_stack_iterator[t] * stl_stack_iterator[t] = "$1.erase($1,$2);";
    proc clear : stl_stack[t] = "$1.clear();";
    proc pre_incr : lvalue[stl_stack_iterator[t]] = "++$1;";
    proc post_incr : stl_stack_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_stack_iterator[t]] = "--$1;";
    proc post_decr : stl_stack_iterator[t] = "--$1;";
  }

  module Set[t]
  {
    requires std_stl_set;
    type stl_set = "std::set<?1>";
    type stl_set_iterator = "std::set<?1>::iterator";
    type stl_set_reverse_iterator = "std::set<?1>::reverse_iterator";
    fun create : unit -> stl_set[t] = "(GXX_PARSER_HACK std::set<?1>())";
    gen_cmp stl_set[t];
    fun len: stl_set[t]->int = "$1.size()";
    fun empty: stl_set[t]->int = "$1.empty()";
    gen_cmp stl_set_iterator[t];
    gen_cmp stl_set_reverse_iterator[t];
    proc pre_incr : lvalue[stl_set_iterator[t]] = "++$1;";
    proc post_incr : stl_set_iterator[t] = "++$1;";
    proc pre_incr : lvalue[stl_set_reverse_iterator[t]] = "++$1;";
    proc post_incr : stl_set_reverse_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_set_iterator[t]] = "--$1;";
    proc post_decr : stl_set_iterator[t] = "--$1;";
    proc pre_decr: lvalue[stl_set_reverse_iterator[t]] = "--$1;";
    proc post_decr : stl_set_reverse_iterator[t] = "--$1;";
    fun deref : stl_set_iterator[t] ->  t  = "*(#0*)&*$1:unary" is unary;
    fun deref : stl_set_reverse_iterator[t] ->  t  = "*(#0*)&*$1:unary" is unary;
    fun begin : stl_set[t]-> stl_set_iterator[t]= "$1.begin()";
    fun end : stl_set[t]-> stl_set_iterator[t]= "$1.end()";
    fun rbegin : stl_set[t]-> stl_set_reverse_iterator[t]= "$1.rbegin()";
    fun rend : stl_set[t]-> stl_set_reverse_iterator[t]= "$1.rend()";
    proc insert : stl_set[t] * t = "$1.insert($2);";
    proc erase : stl_set[t] * stl_set_iterator[t] = "$1.erase($1);";
    proc clear : stl_set[t] = "$1.clear();";
    fun find : stl_set[t] * t ->  stl_set_iterator[t] = "$1.find($2)";
    fun mem : stl_set[t] * t -> bool = "$1.find($2) != $1.end()";
  }
  module MultiSet[t]
  {
    requires std_stl_set;
    type stl_multiset = "std::multiset<?1>";
    type stl_multiset_iterator = "std::multiset<?1>::iterator";
    type stl_multiset_reverse_iterator = "std::multiset<?1>::reverse_iterator";
    fun create : unit -> stl_multiset[t] = "(GXX_PARSER_HACK std::multiset<?1>())";
    gen_cmp stl_multiset[t];
    fun len: stl_multiset[t]->int = "$1.size()";
    fun empty: stl_multiset[t]->int = "$1.empty()";
    gen_cmp stl_multiset_iterator[t];
    gen_cmp stl_multiset_reverse_iterator[t];
    proc pre_incr : lvalue[stl_multiset_iterator[t]] = "++$1;";
    proc post_incr : stl_multiset_iterator[t] = "++$1;";
    proc pre_incr : lvalue[stl_multiset_reverse_iterator[t]] = "++$1;";
    proc post_incr : stl_multiset_reverse_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_multiset_iterator[t]] = "--$1;";
    proc post_decr : stl_multiset_iterator[t] = "--$1;";
    proc pre_decr: lvalue[stl_multiset_reverse_iterator[t]] = "--$1;";
    proc post_decr : stl_multiset_reverse_iterator[t] = "--$1;";
    fun deref : stl_multiset_iterator[t] ->  t  = "*(#0*)&*$1:unary" is unary;
    fun deref : stl_multiset_reverse_iterator[t] ->  t  = "*(#0*)&*$1:unary" is unary;
    fun begin : stl_multiset[t]-> stl_multiset_iterator[t]= "$1.begin()";
    fun end : stl_multiset[t]-> stl_multiset_iterator[t]= "$1.end()";
    fun rbegin : stl_multiset[t]-> stl_multiset_reverse_iterator[t]= "$1.rbegin()";
    fun rend : stl_multiset[t]-> stl_multiset_reverse_iterator[t]= "$1.rend()";
    proc insert : stl_multiset[t] * t = "$1.insert($2);";
    proc erase : stl_multiset[t] * stl_multiset_iterator[t] = "$1.erase($1);";
    proc clear : stl_multiset[t] = "$1.clear();";
    fun find : stl_multiset[t] * t ->  stl_multiset_iterator[t] = "$1.find($2)";
    fun mem : stl_multiset[t] * t -> bool = "$1.find($2) != $1.end()";
  }
  module Map[k,v]
  {
    requires std_stl_map;
    type stl_map = "std::map<?1,?2>";
    type stl_map_iterator = "std::map<?1,?2>::iterator";
    type stl_map_reverse_iterator = "std::map<?1,?2>::reverse_iterator";
    fun create : unit -> stl_map[k,v] = "(GXX_PARSER_HACK std::map<?1,?2>())";
    gen_cmp stl_map[k,v];
    fun len: stl_map[k,v]->int = "$1.size()";
    fun empty: stl_map[k,v]->int = "$1.empty()";
    gen_cmp stl_map_iterator[k,v];
    gen_cmp stl_map_reverse_iterator[k,v];
    proc pre_incr : stl_map_iterator[k,v] = "++$1;";
    proc post_incr : stl_map_iterator[k,v] = "++$1;";
    proc pre_incr : stl_map_reverse_iterator[k,v] = "++$1;";
    proc post_incr : stl_map_reverse_iterator[k,v] = "++$1;";
    proc pre_decr : stl_map_iterator[k,v] = "--$1;";
    proc post_decr : stl_map_iterator[k,v] = "--$1;";
    proc pre_decr : stl_map_reverse_iterator[k,v] = "--$1;";
    proc post_decr : stl_map_reverse_iterator[k,v] = "--$1;";
    fun deref : stl_map_iterator[k,v] ->  k * lvalue[v]  = "*(#0*)&*$1:unary" is unary;
    fun begin : stl_map[k,v]-> stl_map_iterator[k,v]= "$1.begin()";
    fun end : stl_map[k,v]-> stl_map_iterator[k,v]= "$1.end()";
    fun deref : stl_map_reverse_iterator[k,v] ->  k * lvalue[v]  = "*(#0*)&*$1:unary" is unary;
    fun rbegin : stl_map[k,v]-> stl_map_reverse_iterator[k,v]= "$1.rbegin()";
    fun rend : stl_map[k,v]-> stl_map_reverse_iterator[k,v]= "$1.rend()";
    proc insert : stl_map[k,v] * k * v = "$1.insert(std::make_pair($2,$3));";
    proc erase : stl_map[k,v] * stl_map_iterator[k,v] = "$1.erase($1);";
    proc clear : stl_map[k,v] = "$1.clear();";
    fun find : stl_map[k,v] * k ->  stl_map_iterator[k,v] = "$1.find($2)";
    fun mem : stl_map[k,v] * k -> bool = "$1.find($2) != $1.end()";
    fun subscript: stl_map[k,v] * k -> lvalue[v] = "$1[$2]";
  }
  module MultiMap[k,v]
  {
    requires std_stl_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[k,v] = "(GXX_PARSER_HACK std::multimap<?1,?2>())";
    gen_cmp stl_multimap[k,v];
    fun len: stl_multimap[k,v]->int = "$1.size()";
    fun empty: stl_multimap[k,v]->int = "$1.empty()";
    gen_cmp stl_multimap_iterator[k,v];
    gen_cmp stl_multimap_reverse_iterator[k,v];
    proc pre_incr : stl_multimap_iterator[k,v] = "++$1;";
    proc post_incr : stl_multimap_iterator[k,v] = "++$1;";
    proc pre_incr : stl_multimap_reverse_iterator[k,v] = "++$1;";
    proc post_incr : stl_multimap_reverse_iterator[k,v] = "++$1;";
    proc pre_decr : stl_multimap_iterator[k,v] = "--$1;";
    proc post_decr : stl_multimap_iterator[k,v] = "--$1;";
    proc pre_decr : stl_multimap_reverse_iterator[k,v] = "--$1;";
    proc post_decr : stl_multimap_reverse_iterator[k,v] = "--$1;";
    fun deref : stl_multimap_iterator[k,v] ->  k * lvalue[v]  = "*(#0*)&*$1:unary" is unary;
    fun begin : stl_multimap[k,v]-> stl_multimap_iterator[k,v]= "$1.begin()";
    fun end : stl_multimap[k,v]-> stl_multimap_iterator[k,v]= "$1.end()";
    fun deref : stl_multimap_reverse_iterator[k,v] ->  k * lvalue[v]  = "*(#0*)&*$1:unary" is unary;
    fun rbegin : stl_multimap[k,v]-> stl_multimap_reverse_iterator[k,v]= "$1.rbegin()";
    fun rend : stl_multimap[k,v]-> stl_multimap_reverse_iterator[k,v]= "$1.rend()";
    proc insert : stl_multimap[k,v] * k * v = "$1.insert(std::make_pair($2,$3));";
    proc erase : stl_multimap[k,v] * stl_multimap_iterator[k,v] = "$1.erase($1);";
    proc clear : stl_multimap[k,v] = "$1.clear();";
    fun find : stl_multimap[k,v] * k ->  stl_multimap_iterator[k,v] = "$1.find($2)";
    fun mem : stl_multimap[k,v] * k -> bool = "$1.find($2) != $1.end()";
    fun subscript: stl_multimap[k,v] * k -> lvalue[v] = "$1[$2]";
  }

  module Slist[t]
  {
    requires ext_slist;
    type stl_slist = "__gnu_cxx::slist<?1>";
    fun create : unit -> stl_slist[t] = "(GXX_PARSER_HACK __gnu_cxx::slist<?1>())";
    fun create : int * t -> stl_slist[t]= "(GXX_PARSER_HACK __gnu_cxx::slist<?1>($1,$2))";
    fun create[i] : i * i -> stl_slist[t] = "(GXX_PARSER_HACK __gnu_cxx::slist<?1>($1,$2))";
    gen_cmp stl_slist[t];
    fun len: stl_slist[t] -> int = "$1.size()";
    fun empty: stl_slist[t] -> int = "$1.empty()";
    type stl_slist_iterator = "__gnu_cxx::slist<?1>::iterator";
    gen_cmp stl_slist_iterator[t];
    gen_forward stl_slist_iterator[t];
    fun deref : stl_slist_iterator[t] ->  lvalue[t]  = "*$1";
    fun begin : stl_slist[t]-> stl_slist_iterator[t]= "$1.begin()";
    fun end : stl_slist[t]-> stl_slist_iterator[t]= "$1.end()";
    proc erase : stl_slist[t] * stl_slist_iterator[t] = "$1.erase($1);";
    proc erase : stl_slist[t] * stl_slist_iterator[t] * stl_slist_iterator[t] = "$1.erase($1,$2);";
    proc clear : stl_slist[t] = "$1.clear();";
    proc pre_incr : lvalue[stl_slist_iterator[t]] = "++$1;";
    proc post_incr : stl_slist_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_slist_iterator[t]] = "--$1;";
    proc post_decr : stl_slist_iterator[t] = "--$1;";
    proc push_front : stl_slist[t] *  t  = "$1.push_front($2);";
    fun front : stl_slist[t] -> t = "$1.front()";
    proc pop_front : stl_slist[t] = "$1.pop_back();";
    proc insert_after : stl_slist[t] * stl_slist_iterator[t] *  t  = "$1.insert_after($2,$3);";
    proc erase_after : stl_slist[t] * stl_slist_iterator[t] = "$1.erase_after($1);";
  }
// HASHTABLE based containers assume
// these classes will be added to C++ via TR1 in the future.
// g++ 3.2.2 at least has these classes
// The free SGI implementation may suffice as a replacement,
// this is what my version of g++ uses.

  module HashSet[t]
  {
    requires ext_hash_set;
    type stl_hash_set = "__gnu_cxx::hash_set<?1>";
    type stl_hash_set_iterator = "__gnu_cxx::hash_set<?1>::iterator";
    type stl_hash_set_reverse_iterator = "__gnu_cxx::hash_set<?1>::reverse_iterator";
    fun create : unit -> stl_hash_set[t] = "(GXX_PARSER_HACK __gnu_cxx::hash_set<?1>())";
    gen_cmp stl_hash_set[t];
    fun len: stl_hash_set[t]->int = "$1.size()";
    fun empty: stl_hash_set[t]->int = "$1.empty()";
    gen_cmp stl_hash_set_iterator[t];
    gen_cmp stl_hash_set_reverse_iterator[t];
    proc pre_incr : lvalue[stl_hash_set_iterator[t]] = "++$1;";
    proc post_incr : stl_hash_set_iterator[t] = "++$1;";
    proc pre_incr : lvalue[stl_hash_set_reverse_iterator[t]] = "++$1;";
    proc post_incr : stl_hash_set_reverse_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_hash_set_iterator[t]] = "--$1;";
    proc post_decr : stl_hash_set_iterator[t] = "--$1;";
    proc pre_decr: lvalue[stl_hash_set_reverse_iterator[t]] = "--$1;";
    proc post_decr : stl_hash_set_reverse_iterator[t] = "--$1;";
    fun deref : stl_hash_set_iterator[t] ->  t  = "*(#0*)&*$1:unary" is unary;
    fun deref : stl_hash_set_reverse_iterator[t] ->  t  = "*(#0*)&*$1:unary" is unary;
    fun begin : stl_hash_set[t]-> stl_hash_set_iterator[t]= "$1.begin()";
    fun end : stl_hash_set[t]-> stl_hash_set_iterator[t]= "$1.end()";
    fun rbegin : stl_hash_set[t]-> stl_hash_set_reverse_iterator[t]= "$1.rbegin()";
    fun rend : stl_hash_set[t]-> stl_hash_set_reverse_iterator[t]= "$1.rend()";
    proc insert : stl_hash_set[t] * t = "$1.insert($2);";
    proc erase : stl_hash_set[t] * stl_hash_set_iterator[t] = "$1.erase($1);";
    proc clear : stl_hash_set[t] = "$1.clear();";
    fun find : stl_hash_set[t] * t ->  stl_hash_set_iterator[t] = "$1.find($2)";
    fun mem : stl_hash_set[t] * t -> bool = "$1.find($2) != $1.end()";
  }
  module HashMultiSet[t]
  {
    requires ext_hash_set;
    type stl_hash_multiset = "__gnu_cxx::hash_multiset<?1>";
    fun create : unit -> stl_hash_multiset[t] = "(GXX_PARSER_HACK __gnu_cxx::hash_multiset<?1>())";
    fun create : int * t -> stl_hash_multiset[t]= "(GXX_PARSER_HACK __gnu_cxx::hash_multiset<?1>($1,$2))";
    fun create[i] : i * i -> stl_hash_multiset[t] = "(GXX_PARSER_HACK __gnu_cxx::hash_multiset<?1>($1,$2))";
    gen_cmp stl_hash_multiset[t];
    fun len: stl_hash_multiset[t] -> int = "$1.size()";
    fun empty: stl_hash_multiset[t] -> int = "$1.empty()";
    type stl_hash_multiset_iterator = "__gnu_cxx::hash_multiset<?1>::iterator";
    gen_cmp stl_hash_multiset_iterator[t];
    gen_forward stl_hash_multiset_iterator[t];
    fun deref : stl_hash_multiset_iterator[t] ->  lvalue[t]  = "*$1";
    fun begin : stl_hash_multiset[t]-> stl_hash_multiset_iterator[t]= "$1.begin()";
    fun end : stl_hash_multiset[t]-> stl_hash_multiset_iterator[t]= "$1.end()";
    proc erase : stl_hash_multiset[t] * stl_hash_multiset_iterator[t] = "$1.erase($1);";
    proc erase : stl_hash_multiset[t] * stl_hash_multiset_iterator[t] * stl_hash_multiset_iterator[t] = "$1.erase($1,$2);";
    proc clear : stl_hash_multiset[t] = "$1.clear();";
    proc pre_incr : lvalue[stl_hash_multiset_iterator[t]] = "++$1;";
    proc post_incr : stl_hash_multiset_iterator[t] = "++$1;";
    proc pre_decr : lvalue[stl_hash_multiset_iterator[t]] = "--$1;";
    proc post_decr : stl_hash_multiset_iterator[t] = "--$1;";
  }
  module HashMap[k,v]
  {
    requires ext_hash_map;
    type stl_hash_map = "__gnu_cxx::hash_map<?1,?2>";
    type stl_hash_map_iterator = "__gnu_cxx::hash_map<?1,?2>::iterator";
    type stl_hash_map_reverse_iterator = "__gnu_cxx::hash_map<?1,?2>::reverse_iterator";
    fun create : unit -> stl_hash_map[k,v] = "(GXX_PARSER_HACK __gnu_cxx::hash_map<?1,?2>())";
    gen_cmp stl_hash_map[k,v];
    fun len: stl_hash_map[k,v]->int = "$1.size()";
    fun empty: stl_hash_map[k,v]->int = "$1.empty()";
    gen_cmp stl_hash_map_iterator[k,v];
    gen_cmp stl_hash_map_reverse_iterator[k,v];
    proc pre_incr : stl_hash_map_iterator[k,v] = "++$1;";
    proc post_incr : stl_hash_map_iterator[k,v] = "++$1;";
    proc pre_incr : stl_hash_map_reverse_iterator[k,v] = "++$1;";
    proc post_incr : stl_hash_map_reverse_iterator[k,v] = "++$1;";
    proc pre_decr : stl_hash_map_iterator[k,v] = "--$1;";
    proc post_decr : stl_hash_map_iterator[k,v] = "--$1;";
    proc pre_decr : stl_hash_map_reverse_iterator[k,v] = "--$1;";
    proc post_decr : stl_hash_map_reverse_iterator[k,v] = "--$1;";
    fun deref : stl_hash_map_iterator[k,v] ->  k * lvalue[v]  = "*(#0*)&*$1:unary" is unary;
    fun begin : stl_hash_map[k,v]-> stl_hash_map_iterator[k,v]= "$1.begin()";
    fun end : stl_hash_map[k,v]-> stl_hash_map_iterator[k,v]= "$1.end()";
    fun deref : stl_hash_map_reverse_iterator[k,v] ->  k * lvalue[v]  = "*(#0*)&*$1:unary" is unary;
    fun rbegin : stl_hash_map[k,v]-> stl_hash_map_reverse_iterator[k,v]= "$1.rbegin()";
    fun rend : stl_hash_map[k,v]-> stl_hash_map_reverse_iterator[k,v]= "$1.rend()";
    proc insert : stl_hash_map[k,v] * k * v = "$1.insert(std::make_pair($2,$3));";
    proc erase : stl_hash_map[k,v] * stl_hash_map_iterator[k,v] = "$1.erase($1);";
    proc clear : stl_hash_map[k,v] = "$1.clear();";
    fun find : stl_hash_map[k,v] * k ->  stl_hash_map_iterator[k,v] = "$1.find($2)";
    fun mem : stl_hash_map[k,v] * k -> bool = "$1.find($2) != $1.end()";
    fun subscript: stl_hash_map[k,v] * k -> lvalue[v] = "$1[$2]";
  }
  module HashMultiMap[k,v]
  {
    requires ext_hash_map;
    type stl_hash_multimap = "__gnu_cxx::hash_multimap<?1,?2>";
    type stl_hash_multimap_iterator = "__gnu_cxx::hash_multimap<?1,?2>::iterator";
    type stl_hash_multimap_reverse_iterator = "__gnu_cxx::hash_multimap<?1,?2>::reverse_iterator";
    fun create : unit -> stl_hash_multimap[k,v] = "(GXX_PARSER_HACK __gnu_cxx::hash_multimap<?1,?2>())";
    gen_cmp stl_hash_multimap[k,v];
    fun len: stl_hash_multimap[k,v]->int = "$1.size()";
    fun empty: stl_hash_multimap[k,v]->int = "$1.empty()";
    gen_cmp stl_hash_multimap_iterator[k,v];
    gen_cmp stl_hash_multimap_reverse_iterator[k,v];
    proc pre_incr : stl_hash_multimap_iterator[k,v] = "++$1;";
    proc post_incr : stl_hash_multimap_iterator[k,v] = "++$1;";
    proc pre_incr : stl_hash_multimap_reverse_iterator[k,v] = "++$1;";
    proc post_incr : stl_hash_multimap_reverse_iterator[k,v] = "++$1;";
    proc pre_decr : stl_hash_multimap_iterator[k,v] = "--$1;";
    proc post_decr : stl_hash_multimap_iterator[k,v] = "--$1;";
    proc pre_decr : stl_hash_multimap_reverse_iterator[k,v] = "--$1;";
    proc post_decr : stl_hash_multimap_reverse_iterator[k,v] = "--$1;";
    fun deref : stl_hash_multimap_iterator[k,v] ->  k * lvalue[v]  = "*(#0*)&*$1:unary" is unary;
    fun begin : stl_hash_multimap[k,v]-> stl_hash_multimap_iterator[k,v]= "$1.begin()";
    fun end : stl_hash_multimap[k,v]-> stl_hash_multimap_iterator[k,v]= "$1.end()";
    fun deref : stl_hash_multimap_reverse_iterator[k,v] ->  k * lvalue[v]  = "*(#0*)&*$1:unary" is unary;
    fun rbegin : stl_hash_multimap[k,v]-> stl_hash_multimap_reverse_iterator[k,v]= "$1.rbegin()";
    fun rend : stl_hash_multimap[k,v]-> stl_hash_multimap_reverse_iterator[k,v]= "$1.rend()";
    proc insert : stl_hash_multimap[k,v] * k * v = "$1.insert(std::make_pair($2,$3));";
    proc erase : stl_hash_multimap[k,v] * stl_hash_multimap_iterator[k,v] = "$1.erase($1);";
    proc clear : stl_hash_multimap[k,v] = "$1.clear();";
    fun find : stl_hash_multimap[k,v] * k ->  stl_hash_multimap_iterator[k,v] = "$1.find($2)";
    fun mem : stl_hash_multimap[k,v] * k -> bool = "$1.find($2) != $1.end()";
    fun subscript: stl_hash_multimap[k,v] * k -> lvalue[v] = "$1[$2]";
  }
}

This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml