BornAgain  1.19.79
Simulate and fit neutron and x-ray scattering at grazing incidence
Serialize Namespace Reference

Description

Functions to serialize various data types.

Serialization means writing to or reading from an XML stream.

This namespace is spread over several source files in order to keep include dependencies unidirectional.

Functions

template<typename BaseClass >
void rwBaseClass (Streamer &s, const QString &tag, BaseClass *p)
 Serializes part of an items that belongs to a given base class. More...
 
template<typename Catalog , typename... Args>
void rwCatalogized (Streamer &s, const QString &tag, QVector< typename Catalog::CatalogedType * > &vec, Args... argsForConstructor)
 Serializes a list of items from a class hierarchy described by a catalog. Passes optional arguments to the constructor. More...
 
template<typename T >
void rwClass (Streamer &s, const QString &tag, T &t)
 Serializes an item from a class that provides the function void serialize(Streamer&). More...
 
template<typename ItemClass >
void rwInitializable (Streamer &s, const QString &tag, std::unique_ptr< ItemClass > &up, const std::function< void(ItemClass *)> &initializer)
 Serializes an optional item of known type that needs an initializer. More...
 
template<typename ItemClass , typename... ArgsForConstructor>
void rwOptional (Streamer &s, const QString &tag, std::unique_ptr< ItemClass > &up, ArgsForConstructor... argsForConstructor)
 Serializes an optional item of known type. Passes optional arguments to the constructor. More...
 
void rwProperty (Streamer &s, DoubleProperty &d)
 
void rwProperty (Streamer &s, UIntProperty &d)
 
void rwProperty (Streamer &s, VectorProperty &d)
 
template<typename Catalog , typename... ArgsForCreation>
void rwSelected (Streamer &s, SelectionProperty< typename Catalog::CatalogedType * > &d, ArgsForCreation... argsForCreation)
 Serializes an item from a catalog. Passes optional arguments to the constructor. More...
 
template<typename type >
void rwSessionItem (Streamer &s, const QString &tag, SessionItem *property)
 Only for migration. More...
 
void rwValue (Streamer &s, const QString &tag, bool &val)
 
void rwValue (Streamer &s, const QString &tag, double &val)
 
void rwValue (Streamer &s, const QString &tag, int &val)
 
void rwValue (Streamer &s, const QString &tag, QByteArray &val)
 
void rwValue (Streamer &s, const QString &tag, QColor &col)
 
void rwValue (Streamer &s, const QString &tag, QString &val)
 
void rwValue (Streamer &s, const QString &tag, R3 &val)
 
template<typename T , typename... Args>
void rwVector (Streamer &s, const QString &tag, QVector< T > &vec, Args... argsForConstructor)
 Serializes a list of items of known and fixed type. Passes optional arguments to the constructor. More...
 

Function Documentation

◆ rwBaseClass()

template<typename BaseClass >
void Serialize::rwBaseClass ( Streamer s,
const QString &  tag,
BaseClass *  p 
)

Serializes part of an items that belongs to a given base class.

Definition at line 85 of file Serialize.h.

86 {
87  s.start(tag);
88  p->BaseClass::serialize(s);
89  s.finish(tag);
90 }
void start(const QString &tag)
Definition: Streamer.cpp:82
void finish(const QString &tag)
Definition: Streamer.cpp:90

References Streamer::finish(), and Streamer::start().

Here is the call graph for this function:

◆ rwCatalogized()

template<typename Catalog , typename... Args>
void Serialize::rwCatalogized ( Streamer s,
const QString &  tag,
QVector< typename Catalog::CatalogedType * > &  vec,
Args...  argsForConstructor 
)

Serializes a list of items from a class hierarchy described by a catalog. Passes optional arguments to the constructor.

Definition at line 116 of file Serialize.h.

