Skip to content

Commit 4fd5b3d

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 1373561 commit 4fd5b3d

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
@@ -60,7 +60,7 @@ Author: Daniel Poetzl
6060
#define SN_TYPE_ARGS keyT, valueT, equalT
6161

6262
#define SN_PTR_TYPE_ARGS \
63-
d_internalt<SN_TYPE_ARGS>, d_containert<SN_TYPE_ARGS>, d_leaft<SN_TYPE_ARGS>
63+
d_containert<SN_TYPE_ARGS>, d_leaft<SN_TYPE_ARGS>, d_internalt<SN_TYPE_ARGS>
6464

6565
// Inner nodes (internal nodes or container nodes)
6666

@@ -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>
@@ -407,12 +407,12 @@ SN_TYPE_PAR_DEF class sharing_nodet
407407

408408
if(data.use_count() > 1)
409409
{
410-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(
410+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(
411411
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,17 +439,17 @@ 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
{
446446
data =
447-
make_shared_3<0, SN_PTR_TYPE_ARGS>(read_internal());
447+
make_shared_3<2, SN_PTR_TYPE_ARGS>(read_internal());
448448
}
449449

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

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

455455
d_ct &write_container()
@@ -458,17 +458,17 @@ SN_TYPE_PAR_DEF class sharing_nodet
458458

459459
if(!data)
460460
{
461-
data = make_shared_3<1, SN_PTR_TYPE_ARGS>();
461+
data = make_shared_3<0, SN_PTR_TYPE_ARGS>();
462462
}
463463
else if(data.use_count() > 1)
464464
{
465465
data =
466-
make_shared_3<1, SN_PTR_TYPE_ARGS>(read_container());
466+
make_shared_3<0, SN_PTR_TYPE_ARGS>(read_container());
467467
}
468468

469469
SN_ASSERT(data.use_count() == 1);
470470

471-
return *data.template get_derived<1>();
471+
return *data.template get_derived<0>();
472472
}
473473

474474
datat data;

0 commit comments

Comments
 (0)