00001 /* 00002 * SummaryVector.cpp 00003 * 00004 * Created on: 02.03.2010 00005 * Author: morgenro 00006 */ 00007 00008 #include "routing/SummaryVector.h" 00009 00010 namespace dtn 00011 { 00012 namespace routing 00013 { 00014 SummaryVector::SummaryVector(const std::set<dtn::data::MetaBundle> &list) 00015 : _bf(8192, 2) 00016 { 00017 add(list); 00018 } 00019 00020 SummaryVector::SummaryVector() 00021 : _bf(8192, 2) 00022 { 00023 } 00024 00025 SummaryVector::~SummaryVector() 00026 { 00027 } 00028 00029 void SummaryVector::rebuild() 00030 { 00031 _bf.clear(); 00032 00033 for (std::set<dtn::data::BundleID>::const_iterator iter = _ids.begin(); iter != _ids.end(); iter++) 00034 { 00035 _bf.insert( (*iter).toString() ); 00036 } 00037 } 00038 00039 void SummaryVector::add(const std::set<dtn::data::MetaBundle> &list) 00040 { 00041 for (std::set<dtn::data::MetaBundle>::const_iterator iter = list.begin(); iter != list.end(); iter++) 00042 { 00043 add( *iter ); 00044 } 00045 } 00046 00047 bool SummaryVector::contains(const dtn::data::BundleID &id) const 00048 { 00049 return _bf.contains(id.toString()); 00050 } 00051 00052 void SummaryVector::add(const dtn::data::BundleID &id) 00053 { 00054 _bf.insert(id.toString()); 00055 _ids.insert( id ); 00056 } 00057 00058 void SummaryVector::remove(const dtn::data::BundleID &id) 00059 { 00060 _ids.erase( id ); 00061 rebuild(); 00062 } 00063 00064 void SummaryVector::clear() 00065 { 00066 _bf.clear(); 00067 _ids.clear(); 00068 } 00069 00070 const ibrcommon::BloomFilter& SummaryVector::getBloomFilter() const 00071 { 00072 return _bf; 00073 } 00074 00075 std::set<dtn::data::BundleID> SummaryVector::getNotIn(ibrcommon::BloomFilter &filter) const 00076 { 00077 std::set<dtn::data::BundleID> ret; 00078 00079 // // if the lists are equal return an empty list 00080 // if (filter == _bf) return ret; 00081 00082 // iterate through all items to find the differences 00083 for (std::set<dtn::data::BundleID>::const_iterator iter = _ids.begin(); iter != _ids.end(); iter++) 00084 { 00085 if (!filter.contains( (*iter).toString() ) ) 00086 { 00087 ret.insert( (*iter) ); 00088 } 00089 } 00090 00091 return ret; 00092 } 00093 00094 size_t SummaryVector::getLength() const 00095 { 00096 return dtn::data::SDNV(_bf.size()).getLength() + _bf.size(); 00097 } 00098 00099 std::ostream &operator<<(std::ostream &stream, const SummaryVector &obj) 00100 { 00101 dtn::data::SDNV size(obj._bf.size()); 00102 stream << size; 00103 00104 const char *data = reinterpret_cast<const char*>(obj._bf.table()); 00105 stream.write(data, obj._bf.size()); 00106 00107 return stream; 00108 } 00109 00110 std::istream &operator>>(std::istream &stream, SummaryVector &obj) 00111 { 00112 dtn::data::SDNV count; 00113 stream >> count; 00114 00115 char buffer[count.getValue()]; 00116 00117 stream.read(buffer, count.getValue()); 00118 00119 obj.clear(); 00120 obj._bf.load((unsigned char*)buffer, count.getValue()); 00121 00122 return stream; 00123 } 00124 } 00125 }
1.6.3