#include <map>
#include <string>

#define intint_map std::map<int, int>
#define strint_map std::map<std::string, int>
#define intstr_map std::map<int, std::string>
#define strstr_map std::map<std::string, std::string>

int g_the_foo = 0;

int thefoo_rw(int arg = 1) {
  if (arg < 0)
    arg = 0;
  if (!arg)
    arg = 1;
  g_the_foo += arg;
  return g_the_foo;
}

int main() {
  intint_map ii;

  ii[0] = 0; // Set break point at this line.
  ii[1] = 1;

  intint_map::iterator it = ii.begin();
  intint_map::const_iterator const_it = ii.cbegin();
  std::printf("%d %d\n", it->second, const_it->second);

  thefoo_rw(1); // Set break point at this line.
  ii[2] = 0;
  ii[3] = 1;
  thefoo_rw(1); // Set break point at this line.
  ii[4] = 0;
  ii[5] = 1;
  ii[6] = 0;
  ii[7] = 1;
  thefoo_rw(1); // Set break point at this line.
  ii[85] = 1234567;

  ii.clear();

  strint_map si;
  thefoo_rw(1); // Set break point at this line.

  si["zero"] = 0;
  thefoo_rw(1); // Set break point at this line.
  si["one"] = 1;
  si["two"] = 2;
  si["three"] = 3;
  thefoo_rw(1); // Set break point at this line.
  si["four"] = 4;

  si.clear();
  thefoo_rw(1); // Set break point at this line.

  intstr_map is;
  thefoo_rw(1); // Set break point at this line.
  is[85] = "goofy";
  is[1] = "is";
  is[2] = "smart";
  is[3] = "!!!";
  thefoo_rw(1); // Set break point at this line.

  is.clear();
  thefoo_rw(1); // Set break point at this line.

  strstr_map ss;
  thefoo_rw(1); // Set break point at this line.

  ss["ciao"] = "hello";
  ss["casa"] = "house";
  ss["gatto"] = "cat";
  thefoo_rw(1); // Set break point at this line.
  ss["a Mac.."] = "..is always a Mac!";

  ss.clear();
  thefoo_rw(1); // Set break point at this line.
  return 0;
}
