Skip to content

Commit 8341802

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 7b79b60 commit 8341802

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
SN_TYPE_PAR_DECL class sharing_nodet;
@@ -130,10 +130,10 @@ SN_TYPE_PAR_DEF class sharing_nodet
130130

131131
#if SN_SHARE_KEYS == 1
132132
SN_ASSERT(d.k == nullptr);
133-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(
133+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(
134134
std::make_shared<keyT>(k), std::forward<valueU>(v));
135135
#else
136-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
136+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
137137
#endif
138138
}
139139

@@ -172,17 +172,17 @@ SN_TYPE_PAR_DEF class sharing_nodet
172172

173173
bool is_internal() const
174174
{
175-
return data.template is_derived<0>();
175+
return data.template is_derived<2>();
176176
}
177177

178178
bool is_container() const
179179
{
180-
return data.template is_derived<1>();
180+
return data.template is_derived<0>();
181181
}
182182

183183
bool is_leaf() const
184184
{
185-
return data.template is_derived<2>();
185+
return data.template is_derived<1>();
186186
}
187187

188188
bool is_defined_internal() const
@@ -204,21 +204,21 @@ SN_TYPE_PAR_DEF class sharing_nodet
204204
{
205205
SN_ASSERT(!empty());
206206

207-
return *data.template get_derived<0>();
207+
return *data.template get_derived<2>();
208208
}
209209

210210
const d_ct &read_container() const
211211
{
212212
SN_ASSERT(!empty());
213213

214-
return *data.template get_derived<1>();
214+
return *data.template get_derived<0>();
215215
}
216216

217217
const d_lt &read_leaf() const
218218
{
219219
SN_ASSERT(!empty());
220220

221-
return *data.template get_derived<2>();
221+
return *data.template get_derived<1>();
222222
}
223223

224224
// Accessors
@@ -393,7 +393,7 @@ SN_TYPE_PAR_DEF class sharing_nodet
393393
{
394394
SN_ASSERT(!data);
395395

396-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
396+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
397397
}
398398

399399
template <class valueU>
@@ -404,11 +404,11 @@ SN_TYPE_PAR_DEF class sharing_nodet
404404
if(data.use_count() > 1)
405405
{
406406
data =
407-
make_shared_3<2, SN_PTR_TYPE_ARGS>(get_key(), std::forward<valueU>(v));
407+
make_shared_3<1, SN_PTR_TYPE_ARGS>(get_key(), std::forward<valueU>(v));
408408
}
409409
else
410410
{
411-
data.template get_derived<2>()->v = std::forward<valueU>(v);
411+
data.template get_derived<1>()->v = std::forward<valueU>(v);
412412
}
413413

414414
SN_ASSERT(data.use_count() == 1);
@@ -420,10 +420,10 @@ SN_TYPE_PAR_DEF class sharing_nodet
420420

421421
if(data.use_count() > 1)
422422
{
423-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(read_leaf());
423+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(read_leaf());
424424
}
425425

426-
mutator(data.template get_derived<2>()->v);
426+
mutator(data.template get_derived<1>()->v);
427427

428428
SN_ASSERT(data.use_count() == 1);
429429
}
@@ -435,16 +435,16 @@ SN_TYPE_PAR_DEF class sharing_nodet
435435

436436
if(!data)
437437
{
438-
data = make_shared_3<0, SN_PTR_TYPE_ARGS>();
438+
data = make_shared_3<2, SN_PTR_TYPE_ARGS>();
439439
}
440440
else if(data.use_count() > 1)
441441
{
442-
data = make_shared_3<0, SN_PTR_TYPE_ARGS>(read_internal());
442+
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(read_internal());
443443
}
444444

445445
SN_ASSERT(data.use_count() == 1);
446446

447-
return *data.template get_derived<0>();
447+
return *data.template get_derived<2>();
448448
}
449449

450450
d_ct &write_container()
@@ -453,16 +453,16 @@ SN_TYPE_PAR_DEF class sharing_nodet
453453

454454
if(!data)
455455
{
456-
data = make_shared_3<1, SN_PTR_TYPE_ARGS>();
456+
data = make_shared_3<0, SN_PTR_TYPE_ARGS>();
457457
}
458458
else if(data.use_count() > 1)
459459
{
460-
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(read_container());
460+
data = make_shared_3<0, SN_PTR_TYPE_ARGS>(read_container());
461461
}
462462

463463
SN_ASSERT(data.use_count() == 1);
464464

465-
return *data.template get_derived<1>();
465+
return *data.template get_derived<0>();
466466
}
467467

468468
datat data;

0 commit comments

Comments
 (0)