libBf 0.1
|
00001 #ifndef BLOOM_FILTER_SPECTRAL_H 00002 #define BLOOM_FILTER_SPECTRAL_H 00003 00004 #include "bloom_filter_basic.h" 00005 00006 namespace bf { 00007 00010 template <typename Core = core<>> 00011 class spectral_mi : public basic<Core> 00012 { 00013 typedef basic<Core> base; 00014 public: 00015 typedef typename base::core_type core_type; 00016 00019 spectral_mi(core_type&& core) 00020 : base(std::forward<core_type>(core)) 00021 { 00022 } 00023 00024 template <typename T> 00025 void add(const T& x) 00026 { 00027 detail::spectral::minimum_increase(x, base::core_); 00028 } 00029 00030 template <typename T> 00031 void remove(const T& x) = delete; 00032 }; 00033 00036 template <typename Core1 = core<>, typename Core2 = Core1> 00037 class spectral_rm : public bloom_filter<spectral_rm<Core1, Core2>> 00038 { 00039 typedef bloom_filter<spectral_rm<Core1, Core2>> base; 00040 public: 00041 typedef Core1 core1_type; 00042 typedef Core2 core2_type; 00043 00047 spectral_rm(core1_type&& core1, core2_type&& core2) 00048 : core1_(core1) 00049 , core2_(core2) 00050 { 00051 } 00052 00053 template <typename T> 00054 void add(const T& x) 00055 { 00056 detail::spectral::recurring_minimum_add(x, core1_, core2_); 00057 } 00058 00059 template <typename T> 00060 void remove(const T& x) 00061 { 00062 detail::spectral::recurring_minimum_remove(x, core1_, core2_); 00063 } 00064 00065 template <typename T> 00066 unsigned count(const T& x) const 00067 { 00068 return detail::spectral::recurring_minimum_count(x, core1_, core2_); 00069 } 00070 00071 void clear() 00072 { 00073 core1_.store.reset(); 00074 core2_.store.reset(); 00075 } 00076 00079 const core1_type& core1() const 00080 { 00081 return core1_; 00082 } 00083 00086 const core2_type& core2() const 00087 { 00088 return core2_; 00089 } 00090 00091 std::string to_string() const 00092 { 00093 std::string str = core1_.store.to_string(); 00094 str.push_back('\n'); 00095 str += core2_.store.to_string(); 00096 00097 return str; 00098 } 00099 00100 private: 00101 core1_type core1_; 00102 core2_type core2_; 00103 }; 00104 00105 } // namespace bf 00106 00107 template < 00108 typename Elem 00109 , typename Traits 00110 , typename Core 00111 > 00112 std::basic_ostream<Elem, Traits>& operator<<( 00113 std::basic_ostream<Elem, Traits>& os, const bf::spectral_mi<Core>& b) 00114 { 00115 os << b.to_string(); 00116 00117 return os; 00118 } 00119 00120 template < 00121 typename Elem 00122 , typename Traits 00123 , typename C1 00124 , typename C2 00125 > 00126 std::basic_ostream<Elem, Traits>& operator<<( 00127 std::basic_ostream<Elem, Traits>& os, const bf::spectral_rm<C1, C2>& b) 00128 { 00129 os << b.to_string(); 00130 00131 return os; 00132 } 00133 00134 #endif