similar low-level iterator adapter for multimap value groups

This commit is contained in:
Fischlurch 2010-04-02 03:36:31 +02:00
parent c5e4725dcb
commit 81f87ba852
3 changed files with 51 additions and 11 deletions

View file

@ -43,9 +43,6 @@
#include "lib/iter-adapter.hpp" #include "lib/iter-adapter.hpp"
/////////////////////////TODO remove
#include "lib/itertools.hpp"
/////////////////////////TODO remove
@ -177,6 +174,8 @@ namespace iter_stl {
typedef RangeIter<PickKeyIter> KeyIter; typedef RangeIter<PickKeyIter> KeyIter;
typedef RangeIter<PickValIter> ValIter; typedef RangeIter<PickValIter> ValIter;
typedef DistinctIter<KeyIter> 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<class MAP> template<class MAP>
inline typename _MapT<MAP>::KeyIter inline typename _MapT<MAP>::DistinctKeys
eachDistinctKey (MAP) eachDistinctKey (MAP& map)
{ {
UNIMPLEMENTED ("each distinct key a multimap as Lumiera Forward Iterator"); return typename _MapT<MAP>::DistinctKeys (eachKey (map));
}
/** @return Lumiera Forward Iterator to yield
* the distinct keys from a multimap
* @warning full scan of all keys, dropping repetitions
*/
template<class MMAP, typename KEY>
inline typename _MapT<MMAP>::ValIter
eachValForKey (MMAP& multimap, KEY key)
{
typedef typename _MapT<MMAP>::EntryIter Pos;
typedef typename _MapT<MMAP>::ValIter Range;
typedef typename _MapT<MMAP>::PickValIter PickVal;
std::pair<Pos,Pos> valRange = multimap.equal_range (key);
return Range (PickVal (valRange.first), PickVal (valRange.second));
} }

View file

@ -62,8 +62,8 @@ namespace test{
typedef std::map<int,int> MapII; typedef std::map<int,int> MapII;
typedef std::multimap<int,int> MMapII; typedef std::multimap<int,int> MMapII;
typedef std::tr1::unordered_map<int,int> HMap; typedef std::tr1::unordered_map<int,int> HMapII;
typedef std::tr1::unordered_multimap<int,int> HMMap; typedef std::tr1::unordered_multimap<int,int> HMMapII;
template<class MAP> template<class MAP>
@ -83,7 +83,7 @@ namespace test{
{ {
MUMAP map; MUMAP map;
for (uint i=0; i<NUM_ELMS; ++i) for (uint i=0; i<NUM_ELMS; ++i)
for (uint j=NUM_ELMS; j; --j) for (uint j=NUM_ELMS-i; j; --j)
map.insert (std::make_pair (i, j)); map.insert (std::make_pair (i, j));
return map; return map;

View file

@ -94,13 +94,21 @@ namespace test{
if (0 < arg.size()) NUM_ELMS = lexical_cast<uint> (arg[0]); if (0 < arg.size()) NUM_ELMS = lexical_cast<uint> (arg[0]);
checkDistinctValIter(); checkDistinctValIter();
iterateMapKeyVal (getTestMap_int<MapII> (NUM_ELMS)); iterateMapKeyVal (getTestMap_int<MapII> (NUM_ELMS));
iterateMapKeyVal (getTestMap_int<HMapII> (NUM_ELMS));
iterateMapKeyVal (getTestMultiMap_int<MMapII> (NUM_ELMS));
iterateMapKeyVal (getTestMultiMap_int<HMMapII> (NUM_ELMS));
iterateValues4Key (getTestMultiMap_int<MMapII> (NUM_ELMS));
iterateValues4Key (getTestMultiMap_int<HMMapII> (NUM_ELMS));
} }
template<class MAP> template<class MAP>
void void
iterateMapKeyVal(MAP const& map) iterateMapKeyVal (MAP const& map)
{ {
PRINT_FUNC (iterateMapKeyVal, MAP); PRINT_FUNC (iterateMapKeyVal, MAP);
@ -110,6 +118,19 @@ namespace test{
} }
template<class MMAP>
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 void
checkDistinctValIter() checkDistinctValIter()
{ {