// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. // ==++== // // // // ==--== /*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX XX XX unordered_map XX XX Derives from hashtable for most implementation. Inserted elements are XX XX value pairs and the hash key is provided by the helper method that XX XX extracts the key from the key value pair XX XX XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ #pragma once #include "hashtable.h" namespace jitstd { template struct pair_key { Key& operator()(const jitstd::pair& pair) const { return pair.first; } }; template, typename Pred = jitstd::equal_to, typename Alloc = jitstd::allocator > > class unordered_map : public hashtable, Hash, Pred, Alloc, pair_key> { public: typedef Key key_type; typedef Value mapped_type; typedef jitstd::pair value_type; typedef Hash hasher; typedef Pred key_equal; typedef Alloc allocator_type; typedef typename allocator_type::pointer pointer; typedef typename allocator_type::const_pointer const_pointer; typedef typename allocator_type::reference reference; typedef typename allocator_type::const_reference const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; explicit unordered_map(size_type size, const hasher& hasher, const key_equal& pred, const allocator_type& allocator); explicit unordered_map(size_type size, const allocator_type& allocator); template unordered_map(InputIterator, InputIterator, size_type size, const hasher& hasher, const key_equal& pred, const allocator_type& allocator); unordered_map(const unordered_map& map); explicit unordered_map(const allocator_type& allocator); unordered_map(const unordered_map& map, const allocator_type& allocator); ~unordered_map(); unordered_map& operator=(unordered_map const&); mapped_type& operator[](const Key& key); mapped_type& operator[](key_type&& key); typename unordered_map::iterator insert(const key_type& key, const mapped_type& value); private: typedef hashtable, Hash, Pred, Alloc, pair_key> base_type; }; } namespace jitstd { template unordered_map::unordered_map(size_type size, const hasher& hasher, const key_equal& pred, const allocator_type& allocator) : base_type(size, hasher, pred, allocator) { } template unordered_map::unordered_map(size_type size, const allocator_type& allocator) : base_type(size, allocator) { } template template unordered_map::unordered_map(InputIterator first, InputIterator last, size_type size, const hasher& hasher, const key_equal& pred, const allocator_type& allocator) : base_type(first, last, size, hasher, pred, allocator) { } template unordered_map::unordered_map(const unordered_map& map) : base_type(map) { } template unordered_map::unordered_map(const allocator_type& allocator) : base_type(allocator) { } template unordered_map::unordered_map(const unordered_map& map, const allocator_type& allocator) : base_type(map, allocator) { } template unordered_map::~unordered_map() { } template unordered_map& unordered_map::operator=(const unordered_map& map) { base_type::operator=(map); return *this; } template Value& unordered_map::operator[](const Key& key) { typename unordered_map::iterator iter = base_type::find(key, this->key_eq()); if (iter == this->end()) { iter = base_type::insert(jitstd::pair(key, mapped_type())).first; } return (*iter).second; } template Value& unordered_map::operator[](key_type&& key) { typename unordered_map::iterator iter = base_type::find(key, this->key_eq()); if (iter == this->end()) { iter = base_type::insert(jitstd::pair(key, mapped_type())).first; } return (*iter).second; } template typename unordered_map::iterator unordered_map::insert(const key_type& key, const mapped_type& value) { typename unordered_map::iterator iter = base_type::find(key, this->key_eq()); iter = base_type::insert(jitstd::pair(key, value)).first; return iter; } }