From 57a9b1a270e7d23ceb16ccdfbf33870bf4118036 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Wed, 31 Mar 2010 05:01:03 +0200 Subject: [PATCH] Iterator adapter to ennumerate all values to a multimap key (closes #492) --- src/lib/iter-source.hpp | 20 ++++++++++++++++++- tests/40components.tests | 3 +++ tests/lib/iter-source-test.cpp | 35 +++++++++++++++++++++++++++++++--- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/lib/iter-source.hpp b/src/lib/iter-source.hpp index a18de84e0..df924c0e2 100644 --- a/src/lib/iter-source.hpp +++ b/src/lib/iter-source.hpp @@ -337,7 +337,7 @@ namespace lib { /** @return a Lumiera Forward Iterator to yield - * all the keys of the given Map or Hashtable + * all the values of the given Map or Hashtable */ template typename _MapT::ValIter @@ -366,6 +366,23 @@ namespace lib { } + /** @return a Lumiera Forward Iterator to yield all values + * associated to the given key within this Map or Multimap + * @note obviously in case of a Map we'll get at most one result. + */ + template + typename _MapT::ValIter + eachValForKey (MAP& map, typename _MapT::Key key) + { + typedef typename MAP::iterator Pos; + typedef RangeIter Range; + + std::pair valuesForKey = map.equal_range(key); + Range contents (valuesForKey.first, valuesForKey.second); + return wrapIter (takePairSecond(contents)); + } + + /** @param container a STL-like container, providing * - a typedef \c iterator * - functions \c begin() and \c end() @@ -387,6 +404,7 @@ namespace lib { using iter_impl::wrapIter; using iter_impl::eachMapKey; using iter_impl::eachDistinctKey; + using iter_impl::eachValForKey; using iter_impl::eachMapVal; using iter_impl::eachEntry; diff --git a/tests/40components.tests b/tests/40components.tests index 7b4ff8672..ad30413e3 100644 --- a/tests/40components.tests +++ b/tests/40components.tests @@ -366,6 +366,9 @@ out: (::00:0.:....00){13}$ out: (::X...........){13}$ out: (::00:0.:....00){13}$ out: distinct_keys::0::1::2::3::4::5::6::7::8::9::10::11::12 +out: values_4_key(::[0-9]{1,2})+ +out: distinct_keys::0::1::2::3::4::5::6::7::8::9::10::11::12 +out: values_4_key(::[0-9]{1,2})+ END diff --git a/tests/lib/iter-source-test.cpp b/tests/lib/iter-source-test.cpp index 3565f9c98..3fc03664f 100644 --- a/tests/lib/iter-source-test.cpp +++ b/tests/lib/iter-source-test.cpp @@ -172,8 +172,8 @@ namespace test{ verify_MapWrappers(); verify_MapWrappers(); - verify_MultimapKeyIter(); - verify_MultimapKeyIter(); + verify_MultimapIters(); + verify_MultimapIters(); } @@ -225,12 +225,31 @@ namespace test{ pullOut (tIter); ASSERT (!sIter && !tIter); + + + // The each-value-for-given-key-Iterator can be used for a map or multimap. + // In case of a map, it should yield exactly one result for existing values + // and zero results for non-existing mappings + StringIter justSomeKey = eachMapKey (testMap); + TimeIter correspondingVal = eachMapVal (testMap); + ++justSomeKey; + ++correspondingVal; + ASSERT (justSomeKey); + + TimeIter value4key = eachValForKey (testMap, "nonexistent key"); + ASSERT (!value4key); + + value4key = eachValForKey (testMap, *justSomeKey); + ASSERT (value4key); + ASSERT (*value4key == *correspondingVal); + ++value4key; + ASSERT (!value4key); } template void - verify_MultimapKeyIter() ///< @see IterTools_test#verify_filterRepetitions + verify_MultimapIters() ///< @see IterTools_test#verify_filterRepetitions { MAP testMap; for (uint i=0; i