PDFxTMDLib  1.0.0
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>
8 // AlphaQCDMu2
9 namespace PDFxTMD
10 {
11 // Interface for QCD Coupling
13 {
14  public:
15  template <typename AlphaQCOperation_T>
16  explicit IQCDCoupling(AlphaQCOperation_T alphaQCDApproach)
17  : pimpl_(new OwningModel<AlphaQCOperation_T>(std::move(alphaQCDApproach)),
18  [](void *alphaQCDApproachBytes) {
19  using Model = OwningModel<AlphaQCOperation_T>;
20  auto *const model = static_cast<Model *>(alphaQCDApproachBytes);
21  delete model;
22  }),
23  alphaQCOperation_([](void *alphaQCDApproachBytes, double mu2) -> double {
24  using Model = OwningModel<AlphaQCOperation_T>;
25  auto *const model = static_cast<Model *>(alphaQCDApproachBytes);
26  return model->AlphaQCDMu2(mu2); // fixed the pdf method call
27  }),
28  clone_([](void *alphaQCDApproachBytes) -> void * {
29  using Model = OwningModel<AlphaQCOperation_T>;
30  auto *const model = static_cast<Model *>(alphaQCDApproachBytes);
31  return new Model(*model);
32  })
33  {
34  }
35 
36  double AlphaQCDMu2(double mu2) const
37  {
38  return alphaQCOperation_(pimpl_.get(), mu2);
39  }
40 
41  IQCDCoupling(const IQCDCoupling &other)
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
Definition: IQCDCoupling.h:13
IQCDCoupling(IQCDCoupling &&other) noexcept=default
IQCDCoupling & operator=(IQCDCoupling &&other)=default
double AlphaQCDMu2(double mu2) const
Definition: IQCDCoupling.h:36
IQCDCoupling(const IQCDCoupling &other)
Definition: IQCDCoupling.h:41
IQCDCoupling & operator=(IQCDCoupling const &other)
Definition: IQCDCoupling.h:47
IQCDCoupling(AlphaQCOperation_T alphaQCDApproach)
Definition: IQCDCoupling.h:16
Definition: AllFlavorsShape.h:14
int mu2
Definition: pdfset_tutorial.py:14