119 {
120  if (QXmlStreamWriter* w = s.xmlWriter()) {
121  w->writeStartElement(tag);
122  w->writeAttribute("n", QString::number(vec.size()));
123  int i = 0;
124  for (auto* p : vec) {
125  s.write<Catalog>("E" + QString::number(i++), p);
126  }
127  w->writeEndElement();
128  } else if (QXmlStreamReader* r = s.xmlReader()) {
129  r->readNextStartElement();
130  s.assertCurrentTag(tag);
131  const int n = r->attributes().value("n").toInt();
132  for (int i = 0; i < n; i++) {
133  typename Catalog::CatalogedType* p = nullptr;
134  s.read<Catalog>("E" + QString::number(i), p, argsForConstructor...);
135  vec << p;
136  }
137  s.gotoEndElementOfTag(tag);
138  }
139 }
void gotoEndElementOfTag(const QString &tag)
Definition: Streamer.cpp:39
void write(const QString &tag, typename Catalog::CatalogedType *p)
Definition: Streamer.h:82
void assertCurrentTag(const QString &expectedTag) const
Definition: Streamer.cpp:62
QXmlStreamWriter * xmlWriter()
Returns stream writer or nullptr.
Definition: Streamer.h:47
QXmlStreamReader * xmlReader()
Returns stream reader or nullptr.
Definition: Streamer.h:48
void read(const QString &tag, typename Catalog::CatalogedType *&p, Args... argsForConstructor)
Definition: Streamer.h:93

