@@ -25,6 +25,7 @@ extern "C" {
25
25
#include " base/flags.h"
26
26
#include " base/logging.h"
27
27
#include " base/pod_array.h"
28
+ #include " core/bloom.h"
28
29
#include " core/detail/bitpacking.h"
29
30
#include " core/sorted_map.h"
30
31
#include " core/string_map.h"
@@ -631,6 +632,10 @@ unsigned CompactObj::ObjType() const {
631
632
return OBJ_JSON;
632
633
}
633
634
635
+ if (taglen_ == SBF_TAG) {
636
+ return OBJ_SBF;
637
+ }
638
+
634
639
LOG (FATAL) << " TBD " << int (taglen_);
635
640
return 0 ;
636
641
}
@@ -649,6 +654,7 @@ string_view CompactObj::ObjTypeToString(unsigned type) {
649
654
OBJECT_TYPE_CASE (OBJ_MODULE);
650
655
OBJECT_TYPE_CASE (OBJ_STREAM);
651
656
OBJECT_TYPE_CASE (OBJ_JSON);
657
+ OBJECT_TYPE_CASE (OBJ_SBF);
652
658
default :
653
659
DCHECK (false ) << " Unknown object type " << type;
654
660
return " OTHER" ;
@@ -707,6 +713,16 @@ void CompactObj::SetJson(JsonType&& j) {
707
713
}
708
714
}
709
715
716
+ void CompactObj::SetSBF (uint64_t initial_capacity, double fp_prob, double grow_factor) {
717
+ if (taglen_ == SBF_TAG) { // already json
718
+ *u_.sbf = SBF (initial_capacity, fp_prob, grow_factor, tl.local_mr );
719
+ } else {
720
+ SetMeta (SBF_TAG);
721
+ void * ptr = tl.local_mr ->allocate (sizeof (SBF));
722
+ u_.sbf = new (ptr) SBF (initial_capacity, fp_prob, grow_factor, tl.local_mr );
723
+ }
724
+ }
725
+
710
726
void CompactObj::SetString (std::string_view str) {
711
727
uint8_t mask = mask_ & ~kEncMask ;
712
728
CHECK (!IsExternal ());
@@ -876,7 +892,7 @@ bool CompactObj::HasAllocated() const {
876
892
(taglen_ == ROBJ_TAG && u_.r_obj .inner_obj () == nullptr ))
877
893
return false ;
878
894
879
- DCHECK (taglen_ == ROBJ_TAG || taglen_ == SMALL_TAG || taglen_ == JSON_TAG);
895
+ DCHECK (taglen_ == ROBJ_TAG || taglen_ == SMALL_TAG || taglen_ == JSON_TAG || taglen_ == SBF_TAG );
880
896
return true ;
881
897
}
882
898
@@ -991,6 +1007,8 @@ void CompactObj::Free() {
991
1007
VLOG (1 ) << " Freeing JSON object" ;
992
1008
u_.json_obj .json_ptr ->~JsonType ();
993
1009
tl.local_mr ->deallocate (u_.json_obj .json_ptr , sizeof (JsonType), kAlignSize );
1010
+ } else if (taglen_ == SBF_TAG) {
1011
+ DeleteMR<SBF>(u_.sbf );
994
1012
} else {
995
1013
LOG (FATAL) << " Unsupported tag " << int (taglen_);
996
1014
}
@@ -1015,6 +1033,9 @@ size_t CompactObj::MallocUsed() const {
1015
1033
return u_.small_str .MallocUsed ();
1016
1034
}
1017
1035
1036
+ if (taglen_ == SBF_TAG) {
1037
+ return 0 ; // TODO: to track SBF memory utilization.
1038
+ }
1018
1039
LOG (DFATAL) << " should not reach" ;
1019
1040
return 0 ;
1020
1041
}
0 commit comments