diff --git a/src/lib/iter-adapter-stl.hpp b/src/lib/iter-adapter-stl.hpp index 86e23cb70..632f63bd7 100644 --- a/src/lib/iter-adapter-stl.hpp +++ b/src/lib/iter-adapter-stl.hpp @@ -43,9 +43,6 @@ #include "lib/iter-adapter.hpp" -/////////////////////////TODO remove -#include "lib/itertools.hpp" -/////////////////////////TODO remove @@ -177,6 +174,8 @@ namespace iter_stl { typedef RangeIter KeyIter; typedef RangeIter ValIter; + + typedef DistinctIter DistinctKeys; }; @@ -243,13 +242,33 @@ namespace iter_stl { } - /** + /** @return Lumiera Forward Iterator to yield + * the distinct keys from a multimap + * @warning full scan of all keys, dropping repetitions */ template - inline typename _MapT::KeyIter - eachDistinctKey (MAP) + inline typename _MapT::DistinctKeys + eachDistinctKey (MAP& map) { - UNIMPLEMENTED ("each distinct key a multimap as Lumiera Forward Iterator"); + return typename _MapT::DistinctKeys (eachKey (map)); + } + + + /** @return Lumiera Forward Iterator to yield + * the distinct keys from a multimap + * @warning full scan of all keys, dropping repetitions + */ + template + inline typename _MapT::ValIter + eachValForKey (MMAP& multimap, KEY key) + { + typedef typename _MapT::EntryIter Pos; + typedef typename _MapT::ValIter Range; + typedef typename _MapT::PickValIter PickVal; + + std::pair valRange = multimap.equal_range (key); + + return Range (PickVal (valRange.first), PickVal (valRange.second)); } diff --git a/src/lib/test/test-coll.hpp b/src/lib/test/test-coll.hpp index 8053fce37..09578d5fb 100644 --- a/src/lib/test/test-coll.hpp +++ b/src/lib/test/test-coll.hpp @@ -62,8 +62,8 @@ namespace test{ typedef std::map MapII; typedef std::multimap MMapII; - typedef std::tr1::unordered_map HMap; - typedef std::tr1::unordered_multimap HMMap; + typedef std::tr1::unordered_map HMapII; + typedef std::tr1::unordered_multimap HMMapII; template @@ -83,7 +83,7 @@ namespace test{ { MUMAP map; for (uint i=0; i (arg[0]); checkDistinctValIter(); + iterateMapKeyVal (getTestMap_int (NUM_ELMS)); + iterateMapKeyVal (getTestMap_int (NUM_ELMS)); + + iterateMapKeyVal (getTestMultiMap_int (NUM_ELMS)); + iterateMapKeyVal (getTestMultiMap_int (NUM_ELMS)); + + iterateValues4Key (getTestMultiMap_int (NUM_ELMS)); + iterateValues4Key (getTestMultiMap_int (NUM_ELMS)); } template void - iterateMapKeyVal(MAP const& map) + iterateMapKeyVal (MAP const& map) { PRINT_FUNC (iterateMapKeyVal, MAP); @@ -110,6 +118,19 @@ namespace test{ } + template + void + iterateValues4Key (MMAP const& mumap) + { + PRINT_FUNC (iterateValues4Key, MMAP); + + TEST_ITER (iter::eachValForKey, (mumap, 0)); + + // non-existing key should yield empty iterator + CHECK (! iter::eachValForKey (mumap, NUM_ELMS)); + } + + void checkDistinctValIter() {