IAP GITLAB
Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Air Shower Physics
corsika
Commits
2b682639
Commit
2b682639
authored
Jul 03, 2019
by
Hans Dembinski
Browse files
make deduction guide work
parent
ff3395ba
Pipeline
#933
failed with stages
in 2 minutes and 24 seconds
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Framework/ProcessSequence/ConditionalProcessSequence.h
View file @
2b682639
...
...
@@ -27,19 +27,29 @@ namespace corsika::process {
public:
static
constexpr
bool
is_boundary_crossing
=
TSeq
::
is_boundary_crossing
||
USeq
::
is_boundary_crossing
;
static
constexpr
bool
is_continuous
=
TSeq
::
is_continuous
||
USeq
::
is_continuous
;
static
constexpr
bool
is_decay
=
TSeq
::
is_decay
||
USeq
::
is_decay
;
static
constexpr
bool
is_interaction
=
TSeq
::
is_interaction
||
USeq
::
is_interaction
;
static
constexpr
bool
is_secondaries
=
TSeq
::
is_secondaries
||
USeq
::
is_secondaries
;
static
constexpr
bool
is_stack
=
TSeq
::
is_stack
||
USeq
::
is_stack
;
std
::
decay_t
<
true_seq_t
>::
is_boundary_crossing
||
std
::
decay_t
<
false_seq_t
>::
is_boundary_crossing
;
static
constexpr
bool
is_continuous
=
std
::
decay_t
<
true_seq_t
>::
is_continuous
||
std
::
decay_t
<
false_seq_t
>::
is_continuous
;
static
constexpr
bool
is_decay
=
std
::
decay_t
<
true_seq_t
>::
is_decay
||
std
::
decay_t
<
false_seq_t
>::
is_decay
;
static
constexpr
bool
is_interaction
=
std
::
decay_t
<
true_seq_t
>::
is_interaction
||
std
::
decay_t
<
false_seq_t
>::
is_interaction
;
static
constexpr
bool
is_secondaries
=
std
::
decay_t
<
true_seq_t
>::
is_secondaries
||
std
::
decay_t
<
false_seq_t
>::
is_secondaries
;
static
constexpr
bool
is_stack
=
std
::
decay_t
<
true_seq_t
>::
is_stack
||
std
::
decay_t
<
false_seq_t
>::
is_stack
;
template
<
class
TPredicate_
,
class
TTrueSeq
,
class
TFalseSeq
>
ConditionalProcessSequence
(
TPredicate_
&&
pred
,
TTrueSeq
&&
true_seq
,
TFalseSeq
&&
false_seq
)
:
pred_
(
std
::
forward
<
TPredicate_
>
(
pred
))
,
true_seq_
(
std
::
forward
<
TTrueSeq
>
(
true_seq
))
,
false_seq_
(
std
::
forward
<
TFalseSeq
>
(
false_seq
))
{}
,
false_seq_
(
std
::
forward
<
TFalseSeq
>
(
false_seq
))
{
static_assert
(
is_process_v
<
std
::
decay_t
<
TTrueSeq
>>
&&
is_process_v
<
std
::
decay_t
<
TFalseSeq
>>
,
"arguments must be processes"
);
}
template
<
typename
TParticle
,
typename
VTNType
>
EProcessReturn
DoBoundaryCrossing
(
TParticle
&
vP
,
VTNType
const
&
vFrom
,
...
...
@@ -142,19 +152,14 @@ namespace corsika::process {
false_seq_t
false_seq_
;
};
// deduction guide
s
// deduction guide
, see deduction guide of ProcessSequence
template
<
class
P
,
class
T
,
class
U
>
ConditionalProcessSequence
(
P
&&
,
T
&&
,
U
&&
)
->
ConditionalProcessSequence
<
P
,
boost
::
mp11
::
mp_rename
<
std
::
decay_t
<
T
>
,
ProcessSequence
>
,
boost
::
mp11
::
mp_rename
<
std
::
decay_t
<
U
>
,
ProcessSequence
>>
;
// template <class T, class U>
// ConditionalProcessSequence(corsika::units::si::HEPEnergyType, T&&, U &&)
// ->ConditionalProcessSequence<
// ByThreshold, boost::mp11::mp_rename<std::decay_t<T>, ProcessSequence>,
// boost::mp11::mp_rename<std::decay_t<U>, ProcessSequence>>;
P
,
boost
::
mp11
::
mp_if
<
std
::
is_rvalue_reference
<
T
>
,
std
::
decay_t
<
T
>
,
T
>
,
boost
::
mp11
::
mp_if
<
std
::
is_rvalue_reference
<
U
>
,
std
::
decay_t
<
U
>
,
U
>>
;
// predicate for deduction guide below
struct
EnergyThreshold
{
EnergyThreshold
(
corsika
::
units
::
si
::
HEPEnergyType
x
)
:
value
{
x
}
{}
...
...
@@ -167,11 +172,14 @@ namespace corsika::process {
corsika
::
units
::
si
::
HEPEnergyType
value
;
};
template
<
class
...
Ts
,
class
...
Us
>
ConditionalProcessSequence
(
corsika
::
units
::
si
::
HEPEnergyType
,
const
ProcessSequence
<
Ts
...
>&
,
const
ProcessSequence
<
Us
...
>&
)
->
ConditionalProcessSequence
<
EnergyThreshold
,
ProcessSequence
<
Ts
...
>
,
ProcessSequence
<
Us
...
>>
;
// convenience: generate ConditionalProcessSequence with energy threshold
// when first argument is energy unit type
template
<
class
T
,
class
U
>
ConditionalProcessSequence
(
corsika
::
units
::
si
::
HEPEnergyType
,
T
&&
,
U
&&
)
->
ConditionalProcessSequence
<
EnergyThreshold
,
boost
::
mp11
::
mp_if
<
std
::
is_rvalue_reference
<
T
>
,
std
::
decay_t
<
T
>
,
T
>
,
boost
::
mp11
::
mp_if
<
std
::
is_rvalue_reference
<
U
>
,
std
::
decay_t
<
U
>
,
U
>>
;
}
// namespace corsika::process
...
...
Framework/ProcessSequence/testConditionalProcessSequence.cc
View file @
2b682639
...
...
@@ -65,10 +65,7 @@ TEST_CASE("ConditionalProcessSequence") {
DummyProcess
<
3
>
false_P
;
DummyProcess
<
4
>
additional
;
ConditionalProcessSequence
<
EnergyThreshold
,
ProcessSequence
<
DummyProcess
<
1
>&
,
DummyProcess
<
2
>&>
,
ProcessSequence
<
DummyProcess
<
3
>&>>
cseq
(
1
_TeV
,
ProcessSequence
(
true_A
,
true_B
),
false_P
);
ConditionalProcessSequence
cseq
(
1
_TeV
,
ProcessSequence
(
true_A
,
true_B
),
false_P
);
ProcessSequence
seq
(
cseq
,
additional
);
SECTION
(
"low energy"
)
{
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment