Skip to content

Commit 7fca3ff

Browse files
committed
fix return type deduction. Fixes problems with integral cell|Size
1 parent 76958c6 commit 7fca3ff

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

include/picongpu/plugins/binning/DomainInfo.hpp

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,25 @@ namespace picongpu
184184

185185
auto pos = localCellIdx + relative_cellpos;
186186

187+
using DistanceReturnType = std::common_type_t<
188+
typename std::decay_t<decltype(sim.si.getCellSize())>::type,
189+
typename std::decay_t<decltype(pos)>::type>;
190+
187191
if constexpr(T_Units == PositionUnits::SI)
188192
{
189-
return precisionCast<typename std::decay_t<decltype(sim.si.getCellSize())>::type>(pos)
190-
* sim.si.getCellSize().shrink<simDim>();
193+
return precisionCast<DistanceReturnType>(pos)
194+
* precisionCast<DistanceReturnType>(sim.si.getCellSize().shrink<simDim>());
191195
}
192-
if constexpr(T_Units == PositionUnits::PIC)
196+
else if constexpr(T_Units == PositionUnits::PIC)
193197
{
194-
return precisionCast<typename std::decay_t<decltype(sim.pic.getCellSize())>::type>(pos)
195-
* sim.pic.getCellSize().shrink<simDim>();
198+
return precisionCast<DistanceReturnType>(pos)
199+
* precisionCast<DistanceReturnType>(sim.pic.getCellSize().shrink<simDim>());
200+
}
201+
// else T_Units == PositionUnits::Cell
202+
else
203+
{
204+
return pos;
196205
}
197-
198-
return pos;
199206
}
200207
};
201208

@@ -296,32 +303,43 @@ namespace picongpu
296303
if constexpr(T_Units == PositionUnits::SI)
297304
{
298305
auto cellSize = sim.si.getCellSize().shrink<simDim>();
299-
return precisionCast<typename std::decay_t<decltype(cellSize)>::type>(pos) * cellSize;
306+
return precisionCast<DistanceReturnType>(pos) * precisionCast<DistanceReturnType>(cellSize);
300307
}
301308
else if constexpr(T_Units == PositionUnits::PIC)
302309
{
303310
auto cellSize = sim.pic.getCellSize().shrink<simDim>();
304-
return precisionCast<typename std::decay_t<decltype(cellSize)>::type>(pos) * cellSize;
311+
return precisionCast<DistanceReturnType>(pos) * precisionCast<DistanceReturnType>(cellSize);
305312
}
313+
// else T_Units == PositionUnits::Cell
306314
else
307315
{
308316
return pos;
309317
}
310318
}
319+
// T_Precision == PositionPrecision::Cell
311320
else
312321
{
322+
using DistanceReturnType = std::common_type_t<
323+
typename std::decay_t<decltype(sim.si.getCellSize())>::type,
324+
typename std::decay_t<decltype(relative_cellpos)>::type>;
325+
313326
if constexpr(T_Units == PositionUnits::SI)
314327
{
315328
auto cellSize = sim.si.getCellSize().shrink<simDim>();
316-
return precisionCast<typename std::decay_t<decltype(cellSize)>::type>(relative_cellpos) * cellSize;
329+
return precisionCast<DistanceReturnType>(relative_cellpos)
330+
* precisionCast<DistanceReturnType>(cellSize);
317331
}
318-
if constexpr(T_Units == PositionUnits::PIC)
332+
else if constexpr(T_Units == PositionUnits::PIC)
319333
{
320334
auto cellSize = sim.pic.getCellSize().shrink<simDim>();
321-
return precisionCast<typename std::decay_t<decltype(cellSize)>::type>(relative_cellpos) * cellSize;
335+
return precisionCast<DistanceReturnType>(relative_cellpos)
336+
* precisionCast<DistanceReturnType>(cellSize);
337+
}
338+
// else T_Units == PositionUnits::Cell
339+
else
340+
{
341+
return relative_cellpos;
322342
}
323-
324-
return relative_cellpos;
325343
}
326344
}
327345
} // namespace plugins::binning

0 commit comments

Comments
 (0)