Skip to content

Commit dec4e97

Browse files
committed
fix clang-16 compiler
1 parent cfb881f commit dec4e97

File tree

2 files changed

+49
-12
lines changed

2 files changed

+49
-12
lines changed

src/base/math/segmentedfunc.h

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ template <typename T, class CRTP> struct SegmentedFunction
4343
{
4444
CRTP res;
4545

46-
auto &&transformer = [](auto &&another)
46+
auto merger = [](const Stop &item1, const Stop &item2)
47+
{
48+
return Stop{item1.pos, item1.value + item2.value};
49+
};
50+
51+
auto &&transformer = [](const CRTP &another)
4752
{
4853
return [&another](const Stop &item)
4954
{
@@ -53,13 +58,21 @@ template <typename T, class CRTP> struct SegmentedFunction
5358
Alg::merge(self.stops,
5459
other.stops,
5560
res.stops,
56-
Alg::merge_args{.projection = &Stop::pos,
61+
Alg::merge_args
62+
// { Remove when clang-16 not used
63+
<std::identity,
64+
std::identity,
65+
double Stop::*,
66+
decltype(std::weak_order),
67+
decltype(transformer(other)),
68+
decltype(transformer(self)),
69+
Alg::Merge::always,
70+
decltype(merger)>
71+
// }
72+
{.projection = &Stop::pos,
5773
.transformer_1 = transformer(other),
5874
.transformer_2 = transformer(self),
59-
.merger = [](const Stop &item1, const Stop &item2)
60-
{
61-
return Stop{item1.pos, item1.value + item2.value};
62-
}});
75+
.merger = merger});
6376
return res;
6477
}
6578

src/chart/generator/axis.cpp

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ DimensionAxis interpolate(const DimensionAxis &op0,
304304
const Val *latest1{};
305305
const Val *latest2{};
306306

307-
auto &&merger = [&](const Val &lhs, const Val &rhs) -> Val
307+
auto merger = [&](const Val &lhs, const Val &rhs) -> Val
308308
{
309309
latest1 = std::addressof(lhs);
310310
latest2 = std::addressof(rhs);
@@ -332,7 +332,18 @@ DimensionAxis interpolate(const DimensionAxis &op0,
332332
Alg::merge(op0.values,
333333
op1.values,
334334
res.values,
335-
Alg::merge_args{.projection = &Val::first,
335+
Alg::merge_args
336+
// { Remove when clang-16 not used
337+
<std::identity,
338+
std::identity,
339+
const Data::SliceIndex Val::*,
340+
decltype(std::weak_order),
341+
decltype(one_side({}, {}, latest1)),
342+
decltype(one_side({}, {}, latest1)),
343+
Alg::Merge::always,
344+
decltype(merger)>
345+
// }
346+
{.projection = &Val::first,
336347
.transformer_1 =
337348
one_side(true, &DimensionAxis::Item::endPos, latest2),
338349
.transformer_2 = one_side(false,
@@ -381,8 +392,9 @@ interpolate(const SplitAxis &op0, const SplitAxis &op1, double factor)
381392
};
382393
};
383394

384-
auto &&one_side = [needMerge](const decltype(merger(0.0)) &merger,
385-
bool needOther)
395+
using MergerType = decltype(merger(0.0));
396+
auto &&one_side =
397+
[needMerge](const MergerType &merger, bool needOther)
386398
{
387399
return
388400
[needMerge, &merger, needOther, firstSpecial = needOther](
@@ -391,7 +403,8 @@ interpolate(const SplitAxis &op0, const SplitAxis &op1, double factor)
391403
if (needMerge) {
392404
if (firstSpecial) {
393405
firstSpecial = false;
394-
return merger(val, {});
406+
return merger(val,
407+
PartPair{std::nullopt, SplitAxis::Part{}});
395408
}
396409

397410
Math::Range<> range{0.0, 1.0};
@@ -412,7 +425,18 @@ interpolate(const SplitAxis &op0, const SplitAxis &op1, double factor)
412425
Alg::merge(op0.parts,
413426
op1.parts,
414427
res.parts,
415-
Alg::merge_args{.projection = &PartPair::first,
428+
Alg::merge_args
429+
// { Remove when clang-16 not used
430+
<std::identity,
431+
std::identity,
432+
const std::optional<Data::SliceIndex> PartPair::*,
433+
decltype(std::weak_order),
434+
decltype(one_side(merger({}), {})),
435+
decltype(one_side(merger({}), {})),
436+
Alg::Merge::always,
437+
const MergerType &>
438+
// }
439+
{.projection = &PartPair::first,
416440
.transformer_1 =
417441
one_side(merger(factor), op1.parts.size() <= 1),
418442
.transformer_2 =

0 commit comments

Comments
 (0)