14 template <
typename AlphaQCOperation_T>
16 : pimpl_(new OwningModel<AlphaQCOperation_T>(std::move(alphaQCDApproach)),
17 [](void *alphaQCDApproachBytes) {
18 using Model = OwningModel<AlphaQCOperation_T>;
19 auto *
const model =
static_cast<Model *
>(alphaQCDApproachBytes);
22 alphaQCOperation_([](
void *alphaQCDApproachBytes,
double mu2) ->
double {
23 using Model = OwningModel<AlphaQCOperation_T>;
24 auto *
const model =
static_cast<Model *
>(alphaQCDApproachBytes);
25 return model->AlphaQCDMu2(mu2);
27 clone_([](
void *alphaQCDApproachBytes) ->
void * {
28 using Model = OwningModel<AlphaQCOperation_T>;
29 auto *
const model =
static_cast<Model *
>(alphaQCDApproachBytes);
30 return new Model(*model);
38 return alphaQCOperation_(pimpl_.get(), mu2);
42 : pimpl_(other.clone_(other.pimpl_.get()), other.pimpl_.get_deleter()),
43 clone_(other.clone_), alphaQCOperation_(other.alphaQCOperation_)
51 swap(pimpl_, copy.pimpl_);
52 swap(clone_, copy.clone_);
53 swap(alphaQCOperation_, copy.alphaQCOperation_);
62 template <
typename AlphaQCOperation_T>
struct OwningModel
64 OwningModel(AlphaQCOperation_T alphaQCDApproach) : alphaQCO_(std::move(alphaQCDApproach))
68 double AlphaQCDMu2(
double mu2)
70 return alphaQCO_.AlphaQCDMu2(mu2);
73 AlphaQCOperation_T alphaQCO_;
76 using DestroyOperation = void(
void *);
77 using CloneOperation =
void *(
void *);
78 using AlphaQCDOperation = double(
void *,
double);
80 std::unique_ptr<void, DestroyOperation *> pimpl_;
81 CloneOperation *clone_{
nullptr};
82 AlphaQCDOperation *alphaQCOperation_{
nullptr};
Type-erased interface for QCD-coupling implementations.
Definition IQCDCoupling.h:12
IQCDCoupling(IQCDCoupling &&other) noexcept=default
double AlphaQCDMu2(double mu2) const
Return the strong coupling at the factorization scale squared.
Definition IQCDCoupling.h:36
IQCDCoupling(const IQCDCoupling &other)
Definition IQCDCoupling.h:41
IQCDCoupling & operator=(IQCDCoupling &&other)=default
IQCDCoupling(AlphaQCOperation_T alphaQCDApproach)
Definition IQCDCoupling.h:15
IQCDCoupling & operator=(IQCDCoupling const &other)
Definition IQCDCoupling.h:47