31 template <
typename DPDApproachT,
32 typename = std::enable_if_t<!std::is_same_v<std::decay_t<DPDApproachT>,
ICDPD>>>
33 explicit ICDPD(DPDApproachT &&dpdApproach)
35 new OwningModel<std::decay_t<DPDApproachT>>(std::forward<DPDApproachT>(dpdApproach)),
36 [](void *dpdApproachBytes) {
37 using Model = OwningModel<std::decay_t<DPDApproachT>>;
38 auto *
const model =
static_cast<Model *
>(dpdApproachBytes);
41 dpdOperation_([](
void *dpdApproachBytes, PartonFlavor flavor1, PartonFlavor flavor2,
42 double x1,
double mu1_2,
double x2,
double mu2_2) ->
double {
43 using Model = OwningModel<std::decay_t<DPDApproachT>>;
44 auto *
const model =
static_cast<Model *
>(dpdApproachBytes);
46 return model->dpd(flavor1, flavor2, x1, mu1_2, x2, mu2_2);
48 clone_([](
void *dpdApproachBytes) ->
void * {
49 using Model = OwningModel<std::decay_t<DPDApproachT>>;
50 auto *
const model =
static_cast<Model *
>(dpdApproachBytes);
51 return new Model(*model);
68 double dpd(PartonFlavor flavor1, PartonFlavor flavor2,
double x1,
double mu1_2,
double x2,
71 return dpdOperation_(pimpl_.get(), flavor1, flavor2, x1, mu1_2, x2, mu2_2);
75 : pimpl_(other.clone_(other.pimpl_.get()), other.pimpl_.get_deleter()),
76 clone_(other.clone_), dpdOperation_(other.dpdOperation_)
88 swap(pimpl_, copy.pimpl_);
89 swap(clone_, copy.clone_);
90 swap(dpdOperation_, copy.dpdOperation_);
101 template <
typename DPDApproachT>
struct OwningModel
103 explicit OwningModel(DPDApproachT dpdApproach) : dpdApproach_(std::move(dpdApproach))
107 double dpd(PartonFlavor flavor1, PartonFlavor flavor2,
double x1,
double mu1_2,
double x2,
110 return dpdApproach_.dpd(flavor1, flavor2, x1, mu1_2, x2, mu2_2);
113 DPDApproachT dpdApproach_;
116 using DestroyOperation = void(
void *);
117 using CloneOperation =
void *(
void *);
118 using DPDOperation = double(
void *, PartonFlavor, PartonFlavor,
double,
double,
double,
double);
120 std::unique_ptr<void, DestroyOperation *> pimpl_;
121 CloneOperation *clone_{
nullptr};
122 DPDOperation *dpdOperation_{
nullptr};
double dpd(PartonFlavor flavor1, PartonFlavor flavor2, double x1, double mu1_2, double x2, double mu2_2) const
Evaluate the DPD for two flavors, two x values, and two scales.
Definition ICDPD.h:68