Skip to content

Commit 6ac45f2

Browse files
committed
Reorder types in sharing_nodet to optimize for common case
When destructt::destruct() of a small shared n-way pointer is called, it first determines the type of its pointee. For example, if the parameter pack Ts... is instantiated to T1, T2, T3, then it first checks if the pointer points to T3, then to T2, etc. Thus, the least checks are performed if it is most likely that the pointer points to an object of type T3, then T2, etc.
1 parent 007221d commit 6ac45f2

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

src/util/sharing_node.h

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Author: Daniel Poetzl
5959
#define SN_TYPE_ARGS keyT, valueT, equalT
6060

6161
#define SN_PTR_TYPE_ARGS \
62-
d_internalt<SN_TYPE_ARGS>, d_containert<SN_TYPE_ARGS>, d_leaft<SN_TYPE_ARGS>
62+
d_containert<SN_TYPE_ARGS>, d_leaft<SN_TYPE_ARGS>, d_internalt<SN_TYPE_ARGS>
6363
// clang-format on
6464

6565
// Inner nodes (internal nodes or container nodes)
@@ -134,10 +134,10 @@ SN_TYPE_PAR_DEF class sharing_nodet
134134

135135
#if SN_SHARE_KEYS == 1
136136
SN_ASSERT(d.k == nullptr);
137-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(
137+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(
138138
std::make_shared<keyT>(k), std::forward<valueU>(v));
139139
#else
140-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
140+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
141141
#endif
142142
}
143143

@@ -176,17 +176,17 @@ SN_TYPE_PAR_DEF class sharing_nodet
176176

177177
bool is_internal() const
178178
{
179-
return data.template is_derived<0>();
179+
return data.template is_derived<2>();
180180
}
181181

182182
bool is_container() const
183183
{
184-
return data.template is_derived<1>();
184+
return data.template is_derived<0>();
185185
}
186186

187187
bool is_leaf() const
188188
{
189-
return data.template is_derived<2>();
189+
return data.template is_derived<1>();
190190
}
191191

192192
bool is_defined_internal() const
@@ -208,21 +208,21 @@ SN_TYPE_PAR_DEF class sharing_nodet
208208
{
209209
SN_ASSERT(!empty());
210210

211-
return *data.template get_derived<0>();
211+
return *data.template get_derived<2>();
212212
}
213213

214214
const d_ct &read_container() const
215215
{
216216
SN_ASSERT(!empty());
217217

218-
return *data.template get_derived<1>();
218+
return *data.template get_derived<0>();
219219
}
220220

221221
const d_lt &read_leaf() const
222222
{
223223
SN_ASSERT(!empty());
224224

225-
return *data.template get_derived<2>();
225+
return *data.template get_derived<1>();
226226
}
227227

228228
// Accessors
@@ -397,7 +397,7 @@ SN_TYPE_PAR_DEF class sharing_nodet
397397
{
398398
SN_ASSERT(!data);
399399

400-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
400+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
401401
}
402402

403403
template <class valueU>
@@ -408,11 +408,11 @@ SN_TYPE_PAR_DEF class sharing_nodet
408408
if(data.use_count() > 1)
409409
{
410410
data =
411-
make_shared_3<2, SN_PTR_TYPE_ARGS>(get_key(), std::forward<valueU>(v));
411+
make_shared_3<1, SN_PTR_TYPE_ARGS>(get_key(), std::forward<valueU>(v));
412412
}
413413
else
414414
{
415-
data.template get_derived<2>()->v = std::forward<valueU>(v);
415+
data.template get_derived<1>()->v = std::forward<valueU>(v);
416416
}
417417

418418
SN_ASSERT(data.use_count() == 1);
@@ -424,10 +424,10 @@ SN_TYPE_PAR_DEF class sharing_nodet
424424

425425
if(data.use_count() > 1)
426426
{
427-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(read_leaf());
427+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(read_leaf());
428428
}
429429

430-
mutator(data.template get_derived<2>()->v);
430+
mutator(data.template get_derived<1>()->v);
431431

432432
SN_ASSERT(data.use_count() == 1);
433433
}
@@ -439,16 +439,16 @@ SN_TYPE_PAR_DEF class sharing_nodet
439439

440440
if(!data)
441441
{
442-
data = make_shared_3<0, SN_PTR_TYPE_ARGS>();
442+
data = make_shared_3<2, SN_PTR_TYPE_ARGS>();
443443
}
444444
else if(data.use_count() > 1)
445445
{
446-
data = make_shared_3<0, SN_PTR_TYPE_ARGS>(read_internal());
446+
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(read_internal());
447447
}
448448

449449
SN_ASSERT(data.use_count() == 1);
450450

451-
return *data.template get_derived<0>();
451+
return *data.template get_derived<2>();
452452
}
453453

454454
d_ct &write_container()
@@ -457,16 +457,16 @@ SN_TYPE_PAR_DEF class sharing_nodet
457457

458458
if(!data)
459459
{
460-
data = make_shared_3<1, SN_PTR_TYPE_ARGS>();
460+
data = make_shared_3<0, SN_PTR_TYPE_ARGS>();
461461
}
462462
else if(data.use_count() > 1)
463463
{
464-
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(read_container());
464+
data = make_shared_3<0, SN_PTR_TYPE_ARGS>(read_container());
465465
}
466466

467467
SN_ASSERT(data.use_count() == 1);
468468

469-
return *data.template get_derived<1>();
469+
return *data.template get_derived<0>();
470470
}
471471

472472
datat data;

0 commit comments

Comments
 (0)