#ifndef _SIM_UNORDERED_MAP
#define _SIM_UNORDERED_MAP

#pragma clang system_header
#include "sim_initializer_list"

namespace std {

template <typename Key, typename Value>
class unordered_map {
public:
  using value_type = pair<Key, Value>;
  unordered_map();
  unordered_map(initializer_list<pair<Key, Value>> initList);
  value_type& operator[](const Key& key);
  value_type& operator[](Key&& key);
  class iterator {
  public:
    iterator(Key *key): ptr(key) {}
    iterator& operator++() { ++ptr; return *this; }
    bool operator!=(const iterator &other) const { return ptr != other.ptr; }
    const Key &operator*() const { return *ptr; }
  private:
    Key *ptr;
  };
  Key *val;
  iterator begin() const { return iterator(val); }
  iterator end() const { return iterator(val + 1); }
};

} // namespace std

#endif // _SIM_UNORDERED_MAP
