114262Sodanrc@yahoo.com.br/* 214262Sodanrc@yahoo.com.br * Copyright (c) 2019 Inria 314262Sodanrc@yahoo.com.br * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 414262Sodanrc@yahoo.com.br * All rights reserved. 514262Sodanrc@yahoo.com.br * 614262Sodanrc@yahoo.com.br * Redistribution and use in source and binary forms, with or without 714262Sodanrc@yahoo.com.br * modification, are permitted provided that the following conditions are 814262Sodanrc@yahoo.com.br * met: redistributions of source code must retain the above copyright 914262Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer; 1014262Sodanrc@yahoo.com.br * redistributions in binary form must reproduce the above copyright 1114262Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer in the 1214262Sodanrc@yahoo.com.br * documentation and/or other materials provided with the distribution; 1314262Sodanrc@yahoo.com.br * neither the name of the copyright holders nor the names of its 1414262Sodanrc@yahoo.com.br * contributors may be used to endorse or promote products derived from 1514262Sodanrc@yahoo.com.br * this software without specific prior written permission. 1614262Sodanrc@yahoo.com.br * 1714262Sodanrc@yahoo.com.br * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1814262Sodanrc@yahoo.com.br * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1914262Sodanrc@yahoo.com.br * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2014262Sodanrc@yahoo.com.br * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2114262Sodanrc@yahoo.com.br * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2214262Sodanrc@yahoo.com.br * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2314262Sodanrc@yahoo.com.br * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2414262Sodanrc@yahoo.com.br * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2514262Sodanrc@yahoo.com.br * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2614262Sodanrc@yahoo.com.br * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2714262Sodanrc@yahoo.com.br * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2814262Sodanrc@yahoo.com.br * 2914262Sodanrc@yahoo.com.br * Authors: Daniel Carvalho 3014262Sodanrc@yahoo.com.br */ 3114262Sodanrc@yahoo.com.br 3214262Sodanrc@yahoo.com.br#include "base/filters/multi_bloom_filter.hh" 3314262Sodanrc@yahoo.com.br 3414262Sodanrc@yahoo.com.br#include "base/logging.hh" 3514262Sodanrc@yahoo.com.br#include "params/BloomFilterMulti.hh" 3614262Sodanrc@yahoo.com.br 3714262Sodanrc@yahoo.com.brnamespace BloomFilter { 3814262Sodanrc@yahoo.com.br 3914262Sodanrc@yahoo.com.brMulti::Multi(const BloomFilterMultiParams* p) 4014262Sodanrc@yahoo.com.br : Base(p), filters(p->filters) 4114262Sodanrc@yahoo.com.br{ 4214262Sodanrc@yahoo.com.br} 4314262Sodanrc@yahoo.com.br 4414262Sodanrc@yahoo.com.brMulti::~Multi() 4514262Sodanrc@yahoo.com.br{ 4614262Sodanrc@yahoo.com.br} 4714262Sodanrc@yahoo.com.br 4814262Sodanrc@yahoo.com.brvoid 4914262Sodanrc@yahoo.com.brMulti::clear() 5014262Sodanrc@yahoo.com.br{ 5114262Sodanrc@yahoo.com.br for (auto& sub_filter : filters) { 5214262Sodanrc@yahoo.com.br sub_filter->clear(); 5314262Sodanrc@yahoo.com.br } 5414262Sodanrc@yahoo.com.br} 5514262Sodanrc@yahoo.com.br 5614262Sodanrc@yahoo.com.brvoid 5714262Sodanrc@yahoo.com.brMulti::merge(const Base* other) 5814262Sodanrc@yahoo.com.br{ 5914262Sodanrc@yahoo.com.br auto* cast_other = static_cast<const Multi*>(other); 6014262Sodanrc@yahoo.com.br assert(filters.size() == cast_other->filters.size()); 6114262Sodanrc@yahoo.com.br for (int i = 0; i < filters.size(); ++i){ 6214262Sodanrc@yahoo.com.br filters[i]->merge(cast_other->filters[i]); 6314262Sodanrc@yahoo.com.br } 6414262Sodanrc@yahoo.com.br} 6514262Sodanrc@yahoo.com.br 6614262Sodanrc@yahoo.com.brvoid 6714262Sodanrc@yahoo.com.brMulti::set(Addr addr) 6814262Sodanrc@yahoo.com.br{ 6914262Sodanrc@yahoo.com.br for (auto& sub_filter : filters) { 7014262Sodanrc@yahoo.com.br sub_filter->set(addr); 7114262Sodanrc@yahoo.com.br } 7214262Sodanrc@yahoo.com.br} 7314262Sodanrc@yahoo.com.br 7414262Sodanrc@yahoo.com.brvoid 7514262Sodanrc@yahoo.com.brMulti::unset(Addr addr) 7614262Sodanrc@yahoo.com.br{ 7714262Sodanrc@yahoo.com.br for (auto& sub_filter : filters) { 7814262Sodanrc@yahoo.com.br sub_filter->unset(addr); 7914262Sodanrc@yahoo.com.br } 8014262Sodanrc@yahoo.com.br} 8114262Sodanrc@yahoo.com.br 8214262Sodanrc@yahoo.com.brbool 8314262Sodanrc@yahoo.com.brMulti::isSet(Addr addr) const 8414262Sodanrc@yahoo.com.br{ 8514262Sodanrc@yahoo.com.br int count = 0; 8614262Sodanrc@yahoo.com.br for (const auto& sub_filter : filters) { 8714262Sodanrc@yahoo.com.br if (sub_filter->isSet(addr)) { 8814262Sodanrc@yahoo.com.br count++; 8914262Sodanrc@yahoo.com.br } 9014262Sodanrc@yahoo.com.br } 9114262Sodanrc@yahoo.com.br return count >= setThreshold; 9214262Sodanrc@yahoo.com.br} 9314262Sodanrc@yahoo.com.br 9414262Sodanrc@yahoo.com.brint 9514262Sodanrc@yahoo.com.brMulti::getCount(Addr addr) const 9614262Sodanrc@yahoo.com.br{ 9714262Sodanrc@yahoo.com.br int count = 0; 9814262Sodanrc@yahoo.com.br for (const auto& sub_filter : filters) { 9914262Sodanrc@yahoo.com.br count += sub_filter->getCount(addr); 10014262Sodanrc@yahoo.com.br } 10114262Sodanrc@yahoo.com.br return count; 10214262Sodanrc@yahoo.com.br} 10314262Sodanrc@yahoo.com.br 10414262Sodanrc@yahoo.com.brint 10514262Sodanrc@yahoo.com.brMulti::getTotalCount() const 10614262Sodanrc@yahoo.com.br{ 10714262Sodanrc@yahoo.com.br int count = 0; 10814262Sodanrc@yahoo.com.br for (const auto& sub_filter : filters) { 10914262Sodanrc@yahoo.com.br count += sub_filter->getTotalCount(); 11014262Sodanrc@yahoo.com.br } 11114262Sodanrc@yahoo.com.br return count; 11214262Sodanrc@yahoo.com.br} 11314262Sodanrc@yahoo.com.br 11414262Sodanrc@yahoo.com.br} // namespace BloomFilter 11514262Sodanrc@yahoo.com.br 11614262Sodanrc@yahoo.com.brBloomFilter::Multi* 11714262Sodanrc@yahoo.com.brBloomFilterMultiParams::create() 11814262Sodanrc@yahoo.com.br{ 11914262Sodanrc@yahoo.com.br return new BloomFilter::Multi(this); 12014262Sodanrc@yahoo.com.br} 12114262Sodanrc@yahoo.com.br 122