11#ifndef __ORDERED_MAP_H__
12#define __ORDERED_MAP_H__
17#include <unordered_map>
25 template<
class Key,
class T>
class OrderedMap;
26 template<
class Key,
class T>
class OrderedMapIterator;
27 template<
class Key,
class T>
class OrderedMapConstIterator;
30 template<
class Key,
class T>
40 std::bidirectional_iterator_tag;
137 const typename std::list<Key>::iterator listIter);
142 typename std::list<Key>::iterator _listIter;
144 mutable std::pair<Key, T> _currentPair;
148 template<
class Key,
class T>
158 std::bidirectional_iterator_tag;
257 const typename std::list<Key>::iterator listIter);
262 mutable typename std::list<Key>::iterator _listIter;
264 mutable std::pair<Key, T> _currentPair;
272 template<
class Key,
class T>
425 std::shared_ptr<value_type>
456 std::list<Key> *_ordering;
461template<
class Key,
class T>
464 _ordering(new std::list<Key>())
469template<
class Key,
class T>
472 if (_elements !=
nullptr)
474 if (_ordering !=
nullptr)
478template<
class Key,
class T>
483 if (_elements->insert(value).second) {
484 _ordering->push_back(value.first);
490template<
class Key,
class T>
495 _ordering->remove(pos->first);
496 _elements->erase(pos);
499template<
class Key,
class T>
504 _ordering->remove(key);
505 _elements->erase(_elements->find(key));
508template<
class Key,
class T>
515template<
class Key,
class T>
523template<
class Key,
class T>
531template<
class Key,
class T>
538template<
class Key,
class T>
546template<
class Key,
class T>
554template<
class Key,
class T>
559 return (_elements->size());
562template<
class Key,
class T>
568 return (_elements->find(key) != _elements->end());
571template<
class Key,
class T>
576 std::pair<typename container::iterator, bool> result =
577 _elements->insert(std::make_pair(key, T()));
581 _ordering->push_back(key);
582 return (result.first->second);
585 return (result.first->second);
588template<
class Key,
class T>
595 std::find(_ordering->begin(), _ordering->end(), key)));
598template<
class Key,
class T>
605 typename container::const_iterator it = _elements->find(key);
606 if (it != _elements->end())
607 return (std::shared_ptr<
611 return (std::shared_ptr<
615template<
class Key,
class T>
620 return (_elements->key_eq());
627template<
class Key,
class T>
629 _orderedMap(nullptr),
635template<
class Key,
class T>
638 const typename std::list<Key>::iterator listIter) :
639 _orderedMap(orderedMap),
645template<
class Key,
class T>
650 _currentPair = *(_orderedMap->_elements->find(*_listIter));
651 return (_currentPair);
654template<
class Key,
class T>
659 _currentPair = *(_orderedMap->_elements->find(*_listIter));
660 return (&_currentPair);
663template<
class Key,
class T>
671template<
class Key,
class T>
678 return (previousIterator);
681template<
class Key,
class T>
689template<
class Key,
class T>
696 return (previousIterator);
699template<
class Key,
class T>
705 return ((_orderedMap == rhs._orderedMap) &&
706 (_listIter == rhs._listIter));
709template<
class Key,
class T>
715 return (!(this->
operator==(rhs)));
718template<
class Key,
class T>
728template<
class Key,
class T>
731 _orderedMap(nullptr),
737template<
class Key,
class T>
741 const typename std::list<Key>::iterator listIter) :
742 _orderedMap(orderedMap),
748template<
class Key,
class T>
754 _currentPair = *(_orderedMap->_elements->find(*_listIter));
755 return (_currentPair);
758template<
class Key,
class T>
764 _currentPair = *(_orderedMap->_elements->find(*_listIter));
765 return (&_currentPair);
768template<
class Key,
class T>
776template<
class Key,
class T>
783 return (previousIterator);
786template<
class Key,
class T>
794template<
class Key,
class T>
801 return (previousIterator);
804template<
class Key,
class T>
810 return ((_orderedMap == rhs._orderedMap) &&
811 (_listIter == rhs._listIter));
814template<
class Key,
class T>
820 return (!(this->
operator==(rhs)));
823template<
class Key,
class T>
827 _orderedMap(iterator._orderedMap),
828 _listIter(iterator._listIter),
829 _currentPair(iterator._currentPair)
834template<
class Key,
class T>
Const Iterator for OrderedMaps.
reference operator*() const
OrderedMapConstIterator & operator--()
Move to the previous pair.
bool operator!=(const OrderedMapConstIterator &rhs) const
Test for iterator equality.
pointer operator->() const
OrderedMapConstIterator & operator++()
Move to the next pair.
const value_type & reference
Reference to the type iterated over.
~OrderedMapConstIterator()
Destructor.
std::bidirectional_iterator_tag iterator_category
Type of iterator.
const value_type * pointer
Pointer to the type iterated over.
bool operator==(const OrderedMapConstIterator &rhs) const
Test for iterator equality.
std::ptrdiff_t difference_type
Type used to measure distance between iterators.
std::pair< Key, T > value_type
Type when dereferencing iterators.
OrderedMapConstIterator()
Constructor.
A map where insertion order is preserved and elements are unique.
const_iterator cend() const
const_iterator cbegin() const
T & operator[](const Key &key)
Subscripting operator.
void erase(iterator pos)
Remove an element from the collection.
bool push_back(const value_type &value)
Insert an element at the end of the collection.
std::shared_ptr< value_type > find_quick(const Key &key) const
bool keyExists(const Key &key) const
Determine if a value exists in the container.
typename container::key_equal key_equal
typename container::size_type size_type
const OrderedMapIterator< Key, T > find(const Key &key) const
Obtain an iterator to a particular key.
typename std::unordered_map< Key, T > container
typename container::value_type value_type
Iterator for OrderedMaps.
OrderedMapIterator & operator++()
Move to the next pair.
OrderedMapIterator()
Constructor.
~OrderedMapIterator()
Destructor.
bool operator!=(const OrderedMapIterator &rhs) const
Test for iterator equality.
std::ptrdiff_t difference_type
Type used to measure distance between iterators.
std::bidirectional_iterator_tag iterator_category
Type of iterator.
bool operator==(const OrderedMapIterator &rhs) const
Test for iterator equality.
std::pair< Key, T > value_type
Type when dereferencing iterators.
value_type & reference
Reference to the type iterated over.
OrderedMapIterator & operator--()
Move to the previous pair.
pointer operator->() const
reference operator*() const
value_type * pointer
Pointer to the type iterated over.
This software was developed at the National Institute of Standards and Technology (NIST) by employees...