From 3489cf21b31f9465188f614f237c3c0ddbd13981 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 28 Mar 2019 09:22:25 +0100
Subject: [PATCH] cleaning up the map extensions

---
 alib2data/src/automaton/PDA/InputDrivenDPDA.h |  1 +
 alib2data/src/automaton/PDA/InputDrivenNPDA.h |  1 +
 alib2std/src/extensions/container/map.hpp     | 28 -----------
 .../extensions/container/unordered_map.hpp    | 26 ----------
 alib2std/src/extensions/iterator.hpp          | 48 +++++++++++++++++++
 5 files changed, 50 insertions(+), 54 deletions(-)

diff --git a/alib2data/src/automaton/PDA/InputDrivenDPDA.h b/alib2data/src/automaton/PDA/InputDrivenDPDA.h
index e54d9799bf..cf781409f4 100644
--- a/alib2data/src/automaton/PDA/InputDrivenDPDA.h
+++ b/alib2data/src/automaton/PDA/InputDrivenDPDA.h
@@ -31,6 +31,7 @@
 #include <alib/set>
 #include <alib/vector>
 #include <alib/algorithm>
+#include <alib/iterator>
 
 #include <core/components.hpp>
 
diff --git a/alib2data/src/automaton/PDA/InputDrivenNPDA.h b/alib2data/src/automaton/PDA/InputDrivenNPDA.h
index 435207d72d..75856e4331 100644
--- a/alib2data/src/automaton/PDA/InputDrivenNPDA.h
+++ b/alib2data/src/automaton/PDA/InputDrivenNPDA.h
@@ -31,6 +31,7 @@
 #include <alib/set>
 #include <alib/vector>
 #include <alib/algorithm>
+#include <alib/iterator>
 
 #include <core/components.hpp>
 
diff --git a/alib2std/src/extensions/container/map.hpp b/alib2std/src/extensions/container/map.hpp
index f5c58061b9..80c4fc087a 100644
--- a/alib2std/src/extensions/container/map.hpp
+++ b/alib2std/src/extensions/container/map.hpp
@@ -341,34 +341,6 @@ std::string to_string ( const ext::map < T, R, Ts ... > & value ) {
 	return ss.str();
 }
 
-template<typename map_type>
-class key_iterator : public map_type::const_iterator {
-public:
-	typedef typename map_type::const_iterator map_iterator;
-	typedef typename map_iterator::value_type::first_type key_type;
-
-	key_iterator(const map_iterator& other) : map_iterator(other) {} ;
-
-	const key_type& operator *() const {
-		return map_iterator::operator*().first;
-	}
-
-	const key_type* operator ->() const {
-		return &(map_iterator::operator*().first);
-	}
-};
-
-// helpers to create iterators easier:
-template<typename map_type>
-key_iterator<map_type> key_begin(const map_type& m) {
-	return key_iterator<map_type>(m.begin());
-}
-
-template<typename map_type>
-key_iterator<map_type> key_end(const map_type& m) {
-	return key_iterator<map_type>(m.end());
-}
-
 } /* namespace ext */
 
 #endif /* __MAP_HPP_ */
diff --git a/alib2std/src/extensions/container/unordered_map.hpp b/alib2std/src/extensions/container/unordered_map.hpp
index 169bb7c906..a25d417981 100644
--- a/alib2std/src/extensions/container/unordered_map.hpp
+++ b/alib2std/src/extensions/container/unordered_map.hpp
@@ -103,32 +103,6 @@ public:
 	 */
 	using iterator = typename std::unordered_map<T, R, Hash, KeyEqual, Alloc>::iterator;
 
-	/**
-	 * \brief
-	 * Temporary implementation of insert_or_assign from c++17 standard.
-	 * TODO: Remove this member function after move to C++17
-	 *
-	 * Follows interface from C++17 version of insert_or_assign
-	 *
-	 * \tparam M type of the value to insert
-	 *
-	 * \param k the key
-	 * \param obj the value
-	 *
-	 * \return pair of iterator to the inserted or assigned key-value pair and true if the value was inserted or false if the value was asigned
-	 */
-	template < typename M >
-	std::pair < iterator, bool > insert_or_assign ( const T & k, M && obj ) {
-		iterator pos = this->find ( k );
-		if ( pos == this->end ( ) ) {
-			pos = this->insert ( k, std::forward < M > ( obj ) ).first;
-			return std::make_pair ( pos, true );
-		} else {
-			pos->second = std::forward < M > ( obj );
-			return std::make_pair ( pos, false );
-		}
-	}
-
 	/**
 	 * \brief
 	 * Inherit all insert methods of the standard unordered_map.
diff --git a/alib2std/src/extensions/iterator.hpp b/alib2std/src/extensions/iterator.hpp
index 393075147b..13f6c51e85 100644
--- a/alib2std/src/extensions/iterator.hpp
+++ b/alib2std/src/extensions/iterator.hpp
@@ -1100,6 +1100,54 @@ callback_iterator < T > make_callback_iterator ( const std::function < void ( T
 	return callback_iterator < T > ( callback );
 }
 
+/**
+ * Iterator over map keys.
+ *
+ * \tparam map_type the iterated map
+ */
+template < typename map_type >
+class key_iterator : public map_type::const_iterator {
+public:
+	key_iterator ( const typename map_type::const_iterator & other ) : map_type::const_iterator ( other ) {
+	}
+
+	const typename map_type::value_type::first_type & operator * ( ) const {
+		return map_type::const_iterator::operator * ( ).first;
+	}
+
+	const typename map_type::value_type::first_type * operator -> ( ) const {
+		return & ( map_type::const_iterator::operator * ( ).first );
+	}
+};
+
+/**
+ * Helper to create begin key_iterator for map.
+ *
+ * \tparam map_type the map
+ *
+ * \param m the iterated map
+ *
+ * \result the begin key_iterator
+ */
+template < typename map_type >
+key_iterator < map_type > key_begin ( const map_type & m ) {
+	return key_iterator < map_type > ( m.begin ( ) );
+}
+
+/**
+ * Helper to create end key_iterator for map.
+ *
+ * \tparam map_type the map
+ *
+ * \param m the iterated map
+ *
+ * \result the end key_iterator
+ */
+template < typename map_type >
+key_iterator < map_type > key_end ( const map_type & m ) {
+	return key_iterator < map_type > ( m.end ( ) );
+}
+
 } /* namespace ext */
 
 #endif /* __ITERATOR_HPP_ */
-- 
GitLab