uses std::map