This is an automated email from the ASF dual-hosted git repository.
github-actions[bot] pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/datasketches-cpp.git
The following commit(s) were added to refs/heads/gh-pages by this push:
new 81c8509 deploy: 75934fa5347a5b7a7a48872a4d974e1a8988b210
81c8509 is described below
commit 81c8509fd27efdbeb0d2bd0422099a3082235e84
Author: leerho <[email protected]>
AuthorDate: Fri Jun 5 16:20:24 2026 +0000
deploy: 75934fa5347a5b7a7a48872a4d974e1a8988b210
---
docs/master/CouponList-internal_8hpp_source.html | 527 ++++++++++++-----------
1 file changed, 271 insertions(+), 256 deletions(-)
diff --git a/docs/master/CouponList-internal_8hpp_source.html
b/docs/master/CouponList-internal_8hpp_source.html
index eaf24a5..523c0ee 100644
--- a/docs/master/CouponList-internal_8hpp_source.html
+++ b/docs/master/CouponList-internal_8hpp_source.html
@@ -182,287 +182,302 @@ $(document).ready(function() { init_codefold(0); });
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">
99</span> <span class="keyword">const</span> <span
class="keywordtype">bool</span> emptyFlag = ((data[hll_constants::FLAGS_BYTE]
& hll_constants::EMPTY_FLAG_MASK) ? <span class="keyword">true</span> :
false);</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">
100</span> </div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">
101</span> <span class="keyword">const</span> uint32_t couponCount =
data[hll_constants::LIST_COUNT_BYTE];</div>
-<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">
102</span> <span class="keyword">const</span> uint32_t couponsInArray =
(compact ? couponCount : (1 << HllUtil<A>::computeLgArrInts(LIST,
couponCount, lgK)));</div>
-<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">
103</span> <span class="keyword">const</span> <span
class="keywordtype">size_t</span> expectedLength =
hll_constants::LIST_INT_ARR_START + (couponsInArray * <span
class="keyword">sizeof</span>(uint32_t));</div>
-<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">
104</span> <span class="keywordflow">if</span> (len < expectedLength)
{</div>
-<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">
105</span> <span class="keywordflow">throw</span> std::out_of_range(<span
class="stringliteral">"Byte array too short for sketch. Expected
"</span> + std::to_string(expectedLength)</div>
-<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">
106</span> + <span class="stringliteral">",
found: "</span> + std::to_string(len));</div>
-<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">
107</span> }</div>
-<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">
108</span> </div>
-<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">
109</span> ClAlloc cla(allocator);</div>
-<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">
110</span> CouponList<A>* sketch = <span class="keyword">new</span>
(cla.allocate(1)) CouponList<A>(lgK, tgtHllType, mode, allocator);</div>
-<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">
111</span> sketch->couponCount_ = couponCount;</div>
-<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">
112</span> sketch->putOutOfOrderFlag(oooFlag); <span class="comment">//
should always be false for LIST</span></div>
-<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">
113</span> </div>
-<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">
114</span> <span class="keywordflow">if</span> (!emptyFlag) {</div>
-<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">
115</span> <span class="comment">// only need to read valid coupons, unlike
in stream case</span></div>
-<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">
116</span> std::memcpy(sketch->coupons_.data(), data +
hll_constants::LIST_INT_ARR_START, couponCount * <span
class="keyword">sizeof</span>(uint32_t));</div>
-<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">
117</span> }</div>
-<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">
118</span> </div>
-<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">
119</span> <span class="keywordflow">return</span> sketch;</div>
-<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">
120</span>}</div>
-<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">
121</span> </div>
-<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">
122</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">
123</span>CouponList<A>* CouponList<A>::newList(std::istream&
is, <span class="keyword">const</span> A& allocator) {</div>
-<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">
124</span> uint8_t listHeader[8];</div>
-<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">
125</span> read(is, listHeader, 8 * <span
class="keyword">sizeof</span>(uint8_t));</div>
-<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">
126</span> </div>
-<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">
127</span> <span class="keywordflow">if</span>
(listHeader[hll_constants::PREAMBLE_INTS_BYTE] != hll_constants::LIST_PREINTS)
{</div>
-<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">
128</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Incorrect number of
preInts in input stream"</span>);</div>
-<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">
129</span> }</div>
-<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">
130</span> <span class="keywordflow">if</span>
(listHeader[hll_constants::SER_VER_BYTE] != hll_constants::SER_VER) {</div>
-<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">
131</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Wrong ser ver in input
stream"</span>);</div>
-<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">
132</span> }</div>
-<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">
133</span> <span class="keywordflow">if</span>
(listHeader[hll_constants::FAMILY_BYTE] != hll_constants::FAMILY_ID) {</div>
-<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">
134</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Input stream is not an
HLL sketch"</span>);</div>
-<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">
135</span> }</div>
-<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">
136</span> </div>
-<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">
137</span> hll_mode mode =
HllSketchImpl<A>::extractCurMode(listHeader[hll_constants::MODE_BYTE]);</div>
-<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">
138</span> <span class="keywordflow">if</span> (mode != LIST) {</div>
-<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">
139</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Calling list
constructor with non-list mode data"</span>);</div>
-<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">
140</span> }</div>
-<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">
141</span> </div>
-<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">
142</span> <span class="keyword">const</span> <a class="code hl_enumeration"
href="namespacedatasketches.html#a76c1ad9235877691984d49415bb263e4">target_hll_type</a>
tgtHllType =
HllSketchImpl<A>::extractTgtHllType(listHeader[hll_constants::MODE_BYTE]);</div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">
102</span> <span class="comment">// Reject LIST counts at or above the fixed
LIST capacity.</span></div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">
103</span> <span class="keyword">const</span> uint32_t listCapacity = 1u
<< hll_constants::LG_INIT_LIST_SIZE;</div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">
104</span> <span class="keywordflow">if</span> (couponCount >=
listCapacity) {</div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">
105</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Attempt to deserialize
invalid CouponList with couponCount >= capacity. Found couponCount:
"</span></div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">
106</span> + std::to_string(couponCount)</div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">
107</span> + <span class="stringliteral">",
capacity: "</span> + std::to_string(listCapacity));</div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">
108</span> }</div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">
109</span> <span class="keyword">const</span> uint32_t couponsInArray =
(compact ? couponCount : (1 << HllUtil<A>::computeLgArrInts(LIST,
couponCount, lgK)));</div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">
110</span> <span class="keyword">const</span> <span
class="keywordtype">size_t</span> expectedLength =
hll_constants::LIST_INT_ARR_START + (couponsInArray * <span
class="keyword">sizeof</span>(uint32_t));</div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">
111</span> <span class="keywordflow">if</span> (len < expectedLength)
{</div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">
112</span> <span class="keywordflow">throw</span> std::out_of_range(<span
class="stringliteral">"Byte array too short for sketch. Expected
"</span> + std::to_string(expectedLength)</div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">
113</span> + <span class="stringliteral">",
found: "</span> + std::to_string(len));</div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">
114</span> }</div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">
115</span> </div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">
116</span> ClAlloc cla(allocator);</div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">
117</span> CouponList<A>* sketch = <span class="keyword">new</span>
(cla.allocate(1)) CouponList<A>(lgK, tgtHllType, mode, allocator);</div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">
118</span> sketch->couponCount_ = couponCount;</div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">
119</span> sketch->putOutOfOrderFlag(oooFlag); <span class="comment">//
should always be false for LIST</span></div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">
120</span> </div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">
121</span> <span class="keywordflow">if</span> (!emptyFlag) {</div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">
122</span> <span class="comment">// only need to read valid coupons, unlike
in stream case</span></div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">
123</span> std::memcpy(sketch->coupons_.data(), data +
hll_constants::LIST_INT_ARR_START, couponCount * <span
class="keyword">sizeof</span>(uint32_t));</div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">
124</span> }</div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">
125</span> </div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">
126</span> <span class="keywordflow">return</span> sketch;</div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">
127</span>}</div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">
128</span> </div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">
129</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">
130</span>CouponList<A>* CouponList<A>::newList(std::istream&
is, <span class="keyword">const</span> A& allocator) {</div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">
131</span> uint8_t listHeader[8];</div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">
132</span> read(is, listHeader, 8 * <span
class="keyword">sizeof</span>(uint8_t));</div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">
133</span> </div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">
134</span> <span class="keywordflow">if</span>
(listHeader[hll_constants::PREAMBLE_INTS_BYTE] != hll_constants::LIST_PREINTS)
{</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">
135</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Incorrect number of
preInts in input stream"</span>);</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">
136</span> }</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">
137</span> <span class="keywordflow">if</span>
(listHeader[hll_constants::SER_VER_BYTE] != hll_constants::SER_VER) {</div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">
138</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Wrong ser ver in input
stream"</span>);</div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">
139</span> }</div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">
140</span> <span class="keywordflow">if</span>
(listHeader[hll_constants::FAMILY_BYTE] != hll_constants::FAMILY_ID) {</div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">
141</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Input stream is not an
HLL sketch"</span>);</div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">
142</span> }</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">
143</span> </div>
-<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">
144</span> <span class="keyword">const</span> uint8_t lgK =
listHeader[hll_constants::LG_K_BYTE];</div>
-<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">
145</span> <span class="keyword">const</span> <span
class="keywordtype">bool</span> compact =
((listHeader[hll_constants::FLAGS_BYTE] & hll_constants::COMPACT_FLAG_MASK)
? <span class="keyword">true</span> : false);</div>
-<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">
146</span> <span class="keyword">const</span> <span
class="keywordtype">bool</span> oooFlag =
((listHeader[hll_constants::FLAGS_BYTE] &
hll_constants::OUT_OF_ORDER_FLAG_MASK) ? <span class="keyword">true</span> :
false);</div>
-<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">
147</span> <span class="keyword">const</span> <span
class="keywordtype">bool</span> emptyFlag =
((listHeader[hll_constants::FLAGS_BYTE] & hll_constants::EMPTY_FLAG_MASK) ?
<span class="keyword">true</span> : false);</div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">
144</span> hll_mode mode =
HllSketchImpl<A>::extractCurMode(listHeader[hll_constants::MODE_BYTE]);</div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">
145</span> <span class="keywordflow">if</span> (mode != LIST) {</div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">
146</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Calling list
constructor with non-list mode data"</span>);</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">
147</span> }</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">
148</span> </div>
-<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">
149</span> ClAlloc cla(allocator);</div>
-<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">
150</span> CouponList<A>* sketch = <span class="keyword">new</span>
(cla.allocate(1)) CouponList<A>(lgK, tgtHllType, mode, allocator);</div>
-<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">
151</span> <span class="keyword">using </span>coupon_list_ptr =
std::unique_ptr<CouponList<A>,
std::function<void(HllSketchImpl<A>*)>>;</div>
-<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">
152</span> coupon_list_ptr ptr(sketch, sketch->get_deleter());</div>
-<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">
153</span> <span class="keyword">const</span> uint32_t couponCount =
listHeader[hll_constants::LIST_COUNT_BYTE];</div>
-<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">
154</span> sketch->couponCount_ = couponCount;</div>
-<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">
155</span> sketch->putOutOfOrderFlag(oooFlag); <span class="comment">//
should always be false for LIST</span></div>
-<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">
156</span> </div>
-<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">
157</span> <span class="keywordflow">if</span> (!emptyFlag) {</div>
-<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">
158</span> <span class="comment">// For stream processing, need to read
entire number written to stream so read</span></div>
-<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">
159</span> <span class="comment">// pointer ends up set
correctly.</span></div>
-<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">
160</span> <span class="comment">// If not compact, still need to read empty
items even though in order.</span></div>
-<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">
161</span> <span class="keyword">const</span> uint32_t numToRead = (compact
? couponCount : <span class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(sketch->coupons_.size()));</div>
-<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">
162</span> read(is, sketch->coupons_.data(), numToRead * <span
class="keyword">sizeof</span>(uint32_t));</div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">
149</span> <span class="keyword">const</span> <a class="code hl_enumeration"
href="namespacedatasketches.html#a76c1ad9235877691984d49415bb263e4">target_hll_type</a>
tgtHllType =
HllSketchImpl<A>::extractTgtHllType(listHeader[hll_constants::MODE_BYTE]);</div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">
150</span> </div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">
151</span> <span class="keyword">const</span> uint8_t lgK =
listHeader[hll_constants::LG_K_BYTE];</div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">
152</span> <span class="keyword">const</span> <span
class="keywordtype">bool</span> compact =
((listHeader[hll_constants::FLAGS_BYTE] & hll_constants::COMPACT_FLAG_MASK)
? <span class="keyword">true</span> : false);</div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">
153</span> <span class="keyword">const</span> <span
class="keywordtype">bool</span> oooFlag =
((listHeader[hll_constants::FLAGS_BYTE] &
hll_constants::OUT_OF_ORDER_FLAG_MASK) ? <span class="keyword">true</span> :
false);</div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">
154</span> <span class="keyword">const</span> <span
class="keywordtype">bool</span> emptyFlag =
((listHeader[hll_constants::FLAGS_BYTE] & hll_constants::EMPTY_FLAG_MASK) ?
<span class="keyword">true</span> : false);</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">
155</span> </div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">
156</span> <span class="keyword">const</span> uint32_t couponCount =
listHeader[hll_constants::LIST_COUNT_BYTE];</div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">
157</span> <span class="comment">// Reject LIST counts at or above the fixed
LIST capacity.</span></div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">
158</span> <span class="keyword">const</span> uint32_t listCapacity = 1u
<< hll_constants::LG_INIT_LIST_SIZE;</div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">
159</span> <span class="keywordflow">if</span> (couponCount >=
listCapacity) {</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">
160</span> <span class="keywordflow">throw</span>
std::invalid_argument(<span class="stringliteral">"Attempt to deserialize
invalid CouponList with couponCount >= capacity. Found couponCount:
"</span></div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">
161</span> + std::to_string(couponCount)</div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">
162</span> + <span class="stringliteral">",
capacity: "</span> + std::to_string(listCapacity));</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">
163</span> }</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">
164</span> </div>
-<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">
165</span> <span class="keywordflow">if</span> (!is.good()) { <span
class="keywordflow">throw</span> std::runtime_error(<span
class="stringliteral">"error reading from std::istream"</span>); }
</div>
-<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">
166</span> </div>
-<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">
167</span> <span class="keywordflow">return</span> ptr.release();</div>
-<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">
168</span>}</div>
-<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">
169</span> </div>
-<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">
170</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">
171</span><span class="keyword">auto</span>
CouponList<A>::serialize(<span class="keywordtype">bool</span> compact,
<span class="keywordtype">unsigned</span> header_size_bytes) <span
class="keyword">const</span> -> vector_bytes {</div>
-<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">
172</span> <span class="keyword">const</span> <span
class="keywordtype">size_t</span> sketchSizeBytes = (compact ?
getCompactSerializationBytes() : getUpdatableSerializationBytes()) +
header_size_bytes;</div>
-<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">
173</span> vector_bytes byteArr(sketchSizeBytes, 0, getAllocator());</div>
-<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">
174</span> uint8_t* bytes = byteArr.data() + header_size_bytes;</div>
-<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">
175</span> </div>
-<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">
176</span> bytes[hll_constants::PREAMBLE_INTS_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(getPreInts());</div>
-<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">
177</span> bytes[hll_constants::SER_VER_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(hll_constants::SER_VER);</div>
-<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">
178</span> bytes[hll_constants::FAMILY_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(hll_constants::FAMILY_ID);</div>
-<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">
179</span> bytes[hll_constants::LG_K_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(this->lgConfigK_);</div>
-<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">
180</span> bytes[hll_constants::LG_ARR_BYTE] =
count_trailing_zeros_in_u32(<span
class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(coupons_.size()));</div>
-<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">
181</span> bytes[hll_constants::FLAGS_BYTE] =
this->makeFlagsByte(compact);</div>
-<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">
182</span> bytes[hll_constants::LIST_COUNT_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(this->mode_ == LIST ? couponCount_ : 0);</div>
-<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">
183</span> bytes[hll_constants::MODE_BYTE] = this->makeModeByte();</div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">
165</span> ClAlloc cla(allocator);</div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">
166</span> CouponList<A>* sketch = <span class="keyword">new</span>
(cla.allocate(1)) CouponList<A>(lgK, tgtHllType, mode, allocator);</div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">
167</span> <span class="keyword">using </span>coupon_list_ptr =
std::unique_ptr<CouponList<A>,
std::function<void(HllSketchImpl<A>*)>>;</div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">
168</span> coupon_list_ptr ptr(sketch, sketch->get_deleter());</div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">
169</span> sketch->couponCount_ = couponCount;</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">
170</span> sketch->putOutOfOrderFlag(oooFlag); <span class="comment">//
should always be false for LIST</span></div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">
171</span> </div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">
172</span> <span class="keywordflow">if</span> (!emptyFlag) {</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">
173</span> <span class="comment">// For stream processing, need to read
entire number written to stream so read</span></div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">
174</span> <span class="comment">// pointer ends up set
correctly.</span></div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">
175</span> <span class="comment">// If not compact, still need to read empty
items even though in order.</span></div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">
176</span> <span class="keyword">const</span> uint32_t numToRead = (compact
? couponCount : <span class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(sketch->coupons_.size()));</div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">
177</span> read(is, sketch->coupons_.data(), numToRead * <span
class="keyword">sizeof</span>(uint32_t));</div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">
178</span> }</div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">
179</span> </div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">
180</span> <span class="keywordflow">if</span> (!is.good()) { <span
class="keywordflow">throw</span> std::runtime_error(<span
class="stringliteral">"error reading from std::istream"</span>); }
</div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">
181</span> </div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">
182</span> <span class="keywordflow">return</span> ptr.release();</div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">
183</span>}</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">
184</span> </div>
-<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">
185</span> <span class="keywordflow">if</span> (this->mode_ == SET) {</div>
-<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">
186</span> std::memcpy(bytes + hll_constants::HASH_SET_COUNT_INT,
&couponCount_, <span class="keyword">sizeof</span>(couponCount_));</div>
-<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">
187</span> }</div>
-<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">
188</span> </div>
-<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">
189</span> <span class="comment">// coupons</span></div>
-<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">
190</span> <span class="comment">// isCompact() is always false for
now</span></div>
-<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">
191</span> <span class="keyword">const</span> <span
class="keywordtype">int</span> sw = (isCompact() ? 2 : 0) | (compact ? 1 :
0);</div>
-<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">
192</span> <span class="keywordflow">switch</span> (sw) {</div>
-<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">
193</span> <span class="keywordflow">case</span> 0: { <span
class="comment">// src updatable, dst updatable</span></div>
-<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">
194</span> std::memcpy(bytes + getMemDataStart(), coupons_.data(),
coupons_.size() * <span class="keyword">sizeof</span>(uint32_t));</div>
-<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">
195</span> <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">
196</span> }</div>
-<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">
197</span> <span class="keywordflow">case</span> 1: { <span
class="comment">// src updatable, dst compact</span></div>
-<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">
198</span> bytes += getMemDataStart(); <span class="comment">// reusing
pointer for incremental writes</span></div>
-<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">
199</span> <span class="keywordflow">for</span> (<span
class="keyword">const</span> uint32_t coupon: *this) {</div>
-<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">
200</span> std::memcpy(bytes, &coupon, <span
class="keyword">sizeof</span>(coupon));</div>
-<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">
201</span> bytes += <span class="keyword">sizeof</span>(coupon);</div>
-<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">
202</span> }</div>
-<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">
203</span> <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">
204</span> }</div>
-<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">
205</span> </div>
-<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">
206</span> <span class="keywordflow">default</span>:</div>
-<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">
207</span> <span class="keywordflow">throw</span> std::runtime_error(<span
class="stringliteral">"Impossible condition when
serializing"</span>);</div>
-<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">
208</span> }</div>
-<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">
209</span> </div>
-<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">
210</span> <span class="keywordflow">return</span> byteArr;</div>
-<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">
211</span>}</div>
-<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">
212</span> </div>
-<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">
213</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">
214</span><span class="keywordtype">void</span>
CouponList<A>::serialize(std::ostream& os, <span
class="keyword">const</span> <span class="keywordtype">bool</span>
compact)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">
215</span> <span class="comment">// header</span></div>
-<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">
216</span> <span class="keyword">const</span> uint8_t preInts =
getPreInts();</div>
-<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">
217</span> write(os, preInts);</div>
-<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">
218</span> <span class="keyword">const</span> uint8_t
serialVersion(hll_constants::SER_VER);</div>
-<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">
219</span> write(os, serialVersion);</div>
-<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">
220</span> <span class="keyword">const</span> uint8_t
familyId(hll_constants::FAMILY_ID);</div>
-<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">
221</span> write(os, familyId);</div>
-<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">
222</span> <span class="keyword">const</span> uint8_t lgKByte =
this->lgConfigK_;</div>
-<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">
223</span> write(os, lgKByte);</div>
-<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">
224</span> <span class="keyword">const</span> uint8_t lgArrIntsByte =
count_trailing_zeros_in_u32(<span
class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(coupons_.size()));</div>
-<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">
225</span> write(os, lgArrIntsByte);</div>
-<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">
226</span> <span class="keyword">const</span> uint8_t flagsByte =
this->makeFlagsByte(compact);</div>
-<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">
227</span> write(os, flagsByte);</div>
-<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">
228</span> </div>
-<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">
229</span> <span class="keywordflow">if</span> (this->mode_ == LIST) {</div>
-<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">
230</span> <span class="keyword">const</span> uint8_t listCount = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(couponCount_);</div>
-<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">
231</span> write(os, listCount);</div>
-<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">
232</span> } <span class="keywordflow">else</span> { <span class="comment">//
mode == SET</span></div>
-<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">
233</span> <span class="keyword">const</span> uint8_t unused = 0;</div>
-<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">
234</span> write(os, unused);</div>
-<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">
235</span> }</div>
-<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">
236</span> </div>
-<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">
237</span> <span class="keyword">const</span> uint8_t modeByte =
this->makeModeByte();</div>
-<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">
238</span> write(os, modeByte);</div>
-<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">
239</span> </div>
-<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">
240</span> <span class="keywordflow">if</span> (this->mode_ == SET) {</div>
-<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">
241</span> <span class="comment">// writing as int, already stored as
int</span></div>
-<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">
242</span> write(os, couponCount_);</div>
-<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">
243</span> }</div>
-<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">
244</span> </div>
-<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">
245</span> <span class="comment">// coupons</span></div>
-<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">
246</span> <span class="comment">// isCompact() is always false for
now</span></div>
-<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">
247</span> <span class="keyword">const</span> <span
class="keywordtype">int</span> sw = (isCompact() ? 2 : 0) | (compact ? 1 :
0);</div>
-<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">
248</span> <span class="keywordflow">switch</span> (sw) {</div>
-<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">
249</span> <span class="keywordflow">case</span> 0: { <span
class="comment">// src updatable, dst updatable</span></div>
-<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">
250</span> write(os, coupons_.data(), coupons_.size() * <span
class="keyword">sizeof</span>(uint32_t));</div>
-<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">
251</span> <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">
252</span> }</div>
-<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">
253</span> <span class="keywordflow">case</span> 1: { <span
class="comment">// src updatable, dst compact</span></div>
-<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">
254</span> <span class="keywordflow">for</span> (<span
class="keyword">const</span> uint32_t coupon: *this) {</div>
-<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">
255</span> write(os, coupon);</div>
-<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">
256</span> }</div>
-<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">
257</span> <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">
258</span> }</div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">
185</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">
186</span><span class="keyword">auto</span>
CouponList<A>::serialize(<span class="keywordtype">bool</span> compact,
<span class="keywordtype">unsigned</span> header_size_bytes) <span
class="keyword">const</span> -> vector_bytes {</div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">
187</span> <span class="keyword">const</span> <span
class="keywordtype">size_t</span> sketchSizeBytes = (compact ?
getCompactSerializationBytes() : getUpdatableSerializationBytes()) +
header_size_bytes;</div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">
188</span> vector_bytes byteArr(sketchSizeBytes, 0, getAllocator());</div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">
189</span> uint8_t* bytes = byteArr.data() + header_size_bytes;</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">
190</span> </div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">
191</span> bytes[hll_constants::PREAMBLE_INTS_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(getPreInts());</div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">
192</span> bytes[hll_constants::SER_VER_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(hll_constants::SER_VER);</div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">
193</span> bytes[hll_constants::FAMILY_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(hll_constants::FAMILY_ID);</div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">
194</span> bytes[hll_constants::LG_K_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(this->lgConfigK_);</div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">
195</span> bytes[hll_constants::LG_ARR_BYTE] =
count_trailing_zeros_in_u32(<span
class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(coupons_.size()));</div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">
196</span> bytes[hll_constants::FLAGS_BYTE] =
this->makeFlagsByte(compact);</div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">
197</span> bytes[hll_constants::LIST_COUNT_BYTE] = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(this->mode_ == LIST ? couponCount_ : 0);</div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">
198</span> bytes[hll_constants::MODE_BYTE] = this->makeModeByte();</div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">
199</span> </div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">
200</span> <span class="keywordflow">if</span> (this->mode_ == SET) {</div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">
201</span> std::memcpy(bytes + hll_constants::HASH_SET_COUNT_INT,
&couponCount_, <span class="keyword">sizeof</span>(couponCount_));</div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">
202</span> }</div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">
203</span> </div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">
204</span> <span class="comment">// coupons</span></div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">
205</span> <span class="comment">// isCompact() is always false for
now</span></div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">
206</span> <span class="keyword">const</span> <span
class="keywordtype">int</span> sw = (isCompact() ? 2 : 0) | (compact ? 1 :
0);</div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">
207</span> <span class="keywordflow">switch</span> (sw) {</div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">
208</span> <span class="keywordflow">case</span> 0: { <span
class="comment">// src updatable, dst updatable</span></div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">
209</span> std::memcpy(bytes + getMemDataStart(), coupons_.data(),
coupons_.size() * <span class="keyword">sizeof</span>(uint32_t));</div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">
210</span> <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">
211</span> }</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">
212</span> <span class="keywordflow">case</span> 1: { <span
class="comment">// src updatable, dst compact</span></div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">
213</span> bytes += getMemDataStart(); <span class="comment">// reusing
pointer for incremental writes</span></div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">
214</span> <span class="keywordflow">for</span> (<span
class="keyword">const</span> uint32_t coupon: *this) {</div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">
215</span> std::memcpy(bytes, &coupon, <span
class="keyword">sizeof</span>(coupon));</div>
+<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">
216</span> bytes += <span class="keyword">sizeof</span>(coupon);</div>
+<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">
217</span> }</div>
+<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">
218</span> <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">
219</span> }</div>
+<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">
220</span> </div>
+<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">
221</span> <span class="keywordflow">default</span>:</div>
+<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">
222</span> <span class="keywordflow">throw</span> std::runtime_error(<span
class="stringliteral">"Impossible condition when
serializing"</span>);</div>
+<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">
223</span> }</div>
+<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">
224</span> </div>
+<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">
225</span> <span class="keywordflow">return</span> byteArr;</div>
+<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">
226</span>}</div>
+<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">
227</span> </div>
+<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">
228</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">
229</span><span class="keywordtype">void</span>
CouponList<A>::serialize(std::ostream& os, <span
class="keyword">const</span> <span class="keywordtype">bool</span>
compact)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">
230</span> <span class="comment">// header</span></div>
+<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">
231</span> <span class="keyword">const</span> uint8_t preInts =
getPreInts();</div>
+<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">
232</span> write(os, preInts);</div>
+<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">
233</span> <span class="keyword">const</span> uint8_t
serialVersion(hll_constants::SER_VER);</div>
+<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">
234</span> write(os, serialVersion);</div>
+<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">
235</span> <span class="keyword">const</span> uint8_t
familyId(hll_constants::FAMILY_ID);</div>
+<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">
236</span> write(os, familyId);</div>
+<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">
237</span> <span class="keyword">const</span> uint8_t lgKByte =
this->lgConfigK_;</div>
+<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">
238</span> write(os, lgKByte);</div>
+<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">
239</span> <span class="keyword">const</span> uint8_t lgArrIntsByte =
count_trailing_zeros_in_u32(<span
class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(coupons_.size()));</div>
+<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">
240</span> write(os, lgArrIntsByte);</div>
+<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">
241</span> <span class="keyword">const</span> uint8_t flagsByte =
this->makeFlagsByte(compact);</div>
+<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">
242</span> write(os, flagsByte);</div>
+<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">
243</span> </div>
+<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">
244</span> <span class="keywordflow">if</span> (this->mode_ == LIST) {</div>
+<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">
245</span> <span class="keyword">const</span> uint8_t listCount = <span
class="keyword">static_cast<</span>uint8_t<span
class="keyword">></span>(couponCount_);</div>
+<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">
246</span> write(os, listCount);</div>
+<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">
247</span> } <span class="keywordflow">else</span> { <span class="comment">//
mode == SET</span></div>
+<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">
248</span> <span class="keyword">const</span> uint8_t unused = 0;</div>
+<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">
249</span> write(os, unused);</div>
+<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">
250</span> }</div>
+<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">
251</span> </div>
+<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">
252</span> <span class="keyword">const</span> uint8_t modeByte =
this->makeModeByte();</div>
+<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">
253</span> write(os, modeByte);</div>
+<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">
254</span> </div>
+<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">
255</span> <span class="keywordflow">if</span> (this->mode_ == SET) {</div>
+<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">
256</span> <span class="comment">// writing as int, already stored as
int</span></div>
+<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">
257</span> write(os, couponCount_);</div>
+<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">
258</span> }</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">
259</span> </div>
-<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">
260</span> <span class="keywordflow">default</span>:</div>
-<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">
261</span> <span class="keywordflow">throw</span> std::runtime_error(<span
class="stringliteral">"Impossible condition when
serializing"</span>);</div>
-<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">
262</span> }</div>
-<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">
263</span> </div>
-<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">
264</span> <span class="keywordflow">return</span>;</div>
-<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">
265</span>}</div>
-<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">
266</span> </div>
-<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">
267</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">
268</span>HllSketchImpl<A>* CouponList<A>::couponUpdate(uint32_t
coupon) {</div>
-<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">
269</span> <span class="keywordflow">for</span> (<span
class="keywordtype">size_t</span> i = 0; i < coupons_.size(); ++i) { <span
class="comment">// search for empty slot</span></div>
-<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">
270</span> <span class="keyword">const</span> uint32_t couponAtIdx =
coupons_[i];</div>
-<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">
271</span> <span class="keywordflow">if</span> (couponAtIdx ==
hll_constants::EMPTY) {</div>
-<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">
272</span> coupons_[i] = coupon; <span class="comment">// the actual
update</span></div>
-<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">
273</span> ++couponCount_;</div>
-<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">
274</span> <span class="keywordflow">if</span> (couponCount_ == <span
class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(coupons_.size())) { <span class="comment">// array
full</span></div>
-<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">
275</span> <span class="keywordflow">if</span> (this->lgConfigK_ <
8) {</div>
-<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">
276</span> <span class="keywordflow">return</span>
promoteHeapListOrSetToHll(*<span class="keyword">this</span>);</div>
-<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">
277</span> }</div>
-<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">
278</span> <span class="keywordflow">return</span>
promoteHeapListToSet(*<span class="keyword">this</span>);</div>
-<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">
279</span> }</div>
-<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">
280</span> <span class="keywordflow">return</span> <span
class="keyword">this</span>;</div>
-<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">
281</span> }</div>
-<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">
282</span> <span class="comment">// cell not empty</span></div>
-<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">
283</span> <span class="keywordflow">if</span> (couponAtIdx == coupon)
{</div>
-<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">
284</span> <span class="keywordflow">return</span> <span
class="keyword">this</span>; <span class="comment">// duplicate</span></div>
-<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">
285</span> }</div>
-<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">
286</span> <span class="comment">// cell not empty and not a duplicate,
continue</span></div>
-<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">
287</span> }</div>
-<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">
288</span> <span class="keywordflow">throw</span> std::runtime_error(<span
class="stringliteral">"Array invalid: no empties and no
duplicates"</span>);</div>
-<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">
289</span>}</div>
-<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">
290</span> </div>
-<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">
291</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">
292</span><span class="keywordtype">double</span>
CouponList<A>::getCompositeEstimate()<span class="keyword"> const
</span>{ <span class="keywordflow">return</span> getEstimate(); }</div>
-<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">
293</span> </div>
-<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">
294</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">
295</span><span class="keywordtype">double</span>
CouponList<A>::getEstimate()<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">
296</span> <span class="keyword">const</span> <span
class="keywordtype">double</span> est =
CubicInterpolation<A>::usingXAndYTables(couponCount_);</div>
-<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">
297</span> <span class="keywordflow">return</span> fmax(est,
couponCount_);</div>
-<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">
298</span>}</div>
-<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">
299</span> </div>
-<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">
300</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">
301</span><span class="keywordtype">double</span>
CouponList<A>::getLowerBound(uint8_t numStdDev)<span class="keyword">
const </span>{</div>
-<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">
302</span> HllUtil<A>::checkNumStdDev(numStdDev);</div>
-<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">
303</span> <span class="keyword">const</span> <span
class="keywordtype">double</span> est =
CubicInterpolation<A>::usingXAndYTables(couponCount_);</div>
-<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">
304</span> <span class="keyword">const</span> <span
class="keywordtype">double</span> tmp = est / (1.0 + (numStdDev *
hll_constants::COUPON_RSE));</div>
-<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">
305</span> <span class="keywordflow">return</span> fmax(tmp,
couponCount_);</div>
-<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">
306</span>}</div>
-<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">
307</span> </div>
-<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">
308</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">
309</span><span class="keywordtype">double</span>
CouponList<A>::getUpperBound(uint8_t numStdDev)<span class="keyword">
const </span>{</div>
-<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">
310</span> HllUtil<A>::checkNumStdDev(numStdDev);</div>
+<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">
260</span> <span class="comment">// coupons</span></div>
+<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">
261</span> <span class="comment">// isCompact() is always false for
now</span></div>
+<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">
262</span> <span class="keyword">const</span> <span
class="keywordtype">int</span> sw = (isCompact() ? 2 : 0) | (compact ? 1 :
0);</div>
+<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">
263</span> <span class="keywordflow">switch</span> (sw) {</div>
+<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">
264</span> <span class="keywordflow">case</span> 0: { <span
class="comment">// src updatable, dst updatable</span></div>
+<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">
265</span> write(os, coupons_.data(), coupons_.size() * <span
class="keyword">sizeof</span>(uint32_t));</div>
+<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">
266</span> <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">
267</span> }</div>
+<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">
268</span> <span class="keywordflow">case</span> 1: { <span
class="comment">// src updatable, dst compact</span></div>
+<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">
269</span> <span class="keywordflow">for</span> (<span
class="keyword">const</span> uint32_t coupon: *this) {</div>
+<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">
270</span> write(os, coupon);</div>
+<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">
271</span> }</div>
+<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">
272</span> <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">
273</span> }</div>
+<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">
274</span> </div>
+<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">
275</span> <span class="keywordflow">default</span>:</div>
+<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">
276</span> <span class="keywordflow">throw</span> std::runtime_error(<span
class="stringliteral">"Impossible condition when
serializing"</span>);</div>
+<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">
277</span> }</div>
+<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">
278</span> </div>
+<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">
279</span> <span class="keywordflow">return</span>;</div>
+<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">
280</span>}</div>
+<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">
281</span> </div>
+<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">
282</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">
283</span>HllSketchImpl<A>* CouponList<A>::couponUpdate(uint32_t
coupon) {</div>
+<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">
284</span> <span class="keywordflow">for</span> (<span
class="keywordtype">size_t</span> i = 0; i < coupons_.size(); ++i) { <span
class="comment">// search for empty slot</span></div>
+<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">
285</span> <span class="keyword">const</span> uint32_t couponAtIdx =
coupons_[i];</div>
+<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">
286</span> <span class="keywordflow">if</span> (couponAtIdx ==
hll_constants::EMPTY) {</div>
+<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">
287</span> coupons_[i] = coupon; <span class="comment">// the actual
update</span></div>
+<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">
288</span> ++couponCount_;</div>
+<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">
289</span> <span class="keywordflow">if</span> (couponCount_ == <span
class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(coupons_.size())) { <span class="comment">// array
full</span></div>
+<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">
290</span> <span class="keywordflow">if</span> (this->lgConfigK_ <
8) {</div>
+<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">
291</span> <span class="keywordflow">return</span>
promoteHeapListOrSetToHll(*<span class="keyword">this</span>);</div>
+<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">
292</span> }</div>
+<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">
293</span> <span class="keywordflow">return</span>
promoteHeapListToSet(*<span class="keyword">this</span>);</div>
+<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">
294</span> }</div>
+<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">
295</span> <span class="keywordflow">return</span> <span
class="keyword">this</span>;</div>
+<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">
296</span> }</div>
+<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">
297</span> <span class="comment">// cell not empty</span></div>
+<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">
298</span> <span class="keywordflow">if</span> (couponAtIdx == coupon)
{</div>
+<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">
299</span> <span class="keywordflow">return</span> <span
class="keyword">this</span>; <span class="comment">// duplicate</span></div>
+<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">
300</span> }</div>
+<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">
301</span> <span class="comment">// cell not empty and not a duplicate,
continue</span></div>
+<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">
302</span> }</div>
+<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">
303</span> <span class="keywordflow">throw</span> std::runtime_error(<span
class="stringliteral">"Array invalid: no empties and no
duplicates"</span>);</div>
+<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">
304</span>}</div>
+<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">
305</span> </div>
+<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">
306</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">
307</span><span class="keywordtype">double</span>
CouponList<A>::getCompositeEstimate()<span class="keyword"> const
</span>{ <span class="keywordflow">return</span> getEstimate(); }</div>
+<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">
308</span> </div>
+<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">
309</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">
310</span><span class="keywordtype">double</span>
CouponList<A>::getEstimate()<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">
311</span> <span class="keyword">const</span> <span
class="keywordtype">double</span> est =
CubicInterpolation<A>::usingXAndYTables(couponCount_);</div>
-<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">
312</span> <span class="keyword">const</span> <span
class="keywordtype">double</span> tmp = est / (1.0 - (numStdDev *
hll_constants::COUPON_RSE));</div>
-<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">
313</span> <span class="keywordflow">return</span> fmax(tmp,
couponCount_);</div>
-<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">
314</span>}</div>
-<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">
315</span> </div>
-<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">
316</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">
317</span><span class="keywordtype">bool</span>
CouponList<A>::isEmpty()<span class="keyword"> const </span>{ <span
class="keywordflow">return</span> getCouponCount() == 0; }</div>
-<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">
318</span> </div>
-<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">
319</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">
320</span>uint32_t CouponList<A>::getUpdatableSerializationBytes()<span
class="keyword"> const </span>{</div>
-<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">
321</span> <span class="keywordflow">return</span> getMemDataStart() + <span
class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(coupons_.size()) * <span
class="keyword">sizeof</span>(uint32_t);</div>
-<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">
322</span>}</div>
-<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">
323</span> </div>
-<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">
324</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">
325</span>uint32_t CouponList<A>::getCouponCount()<span class="keyword">
const </span>{</div>
-<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">
326</span> <span class="keywordflow">return</span> couponCount_;</div>
-<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">
327</span>}</div>
-<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">
328</span> </div>
-<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">
329</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">
330</span>uint32_t CouponList<A>::getCompactSerializationBytes()<span
class="keyword"> const </span>{</div>
-<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">
331</span> <span class="keywordflow">return</span> getMemDataStart() +
(couponCount_ << 2);</div>
-<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">
332</span>}</div>
+<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">
312</span> <span class="keywordflow">return</span> fmax(est,
couponCount_);</div>
+<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">
313</span>}</div>
+<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">
314</span> </div>
+<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">
315</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">
316</span><span class="keywordtype">double</span>
CouponList<A>::getLowerBound(uint8_t numStdDev)<span class="keyword">
const </span>{</div>
+<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">
317</span> HllUtil<A>::checkNumStdDev(numStdDev);</div>
+<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">
318</span> <span class="keyword">const</span> <span
class="keywordtype">double</span> est =
CubicInterpolation<A>::usingXAndYTables(couponCount_);</div>
+<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">
319</span> <span class="keyword">const</span> <span
class="keywordtype">double</span> tmp = est / (1.0 + (numStdDev *
hll_constants::COUPON_RSE));</div>
+<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">
320</span> <span class="keywordflow">return</span> fmax(tmp,
couponCount_);</div>
+<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">
321</span>}</div>
+<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">
322</span> </div>
+<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">
323</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">
324</span><span class="keywordtype">double</span>
CouponList<A>::getUpperBound(uint8_t numStdDev)<span class="keyword">
const </span>{</div>
+<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">
325</span> HllUtil<A>::checkNumStdDev(numStdDev);</div>
+<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">
326</span> <span class="keyword">const</span> <span
class="keywordtype">double</span> est =
CubicInterpolation<A>::usingXAndYTables(couponCount_);</div>
+<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">
327</span> <span class="keyword">const</span> <span
class="keywordtype">double</span> tmp = est / (1.0 - (numStdDev *
hll_constants::COUPON_RSE));</div>
+<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">
328</span> <span class="keywordflow">return</span> fmax(tmp,
couponCount_);</div>
+<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">
329</span>}</div>
+<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">
330</span> </div>
+<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">
331</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">
332</span><span class="keywordtype">bool</span>
CouponList<A>::isEmpty()<span class="keyword"> const </span>{ <span
class="keywordflow">return</span> getCouponCount() == 0; }</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">
333</span> </div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">
334</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">
335</span>uint32_t CouponList<A>::getMemDataStart()<span class="keyword">
const </span>{</div>
-<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">
336</span> <span class="keywordflow">return</span>
hll_constants::LIST_INT_ARR_START;</div>
+<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">
335</span>uint32_t CouponList<A>::getUpdatableSerializationBytes()<span
class="keyword"> const </span>{</div>
+<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">
336</span> <span class="keywordflow">return</span> getMemDataStart() + <span
class="keyword">static_cast<</span>uint32_t<span
class="keyword">></span>(coupons_.size()) * <span
class="keyword">sizeof</span>(uint32_t);</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">
337</span>}</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">
338</span> </div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">
339</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">
340</span>uint8_t CouponList<A>::getPreInts()<span class="keyword"> const
</span>{</div>
-<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">
341</span> <span class="keywordflow">return</span>
hll_constants::LIST_PREINTS;</div>
+<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">
340</span>uint32_t CouponList<A>::getCouponCount()<span class="keyword">
const </span>{</div>
+<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">
341</span> <span class="keywordflow">return</span> couponCount_;</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">
342</span>}</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">
343</span> </div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">
344</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">
345</span><span class="keywordtype">bool</span>
CouponList<A>::isCompact()<span class="keyword"> const </span>{ <span
class="keywordflow">return</span> <span class="keyword">false</span>; }</div>
-<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">
346</span> </div>
-<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">
347</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">
348</span><span class="keywordtype">bool</span>
CouponList<A>::isOutOfOrderFlag()<span class="keyword"> const </span>{
<span class="keywordflow">return</span> oooFlag_; }</div>
-<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">
349</span> </div>
-<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">
350</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">
351</span><span class="keywordtype">void</span>
CouponList<A>::putOutOfOrderFlag(<span class="keywordtype">bool</span>
oooFlag) {</div>
-<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">
352</span> oooFlag_ = oooFlag;</div>
-<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">
353</span>}</div>
-<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">
354</span> </div>
-<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">
355</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">
356</span>A CouponList<A>::getAllocator()<span class="keyword"> const
</span>{</div>
-<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">
357</span> <span class="keywordflow">return</span>
coupons_.get_allocator();</div>
-<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">
358</span>}</div>
-<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">
359</span> </div>
-<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">
360</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">
361</span>HllSketchImpl<A>*
CouponList<A>::promoteHeapListToSet(CouponList& list) {</div>
-<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">
362</span> <span class="keywordflow">return</span>
HllSketchImplFactory<A>::promoteListToSet(list);</div>
-<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">
363</span>}</div>
+<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">
345</span>uint32_t CouponList<A>::getCompactSerializationBytes()<span
class="keyword"> const </span>{</div>
+<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">
346</span> <span class="keywordflow">return</span> getMemDataStart() +
(couponCount_ << 2);</div>
+<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">
347</span>}</div>
+<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">
348</span> </div>
+<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">
349</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">
350</span>uint32_t CouponList<A>::getMemDataStart()<span class="keyword">
const </span>{</div>
+<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">
351</span> <span class="keywordflow">return</span>
hll_constants::LIST_INT_ARR_START;</div>
+<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">
352</span>}</div>
+<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">
353</span> </div>
+<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">
354</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">
355</span>uint8_t CouponList<A>::getPreInts()<span class="keyword"> const
</span>{</div>
+<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">
356</span> <span class="keywordflow">return</span>
hll_constants::LIST_PREINTS;</div>
+<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">
357</span>}</div>
+<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">
358</span> </div>
+<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">
359</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">
360</span><span class="keywordtype">bool</span>
CouponList<A>::isCompact()<span class="keyword"> const </span>{ <span
class="keywordflow">return</span> <span class="keyword">false</span>; }</div>
+<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">
361</span> </div>
+<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">
362</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">
363</span><span class="keywordtype">bool</span>
CouponList<A>::isOutOfOrderFlag()<span class="keyword"> const </span>{
<span class="keywordflow">return</span> oooFlag_; }</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">
364</span> </div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">
365</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">
366</span>HllSketchImpl<A>*
CouponList<A>::promoteHeapListOrSetToHll(CouponList& src) {</div>
-<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">
367</span> <span class="keywordflow">return</span>
HllSketchImplFactory<A>::promoteListOrSetToHll(src);</div>
+<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">
366</span><span class="keywordtype">void</span>
CouponList<A>::putOutOfOrderFlag(<span class="keywordtype">bool</span>
oooFlag) {</div>
+<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">
367</span> oooFlag_ = oooFlag;</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">
368</span>}</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">
369</span> </div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">
370</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">
371</span>coupon_iterator<A> CouponList<A>::begin(<span
class="keywordtype">bool</span> all)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">
372</span> <span class="keywordflow">return</span>
coupon_iterator<A>(coupons_.data(), coupons_.size(), 0, all);</div>
+<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">
371</span>A CouponList<A>::getAllocator()<span class="keyword"> const
</span>{</div>
+<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">
372</span> <span class="keywordflow">return</span>
coupons_.get_allocator();</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">
373</span>}</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">
374</span> </div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">
375</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
-<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">
376</span>coupon_iterator<A> CouponList<A>::end()<span
class="keyword"> const </span>{</div>
-<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">
377</span> <span class="keywordflow">return</span>
coupon_iterator<A>(coupons_.data(), coupons_.size(), coupons_.size(),
<span class="keyword">false</span>);</div>
+<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">
376</span>HllSketchImpl<A>*
CouponList<A>::promoteHeapListToSet(CouponList& list) {</div>
+<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">
377</span> <span class="keywordflow">return</span>
HllSketchImplFactory<A>::promoteListToSet(list);</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">
378</span>}</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">
379</span> </div>
-<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">
380</span>}</div>
-<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">
381</span> </div>
-<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">
382</span><span class="preprocessor">#endif </span><span class="comment">//
_COUPONLIST_INTERNAL_HPP_</span></div>
+<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">
380</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">
381</span>HllSketchImpl<A>*
CouponList<A>::promoteHeapListOrSetToHll(CouponList& src) {</div>
+<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">
382</span> <span class="keywordflow">return</span>
HllSketchImplFactory<A>::promoteListOrSetToHll(src);</div>
+<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">
383</span>}</div>
+<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">
384</span> </div>
+<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">
385</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">
386</span>coupon_iterator<A> CouponList<A>::begin(<span
class="keywordtype">bool</span> all)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">
387</span> <span class="keywordflow">return</span>
coupon_iterator<A>(coupons_.data(), coupons_.size(), 0, all);</div>
+<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">
388</span>}</div>
+<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">
389</span> </div>
+<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">
390</span><span class="keyword">template</span><<span
class="keyword">typename</span> A></div>
+<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">
391</span>coupon_iterator<A> CouponList<A>::end()<span
class="keyword"> const </span>{</div>
+<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">
392</span> <span class="keywordflow">return</span>
coupon_iterator<A>(coupons_.data(), coupons_.size(), coupons_.size(),
<span class="keyword">false</span>);</div>
+<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">
393</span>}</div>
+<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">
394</span> </div>
+<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">
395</span>}</div>
+<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">
396</span> </div>
+<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">
397</span><span class="preprocessor">#endif </span><span class="comment">//
_COUPONLIST_INTERNAL_HPP_</span></div>
<div class="ttc" id="anamespacedatasketches_html"><div class="ttname"><a
href="namespacedatasketches.html">datasketches</a></div><div
class="ttdoc">DataSketches namespace.</div><div class="ttdef"><b>Definition</b>
binomial_bounds.hpp:38</div></div>
<div class="ttc"
id="anamespacedatasketches_html_a76c1ad9235877691984d49415bb263e4"><div
class="ttname"><a
href="namespacedatasketches.html#a76c1ad9235877691984d49415bb263e4">datasketches::target_hll_type</a></div><div
class="ttdeci">target_hll_type</div><div class="ttdoc">Specifies the target
type of HLL sketch to be created.</div><div class="ttdef"><b>Definition</b>
hll.hpp:72</div></div>
</div><!-- fragment --></div><!-- contents -->
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]