References Streamer::assertCurrentTag(), Streamer::gotoEndElementOfTag(), Streamer::read(), Streamer::write(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwClass()

template<typename T >
void Serialize::rwClass ( Streamer s,
const QString &  tag,
T &  t 
)

Serializes an item from a class that provides the function void serialize(Streamer&).

Definition at line 77 of file Serialize.h.

78 {
79  s.start(tag);
80  t.serialize(s);
81  s.finish(tag);
82 }

References Streamer::finish(), and Streamer::start().

Referenced by rwVector(), BeamItem::serialize(), InstrumentItem::serialize(), MultiLayerItem::serialize(), RectangularDetectorItem::serialize(), and SphericalDetectorItem::serialize().

Here is the call graph for this function:

◆ rwInitializable()

template<typename ItemClass >
void Serialize::rwInitializable ( Streamer s,
const QString &  tag,
std::unique_ptr< ItemClass > &  up,
const std::function< void(ItemClass *)> &  initializer 
)

Serializes an optional item of known type that needs an initializer.

The initializer will be called after creation and before de-serialization

Definition at line 164 of file Serialize.h.

166 {
167  if (QXmlStreamWriter* w = s.xmlWriter()) {
168  w->writeStartElement(tag);
169  w->writeAttribute("valid", up ? "1" : "0");
170  if (up)
171  up->serialize(s);
172  w->writeEndElement();
173  } else if (QXmlStreamReader* r = s.xmlReader()) {
174  s.gotoStartElementOfTag(tag);
175  const bool valid = r->attributes().value("valid").toUInt() > 0;
176  if (valid) {
177  up.reset(new ItemClass());
178  if (initializer)
179  initializer(up.get());
180  up->serialize(s);
181  } else
182  up.reset();
183  s.gotoEndElementOfTag(tag);
184  }
185 }
void gotoStartElementOfTag(const QString &tag)
Definition: Streamer.cpp:54

References Streamer::gotoEndElementOfTag(), Streamer::gotoStartElementOfTag(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwOptional()

template<typename ItemClass , typename... ArgsForConstructor>
void Serialize::rwOptional ( Streamer s,
const QString &  tag,
std::unique_ptr< ItemClass > &  up,
ArgsForConstructor...  argsForConstructor 
)

Serializes an optional item of known type. Passes optional arguments to the constructor.

Definition at line 142 of file Serialize.h.

144 {
145  if (QXmlStreamWriter* w = s.xmlWriter()) {
146  w->writeStartElement(tag);
147  w->writeAttribute("valid", up ? "1" : "0");
148  if (up)
149  up->serialize(s);
150  w->writeEndElement();
151  } else if (QXmlStreamReader* r = s.xmlReader()) {
152  s.gotoStartElementOfTag(tag);
153  const bool valid = r->attributes().value("valid").toUInt() > 0;
154  if (valid) {
155  up.reset(new ItemClass(argsForConstructor...));
156  up->serialize(s);
157  } else
158  up.reset();
159  s.gotoEndElementOfTag(tag);
160  }
161 }

References Streamer::gotoEndElementOfTag(), Streamer::gotoStartElementOfTag(), Streamer::xmlReader(), and Streamer::xmlWriter().

Referenced by LayerItem::serialize(), and ParticleCoreShellItem::serialize().

Here is the call graph for this function:

◆ rwProperty() [1/3]

void Serialize::rwProperty ( Streamer s,
DoubleProperty d 
)

Definition at line 65 of file DoubleProperty.cpp.

66 {
67  if (QXmlStreamWriter* w = s.xmlWriter()) {
68  w->writeStartElement(d.persistentTag());
70  w->writeAttribute(XML::Tags::Id, d.uid());
72  w->writeEndElement();
73  } else if (QXmlStreamReader* r = s.xmlReader()) {
74  r->readNextStartElement();
76  d.set(r->attributes().value(XML::Tags::Value).toDouble());
77  d.setUid(r->attributes().value(XML::Tags::Id).toString());
78  d.setDecimals(r->attributes().value(XML::Tags::Decimals).toUInt());
80  } else
81  ASSERT(0);
82 }
QString uid() const
Unique id of this double property.
QString persistentTag() const
Persistent tag for serializing.
void setDecimals(unsigned decimals)
Set number of decimals to be shown in an edit field.
unsigned decimals() const
Number of decimals to be shown in an edit field.
void set(double d)
Set the contained value.
double get() const
The contained value.
void setUid(const QString &uid)
Set the unique id of this double property.
void writeAttribute(QXmlStreamWriter *writer, const QString &attributeName, const QVariant &variant)
Write the variant's value as an attribute.
Definition: UtilXML.cpp:65
constexpr auto Decimals("decimals")
constexpr auto Id("id")
constexpr auto Value("value")

References Streamer::assertCurrentTag(), XML::Tags::Decimals(), DoubleProperty::decimals(), DoubleProperty::get(), Streamer::gotoEndElementOfTag(), XML::Tags::Id(), DoubleProperty::persistentTag(), DoubleProperty::set(), DoubleProperty::setDecimals(), DoubleProperty::setUid(), DoubleProperty::uid(), XML::Tags::Value(), GUI::Session::XML::writeAttribute(), Streamer::xmlReader(), and Streamer::xmlWriter().

Referenced by AxisProperty::rwAxisProperty(), DistributionItem::serialize(), BeamItem::serialize(), InstrumentItem::serialize(), FormFactorItem::serialize(), LayerItem::serialize(), LayerBasicRoughnessItem::serialize(), MultiLayerItem::serialize(), ParticleLayoutItem::serialize(), Profile1DItem::serialize(), Profile2DItem::serialize(), ConstantBackgroundItem::serialize(), FootprintGaussianItem::serialize(), FootprintSquareItem::serialize(), RectangularDetectorItem::serialize(), ResolutionFunction2DGaussianItem::serialize(), Interference1DLatticeItem::serialize(), Interference2DLatticeItem::serialize(), Interference2DParaCrystalItem::serialize(), InterferenceFinite2DLatticeItem::serialize(), InterferenceHardDiskItem::serialize(), InterferenceRadialParaCrystalItem::serialize(), BasicLattice2DItem::serialize(), SquareLattice2DItem::serialize(), HexagonalLattice2DItem::serialize(), MesoCrystalItem::serialize(), ParticleCompositionItem::serialize(), ParticleCoreShellItem::serialize(), ParticleItem::serialize(), Profile1DVoigtItem::serialize(), Profile2DVoigtItem::serialize(), XRotationItem::serialize(), YRotationItem::serialize(), ZRotationItem::serialize(), EulerRotationItem::serialize(), and InterferenceItem::serialize().

Here is the call graph for this function:

◆ rwProperty() [2/3]

void Serialize::rwProperty ( Streamer s,
UIntProperty d 
)

Definition at line 44 of file UIntProperty.cpp.

45 {
46  if (QXmlStreamWriter* w = s.xmlWriter()) {
47  w->writeStartElement(d.persistentTag());
50  w->writeEndElement();
51  } else if (QXmlStreamReader* r = s.xmlReader()) {
52  r->readNextStartElement();
54  d.set(r->attributes().value(XML::Tags::Value).toUInt());
55  d.setUid(r->attributes().value(XML::Tags::Id).toString());
57  } else
58  ASSERT(0);
59 }
void setUid(const QString &uid)
Definition: UIntProperty.h:55
QString persistentTag() const
Definition: UIntProperty.h:53
uint get() const
Definition: UIntProperty.h:51
void set(uint d)
Definition: UIntProperty.h:50
QString uid() const
Definition: UIntProperty.h:54
void writeUid(QXmlStreamWriter *writer, const QString &id)
Definition: UtilXML.cpp:127

References Streamer::assertCurrentTag(), UIntProperty::get(), Streamer::gotoEndElementOfTag(), XML::Tags::Id(), UIntProperty::persistentTag(), UIntProperty::set(), UIntProperty::setUid(), UIntProperty::uid(), XML::Tags::Value(), GUI::Session::XML::writeAttribute(), GUI::Session::XML::writeUid(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwProperty() [3/3]

void Serialize::rwProperty ( Streamer s,
VectorProperty d 
)

Definition at line 31 of file VectorProperty.cpp.

32 {
33  if (QXmlStreamWriter* w = s.xmlWriter()) {
34  w->writeStartElement(d.persistentTag());
37  w->writeEndElement();
38  } else if (QXmlStreamReader* r = s.xmlReader()) {
39  r->readNextStartElement();
41  R3 vec;
42  QString uid;
45  d.set(vec);
46  d.setUid(uid);
48  } else
49  ASSERT(0);
50 }
QString persistentTag() const
void set(const R3 &d)
void setUid(const QString &uid)
R3 get() const
QString uid() const
void readAttribute(QXmlStreamReader *reader, const QString &attributeName, double *d)
Definition: UtilXML.cpp:193

References Streamer::assertCurrentTag(), VectorProperty::get(), Streamer::gotoEndElementOfTag(), XML::Tags::Id(), VectorProperty::persistentTag(), GUI::Session::XML::readAttribute(), VectorProperty::set(), VectorProperty::setUid(), VectorProperty::uid(), XML::Tags::Value(), GUI::Session::XML::writeAttribute(), GUI::Session::XML::writeUid(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwSelected()

template<typename Catalog , typename... ArgsForCreation>
void Serialize::rwSelected ( Streamer s,
SelectionProperty< typename Catalog::CatalogedType * > &  d,
ArgsForCreation...  argsForCreation 
)

Serializes an item from a catalog. Passes optional arguments to the constructor.

Definition at line 206 of file SelectionProperty.h.

208 {
209  if (QXmlStreamWriter* w = s.xmlWriter()) {
210  typename Catalog::CatalogedType* p = d.get();
211  s.write<Catalog>(d.persistentTag(), p);
212  } else if (QXmlStreamReader* r = s.xmlReader()) {
213  typename Catalog::CatalogedType* p = nullptr;
214  s.read<Catalog>(d.persistentTag(), p, argsForCreation...);
215  d.set(p);
216  }
217 }
void set(T t, bool callInitializer=false)
Directly set the new item.
T get() const
Direct access to the stored pointer.
QString persistentTag() const
Persistent tag for serializing.

References SelectionProperty< T >::get(), SelectionProperty< T >::persistentTag(), Streamer::read(), SelectionProperty< T >::set(), Streamer::write(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwSessionItem()

template<typename type >
void Serialize::rwSessionItem ( Streamer s,
const QString &  tag,
SessionItem property 
)

Only for migration.

Definition at line 428 of file SessionItem.h.

429 {
430  if (QXmlStreamWriter* w = s.xmlWriter()) {
431  auto v = property->value().value<type>();
432  Serialize::rwValue(s, tag, v);
433  } else if (QXmlStreamReader* r = s.xmlReader()) {
434  type v;
435  Serialize::rwValue(s, tag, v);
436  property->setValue(v);
437  }
438 }
void rwValue(Streamer &s, const QString &tag, bool &val)
Definition: Serialize.cpp:19

References rwValue(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwValue() [1/7]

void Serialize::rwValue ( Streamer s,
const QString &  tag,
bool &  val 
)

Definition at line 19 of file Serialize.cpp.

20 {
21  if (QXmlStreamWriter* w = s.xmlWriter()) {
22  w->writeStartElement(tag);
23  w->writeAttribute(XML::Tags::Value, val ? "1" : "0");
24  w->writeEndElement();
25  } else if (QXmlStreamReader* r = s.xmlReader()) {
26  r->readNextStartElement();
27  s.assertCurrentTag(tag);
28  val = r->attributes().value(XML::Tags::Value).toUInt() > 0;
29  s.gotoEndElementOfTag(tag);
30  } else
31  ASSERT(0);
32 }

References Streamer::assertCurrentTag(), Streamer::gotoEndElementOfTag(), XML::Tags::Value(), Streamer::xmlReader(), and Streamer::xmlWriter().

Referenced by rwSessionItem(), InstrumentItem::serialize(), LayerItem::serialize(), MaterialItem::serialize(), MultiLayerItem::serialize(), PointwiseAxisItem::serialize(), RectangularDetectorItem::serialize(), SpecularBeamInclinationItem::serialize(), Interference2DLatticeItem::serialize(), Interference2DParaCrystalItem::serialize(), InterferenceFinite2DLatticeItem::serialize(), and ParticleItem::serialize().

Here is the call graph for this function:

◆ rwValue() [2/7]

void Serialize::rwValue ( Streamer s,
const QString &  tag,
double &  val 
)

Definition at line 49 of file Serialize.cpp.

50 {
51  if (QXmlStreamWriter* w = s.xmlWriter()) {
52  w->writeStartElement(tag);
54  w->writeEndElement();
55  } else if (QXmlStreamReader* r = s.xmlReader()) {
56  r->readNextStartElement();
57  s.assertCurrentTag(tag);
58  val = r->attributes().value(XML::Tags::Value).toDouble();
59  s.gotoEndElementOfTag(tag);
60  } else
61  ASSERT(0);
62 }

References Streamer::assertCurrentTag(), Streamer::gotoEndElementOfTag(), XML::Tags::Value(), GUI::Session::XML::writeAttribute(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwValue() [3/7]

void Serialize::rwValue ( Streamer s,
const QString &  tag,
int &  val 
)

Definition at line 34 of file Serialize.cpp.

35 {
36  if (QXmlStreamWriter* w = s.xmlWriter()) {
37  w->writeStartElement(tag);
38  w->writeAttribute(XML::Tags::Value, QString::number(val));
39  w->writeEndElement();
40  } else if (QXmlStreamReader* r = s.xmlReader()) {
41  r->readNextStartElement();
42  s.assertCurrentTag(tag);
43  val = r->attributes().value(XML::Tags::Value).toInt();
44  s.gotoEndElementOfTag(tag);
45  } else
46  ASSERT(0);
47 }

References Streamer::assertCurrentTag(), Streamer::gotoEndElementOfTag(), XML::Tags::Value(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwValue() [4/7]

void Serialize::rwValue ( Streamer s,
const QString &  tag,
QByteArray &  val 
)

Definition at line 95 of file Serialize.cpp.

96 {
97  if (QXmlStreamWriter* w = s.xmlWriter()) {
98  w->writeStartElement(tag);
99  w->writeCharacters(val.toBase64());
100  w->writeEndElement();
101  } else if (QXmlStreamReader* r = s.xmlReader()) {
102  r->readNextStartElement();
103  s.assertCurrentTag(tag);
104  QString valueAsBase64 = r->readElementText(QXmlStreamReader::SkipChildElements);
105  val = QByteArray::fromBase64(valueAsBase64.toLatin1());
106  s.gotoEndElementOfTag(tag);
107  } else
108  ASSERT(0);
109 }

References Streamer::assertCurrentTag(), Streamer::gotoEndElementOfTag(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwValue() [5/7]

void Serialize::rwValue ( Streamer s,
const QString &  tag,
QColor &  col 
)

Definition at line 79 of file Serialize.cpp.

80 {
81  if (QXmlStreamWriter* w = s.xmlWriter()) {
82  w->writeStartElement(tag);
83  w->writeAttribute(XML::Tags::Value, col.isValid() ? col.name(QColor::HexArgb) : "");
84  w->writeEndElement();
85  } else if (QXmlStreamReader* r = s.xmlReader()) {
86  r->readNextStartElement();
87  s.assertCurrentTag(tag);
88  QString colName = r->attributes().value(XML::Tags::Value).toString();
89  col = QColor(colName);
90  s.gotoEndElementOfTag(tag);
91  } else
92  ASSERT(0);
93 }

References Streamer::assertCurrentTag(), Streamer::gotoEndElementOfTag(), XML::Tags::Value(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwValue() [6/7]

void Serialize::rwValue ( Streamer s,
const QString &  tag,
QString &  val 
)

Definition at line 64 of file Serialize.cpp.

65 {
66  if (QXmlStreamWriter* w = s.xmlWriter()) {
67  w->writeStartElement(tag);
68  w->writeAttribute(XML::Tags::Value, val);
69  w->writeEndElement();
70  } else if (QXmlStreamReader* r = s.xmlReader()) {
71  r->readNextStartElement();
72  s.assertCurrentTag(tag);
74  s.gotoEndElementOfTag(tag);
75  } else
76  ASSERT(0);
77 }

References Streamer::assertCurrentTag(), Streamer::gotoEndElementOfTag(), GUI::Session::XML::readAttribute(), XML::Tags::Value(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwValue() [7/7]

void Serialize::rwValue ( Streamer s,
const QString &  tag,
R3 &  val 
)

Definition at line 111 of file Serialize.cpp.

112 {
113  if (QXmlStreamWriter* w = s.xmlWriter()) {
114  w->writeStartElement(tag);
116  w->writeEndElement();
117  } else if (QXmlStreamReader* r = s.xmlReader()) {
118  s.gotoStartElementOfTag(tag);
120  s.gotoEndElementOfTag(tag);
121  } else
122  ASSERT(0);
123 }

References Streamer::gotoEndElementOfTag(), Streamer::gotoStartElementOfTag(), GUI::Session::XML::readAttribute(), XML::Tags::Value(), GUI::Session::XML::writeAttribute(), Streamer::xmlReader(), and Streamer::xmlWriter().

Here is the call graph for this function:

◆ rwVector()

template<typename T , typename... Args>
void Serialize::rwVector ( Streamer s,
const QString &  tag,
QVector< T > &  vec,
Args...  argsForConstructor 
)

Serializes a list of items of known and fixed type. Passes optional arguments to the constructor.

Definition at line 93 of file Serialize.h.

95 {
96  if (QXmlStreamWriter* w = s.xmlWriter()) {
97  w->writeStartElement(tag);
98  w->writeAttribute("n", QString::number(vec.size()));
99  int i = 0;
100  for (auto* p : vec)
101  Serialize::rwClass(s, "E" + QString::number(i++), *p);
102  w->writeEndElement();
103  } else if (QXmlStreamReader* r = s.xmlReader()) {
104  r->readNextStartElement();
105  s.assertCurrentTag(tag);
106  const int n = r->attributes().value("n").toInt();
107  for (int i = 0; i < n; i++) {
108  vec << new typename std::remove_pointer<T>::type(argsForConstructor...);
109  Serialize::rwClass(s, "E" + QString::number(i), *vec.last());
110  }
111  s.gotoEndElementOfTag(tag);
112  }
113 }
void rwClass(Streamer &s, const QString &tag, T &t)
Serializes an item from a class that provides the function void serialize(Streamer&).
Definition: Serialize.h:77

References Streamer::assertCurrentTag(), Streamer::gotoEndElementOfTag(), rwClass(), Streamer::xmlReader(), and Streamer::xmlWriter().

Referenced by LayerItem::serialize(), MaterialItems::serialize(), MultiLayerItem::serialize(), MultiLayerItems::serialize(), and PolygonItem::serialize().

Here is the call graph for this function: