libBf 0.1

bloom_filter_spectral.h

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
 All Classes Functions Variables