void AdInvIdx<KEY>::Filter(const set<KEY> & keys, set<Ice::Long> & gids) { vector<set<Ice::Long> > g_sets; IceUtil::RWRecMutex::WLock lock(mutex_); for (typename set<KEY>::const_iterator kit = keys.begin(); kit != keys.end(); ++kit) { typename map<KEY, set<Ice::Long> >::iterator mit = map_.find(*keys); if (mit == map_.end()) { continue; } else { set<Ice::Long> tmp; set_intersection(mit->second.begin(), mit->second.end(), gids.begin(), gids.end(), inserter(tmp, tmp.begin())); g_sets.push_back(tmp); } } if(g_sets.empty()){ gids.clear(); return; }else if(g_sets.size() == 1){ gids.swap(g_sets.at(0)); return; } set<Ice::Long> result; result.swap(g_sets.at(0)); for(vector<set<Ice::Long> >::iterator vit = ++(g_sets.begin());vit != g_sets.end();++vit){ set<Ice::Long> tmp; set_union(result.begin(),result.end(),(*vit).begin(),(*vit).end(),inserter(tmp,tmp.begin())); result.swap(tmp); } gids.swap(result); }
//--------------------------------------------------------------------------- void SpecialFilter::Filt(set<int> & targets) { set<int> tmpset; IceUtil::Mutex::Lock lock(mutex_); // set_intersection(targets.begin(),targets.end(), ids_.begin(), ids_.end(),std::inserter(tmpset,tmpset.begin())); for (set<int>::iterator sit = targets.begin(); sit != targets.end(); ++sit) { if (ids_.find(*sit) != ids_.end()) { tmpset.insert(*sit); } } targets.swap(tmpset); }
void AdInvIdx<KEY>::Filter(KEY key, set<Ice::Long> & gids) { IceUtil::RWRecMutex::WLock lock(mutex_); typename map<KEY, set<Ice::Long> >::iterator mit = map_.find(key); if (mit == map_.end()) { gids.clear(); } else { set<Ice::Long> tmp; set_intersection(mit->second.begin(), mit->second.end(), gids.begin(), gids.end(), inserter(tmp, tmp.begin())); gids.swap(tmp); } }