PDFxTMDLib 2.0.0
Loading...
Searching...
No Matches
IQCDCoupling.h
Go to the documentation of this file.
1#pragma once
2#include <array>
3#include <cstddef>
4#include <cstdlib>
5#include <memory>
6#include <type_traits>
7#include <utility>
8namespace PDFxTMD
9{
12{
13 public:
14 template <typename AlphaQCOperation_T>
15 explicit IQCDCoupling(AlphaQCOperation_T alphaQCDApproach)
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);
20 delete model;
21 }),
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); // fixed the pdf method call
26 }),
27 clone_([](void *alphaQCDApproachBytes) -> void * {
28 using Model = OwningModel<AlphaQCOperation_T>;
29 auto *const model = static_cast<Model *>(alphaQCDApproachBytes);
30 return new Model(*model);
31 })
32 {
33 }
34
36 double AlphaQCDMu2(double mu2) const
37 {
38 return alphaQCOperation_(pimpl_.get(), mu2);
39 }
40
42 : pimpl_(other.clone_(other.pimpl_.get()), other.pimpl_.get_deleter()),
43 clone_(other.clone_), alphaQCOperation_(other.alphaQCOperation_)
44 {
45 }
46
48 {
49 using std::swap;
50 IQCDCoupling copy(other);
51 swap(pimpl_, copy.pimpl_);
52 swap(clone_, copy.clone_);
53 swap(alphaQCOperation_, copy.alphaQCOperation_);
54 return *this;
55 }
56
57 IQCDCoupling(IQCDCoupling &&other) noexcept = default;
58 ~IQCDCoupling() = default;
59 IQCDCoupling &operator=(IQCDCoupling &&other) = default;
60
61 private:
62 template <typename AlphaQCOperation_T> struct OwningModel
63 {
64 OwningModel(AlphaQCOperation_T alphaQCDApproach) : alphaQCO_(std::move(alphaQCDApproach))
65 {
66 }
67
68 double AlphaQCDMu2(double mu2)
69 {
70 return alphaQCO_.AlphaQCDMu2(mu2); // fixed the pdf method signature
71 }
72
73 AlphaQCOperation_T alphaQCO_;
74 };
75
76 using DestroyOperation = void(void *);
77 using CloneOperation = void *(void *);
78 using AlphaQCDOperation = double(void *, double);
79
80 std::unique_ptr<void, DestroyOperation *> pimpl_;
81 CloneOperation *clone_{nullptr};
82 AlphaQCDOperation *alphaQCOperation_{nullptr};
83};
84} // namespace PDFxTMD
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
Definition Factory.h:9