OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
ElmPtr.h
Go to the documentation of this file.
1#ifndef OPALX_ElmPtr_HH
2#define OPALX_ElmPtr_HH
3
4// ------------------------------------------------------------------------
5// $RCSfile: ElmPtr.h,v $
6// ------------------------------------------------------------------------
7// $Revision: 1.1.1.1 $
8// ------------------------------------------------------------------------
9// Copyright: see Copyright.readme
10// ------------------------------------------------------------------------
11//
12// Class: ElmPtr
13//
14// ------------------------------------------------------------------------
15// Class category: Beamlines
16// ------------------------------------------------------------------------
17//
18// $Date: 2000/03/27 09:32:35 $
19// $Author: fci $
20//
21// ------------------------------------------------------------------------
22
23#include <memory>
24#include <utility>
26
27// Class ElmPtr.
28// ------------------------------------------------------------------------
30// A beam line is built as a list of ElmPtr.
31
32class ElmPtr {
33public:
34 ElmPtr();
35 ElmPtr(const ElmPtr&);
36 ElmPtr(ElementBase* elem);
37 explicit ElmPtr(std::shared_ptr<ElementBase> elem);
38 virtual ~ElmPtr();
39
41 // If any error occurs, this method throws an exception.
42 virtual void accept(BeamlineVisitor&) const;
43
45 inline ElementBase* getElement() const;
46
48 inline void setElement(ElementBase*);
49 inline void setElement(std::shared_ptr<ElementBase> elem);
50
51protected:
52 // The pointer to the element.
53 std::shared_ptr<ElementBase> itsElement;
54};
55
56inline ElementBase* ElmPtr::getElement() const { return itsElement.get(); }
57
58inline void ElmPtr::setElement(ElementBase* elem) {
59 if (elem == itsElement.get()) {
60 return;
61 }
62 if (!elem) {
63 itsElement.reset();
64 return;
65 }
66 auto shared = elem->weak_from_this();
67 if (!shared.expired()) {
68 itsElement = shared.lock();
69 return;
70 }
71 itsElement.reset(elem);
72}
73
74inline void ElmPtr::setElement(std::shared_ptr<ElementBase> elem) { itsElement = std::move(elem); }
75
76#endif // OPALX_ElmPtr_HH
A section of a beam line.
Definition ElmPtr.h:32
ElmPtr()
Definition ElmPtr.cpp:25
ElementBase * getElement() const
Get the element pointer.
Definition ElmPtr.h:56
void setElement(ElementBase *)
Set the element pointer.
Definition ElmPtr.h:58
virtual void accept(BeamlineVisitor &) const
Apply visitor.
Definition ElmPtr.cpp:35
std::shared_ptr< ElementBase > itsElement
Definition ElmPtr.h:53
virtual ~ElmPtr()
Definition ElmPtr.cpp:33