Skip to content

Commit dc1e454

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 aa4221e commit dc1e454

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
typedef small_shared_n_way_pointee_baset<3, unsigned> d_baset;
@@ -132,10 +132,10 @@ SN_TYPE_PAR_DEF class sharing_nodet
132132

133133
#if SN_SHARE_KEYS == 1
134134
SN_ASSERT(d.k == nullptr);
135-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(
135+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(
136136
std::make_shared<keyT>(k), std::forward<valueU>(v));
137137
#else
138-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
138+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
139139
#endif
140140
}
141141

@@ -174,17 +174,17 @@ SN_TYPE_PAR_DEF class sharing_nodet
174174

175175
bool is_internal() const
176176
{
177-
return data.template is_derived<0>();
177+
return data.template is_derived<2>();
178178
}
179179

180180
bool is_container() const
181181
{
182-
return data.template is_derived<1>();
182+
return data.template is_derived<0>();
183183
}
184184

185185
bool is_leaf() const
186186
{
187-
return data.template is_derived<2>();
187+
return data.template is_derived<1>();
188188
}
189189

190190
bool is_defined_internal() const
@@ -206,21 +206,21 @@ SN_TYPE_PAR_DEF class sharing_nodet
206206
{
207207
SN_ASSERT(!empty());
208208

209-
return *data.template get_derived<0>();
209+
return *data.template get_derived<2>();
210210
}
211211

212212
const d_ct &read_container() const
213213
{
214214
SN_ASSERT(!empty());
215215

216-
return *data.template get_derived<1>();
216+
return *data.template get_derived<0>();
217217
}
218218

219219
const d_lt &read_leaf() const
220220
{
221221
SN_ASSERT(!empty());
222222

223-
return *data.template get_derived<2>();
223+
return *data.template get_derived<1>();
224224
}
225225

226226
// Accessors
@@ -395,7 +395,7 @@ SN_TYPE_PAR_DEF class sharing_nodet
395395
{
396396
SN_ASSERT(!data);
397397

398-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
398+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(k, std::forward<valueU>(v));
399399
}
400400

401401
template <class valueU>
@@ -406,11 +406,11 @@ SN_TYPE_PAR_DEF class sharing_nodet
406406
if(data.use_count() > 1)
407407
{
408408
data =
409-
make_shared_3<2, SN_PTR_TYPE_ARGS>(get_key(), std::forward<valueU>(v));
409+
make_shared_3<1, SN_PTR_TYPE_ARGS>(get_key(), std::forward<valueU>(v));
410410
}
411411
else
412412
{
413-
data.template get_derived<2>()->v = std::forward<valueU>(v);
413+
data.template get_derived<1>()->v = std::forward<valueU>(v);
414414
}
415415

416416
SN_ASSERT(data.use_count() == 1);
@@ -422,10 +422,10 @@ SN_TYPE_PAR_DEF class sharing_nodet
422422

423423
if(data.use_count() > 1)
424424
{
425-
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(read_leaf());
425+
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(read_leaf());
426426
}
427427

428-
mutator(data.template get_derived<2>()->v);
428+
mutator(data.template get_derived<1>()->v);
429429

430430
SN_ASSERT(data.use_count() == 1);
431431
}
@@ -437,16 +437,16 @@ SN_TYPE_PAR_DEF class sharing_nodet
437437

438438
if(!data)
439439
{
440-
data = make_shared_3<0, SN_PTR_TYPE_ARGS>();
440+
data = make_shared_3<2, SN_PTR_TYPE_ARGS>();
441441
}
442442
else if(data.use_count() > 1)
443443
{
444-
data = make_shared_3<0, SN_PTR_TYPE_ARGS>(read_internal());
444+
data = make_shared_3<2, SN_PTR_TYPE_ARGS>(read_internal());
445445
}
446446

447447
SN_ASSERT(data.use_count() == 1);
448448

449-
return *data.template get_derived<0>();
449+
return *data.template get_derived<2>();
450450
}
451451

452452
d_ct &write_container()
@@ -455,16 +455,16 @@ SN_TYPE_PAR_DEF class sharing_nodet
455455

456456
if(!data)
457457
{
458-
data = make_shared_3<1, SN_PTR_TYPE_ARGS>();
458+
data = make_shared_3<0, SN_PTR_TYPE_ARGS>();
459459
}
460460
else if(data.use_count() > 1)
461461
{
462-
data = make_shared_3<1, SN_PTR_TYPE_ARGS>(read_container());
462+
data = make_shared_3<0, SN_PTR_TYPE_ARGS>(read_container());
463463
}
464464

465465
SN_ASSERT(data.use_count() == 1);
466466

467-
return *data.template get_derived<1>();
467+
return *data.template get_derived<0>();
468468
}
469469

470470
datat data;

0 commit comments

Comments
 (0)