diff --git a/alib2data/src/automaton/PDA/InputDrivenDPDA.h b/alib2data/src/automaton/PDA/InputDrivenDPDA.h index e54d9799bfe8be0c5262db587e85426509056785..cf781409f473e34d405a6926aec809f6ab1e16c4 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 435207d72dbac306ce482cb9ff704b91472eba8b..75856e43318d92c4de4c4508c37941d7bac798a0 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 f5c58061b98cdfce10d0e4f2cb5f82f7aaf4c326..80c4fc087a5f27062d8281792dafd33631abdce1 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 169bb7c906e0818f284dc569d9253b428b4a8aca..a25d4179817a1efde70afd39f5489c5e96160518 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 393075147bc370778ffa8cf42a24d928cb0a32c3..13f6c51e858ad9424d6c2abcc2a5787a9375c92a 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_ */