BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SampleProvider.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Sample/SampleBuilderEngine/SampleProvider.cpp
6 //! @brief Implements class SampleProvider.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************** //
14 
17 
19 
21 {
22  if (other.m_multilayer)
23  setSample(*other.m_multilayer);
24 
25  if (other.m_sample_builder)
27 }
28 
30 {
31  if (this != &other) {
32  SampleProvider tmp(other);
35  }
36  return *this;
37 }
38 
40 
41 void SampleProvider::setSample(const MultiLayer& multilayer)
42 {
43  m_multilayer.reset(multilayer.clone());
44  m_multilayer->setParent(parent());
46 }
47 
48 void SampleProvider::setBuilder(const std::shared_ptr<ISampleBuilder>& sample_builder)
49 {
50  m_sample_builder.setSBN(sample_builder);
52  m_multilayer.reset();
53 }
54 
55 //! Returns current sample.
56 
58 {
59  return m_multilayer.get();
60 }
61 
62 //! Generates new sample if sample builder defined.
63 
65 {
66  if (m_sample_builder)
68 
69  if (!m_multilayer)
70  throw std::runtime_error(
71  "SampleProvider::updateSample called before sample or builder was set");
72 }
73 
74 std::vector<const INode*> SampleProvider::getChildren() const
75 {
76  if (m_sample_builder)
77  return {&m_sample_builder};
78  if (m_multilayer)
79  return {m_multilayer.get()};
80  return {};
81 }
82 
83 void SampleProvider::setParent(const INode* newParent)
84 {
85  INode::setParent(newParent);
86  if (m_sample_builder)
88  else if (m_multilayer)
89  m_multilayer->setParent(parent());
90 }
Defines class MultiLayer.
void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
make Swappable
Defines class SampleProvider.
Base class for tree-like structures containing parameterized objects.
Definition: INode.h:49
virtual void setParent(const INode *newParent)
Definition: INode.cpp:69
const INode * parent() const
Definition: INode.cpp:74
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:42
MultiLayer * clone() const final override
Returns a clone of multilayer with clones of all layers and interfaces between layers.
Definition: MultiLayer.cpp:36
void setSBN(const std::shared_ptr< ISampleBuilder > &sample_builder)
Sets sample builder and borrows its parameters.
std::shared_ptr< ISampleBuilder > builder() const
Returns current sample builder.
void reset()
Resets to initial state by removing builder and its borrowed parameters.
std::unique_ptr< MultiLayer > createMultiLayer()
Creates a multilayer using sample builder.
Holds either a Sample, or a SampleBuilderNode (which holds an ISampleBuilder).
void setSample(const MultiLayer &multilayer)
void updateSample()
Generates new sample if sample builder defined.
std::unique_ptr< MultiLayer > m_multilayer
const MultiLayer * sample() const
Returns current sample.
void setParent(const INode *newParent) override
SampleProvider & operator=(const SampleProvider &other)
SampleBuilderNode m_sample_builder
std::vector< const INode * > getChildren() const override
Returns a vector of children (const).
void setBuilder(const std::shared_ptr< ISampleBuilder > &sample_builder)