HAL
action_pingroup.cpp
Go to the documentation of this file.
2 #include "gui/gui_globals.h"
7 #include <QMetaEnum>
8 
9 namespace hal
10 {
11  int pinGroupIndex(const Module* mod, const PinGroup<ModulePin>* pgrp)
12  {
13  if (!mod || !pgrp) return -1;
14  int inx = 0;
15  for (const PinGroup<ModulePin>* testgrp : mod->get_pin_groups())
16  {
17  if (testgrp == pgrp) return inx;
18  ++inx;
19  }
20  return -1;
21  }
22 
24  {
25  if (!m) m = gNetlist->get_top_module();
26  std::cerr << "module: " << m->get_id() << " <" << m->get_name() << ">\n";
27  for (PinGroup<ModulePin>* pg : m->get_pin_groups())
28  {
29  std::cerr << " grp: " << pg->get_id() << (pg->is_ascending()?" asc ": " des ") << pg->get_start_index()
30  << " <" << pg->get_name() << ">\n";
31  for (ModulePin* pin : pg->get_pins())
32  std::cerr << " pin: " << pin->get_id() << " inx:" << pin->get_group().second << " row:"
33  << pinIndex2Row(pin,pin->get_group().second) << " <" << pin->get_name() << ">\n";
34  }
35  std::cerr << "-------------" << std::endl;
36  for (Module* sm : m->get_submodules())
37  dumpPingroups(sm);
38  }
39 
40  int pinIndex2Row(const ModulePin* pin, int index)
41  {
42  auto pg = pin->get_group();
43  if (pg.first->is_ascending())
44  return index - pg.first->get_start_index();
45  return pg.first->get_start_index() - index;
46  }
47 
48  int pinRow2Index(const ModulePin* pin, int row)
49  {
50  auto pg = pin->get_group();
51  if (pg.first->is_ascending())
52  return pg.first->get_start_index() + row;
53  return pg.first->get_start_index() - row;
54  }
55 
56  uint qHash(PinEvent pev)
57  {
58  return (uint) pev;
59  }
60 
61  QString generateGroupName(const Module* mod, const ModulePin* pin)
62  {
63  QString baseName = QString::fromStdString(pin->get_name());
64  QSet<QString> existingGroups;
65  for (auto g : mod->get_pin_groups())
66  existingGroups.insert(QString::fromStdString(g->get_name()));
67  QString retval = baseName;
68  int count = 1;
69  while (existingGroups.contains(retval))
70  retval = QString("%1_%2").arg(baseName).arg(++count);
71  return retval;
72  }
73 
75  {
76  QMetaEnum me = QMetaEnum::fromType<Type>();
77  return QString(me.key(tp));
78  }
79 
81  {
82  QMetaEnum me = QMetaEnum::fromType<Type>();
83  for (int t = None; t < MaxAction; t++)
84  if (s == me.key(t))
85  {
86  return static_cast<Type>(t);
87  }
88  return None;
89  }
90 
92  {
94  return types.contains(tp);
95  }
96 
98  {
100  return types.contains(tp);
101  }
102 
104  : UserActionFactory("Pingroup") {;}
105 
107 
109  {
110  return new ActionPingroup;
111  }
112 
114  {
116  }
117 
119  {
120  mPinActions.append(AtomicAction(tp, id, name, value));
121  }
122 
124  : mPinActions(aaList)
125  {;}
126 
128  {
129  for (const AtomicAction& aa : mPinActions)
130  {
131  cryptoHash.addData((char*)(&aa.mType),sizeof(aa.mType));
132  cryptoHash.addData((char*)(&aa.mId),sizeof(aa.mId));
133  cryptoHash.addData(aa.mName.toUtf8());
134  cryptoHash.addData((char*)(&aa.mValue),sizeof(aa.mValue));
135  }
136  }
137 
139  {
140  // TODO xml parent element
141  for (const AtomicAction& aa : mPinActions)
142  {
143  if (aa.mType != PinActionType::None)
144  xmlOut.writeTextElement("type", PinActionType::toString(aa.mType));
145  if (aa.mId)
146  xmlOut.writeTextElement("id", QString::number(aa.mId));
147  if (!aa.mName.isEmpty())
148  xmlOut.writeTextElement("name", aa.mName);
149  if (aa.mValue)
150  xmlOut.writeTextElement("value", QString::number(aa.mValue));
151  }
152  }
153 
155  {
156  // TODO loop xml parent element
157  while (xmlIn.readNextStartElement())
158  {
160  int id = 0;
161  QString name;
162  int val = 0;
163 
164  if (xmlIn.name() == "type")
166  if (xmlIn.name() == "id")
167  id = xmlIn.readElementText().toInt();
168  if (xmlIn.name() == "name")
169  name = xmlIn.readElementText();
170  if (xmlIn.name() == "value")
171  val = xmlIn.readElementText().toInt();
172  mPinActions.append(AtomicAction(tp,id,name,val));
173  }
174  }
175  PinGroup<ModulePin>* ActionPingroup::getGroup(ModulePin* pin) const
176  {
177  return pin->get_group().first;
178  }
179 
180  PinGroup<ModulePin>* ActionPingroup::getGroup(int grpId) const
181  {
182  PinGroup<ModulePin>* pgroup = mPinGroups.value(grpId);
183  if (pgroup) return pgroup;
184  if (!mParentModule || grpId<=0) return nullptr;
185  return mParentModule->get_pin_group_by_id(grpId);
186  }
187 
188  void ActionPingroup::addUndoAction(PinActionType::Type tp, int id, const QString& name, int value)
189  {
190  ActionPingroup* undo = nullptr;
191  if (mUndoAction)
192  {
193  undo = static_cast<ActionPingroup*>(mUndoAction);
194  undo->mPinActions.append(AtomicAction(tp,id,name,value));
195  }
196  else
197  {
198  undo = new ActionPingroup(tp,id,name,value);
199  undo->setObject(object());
200  }
201  mUndoAction = undo;
202  }
203 
204 
205  void ActionPingroup::prepareUndoAction()
206  {
207  QHash<PinGroup<ModulePin>*,int> remainingPins;
208  for (const AtomicAction& aa : mPinActions)
209  {
210  if (aa.mType != PinActionType::PinAsignToGroup)
211  continue;
212  ModulePin* pin = mParentModule->get_pin_by_id(aa.mId);
213  PinGroup<ModulePin>* pgroup = pin->get_group().first;
214  if (remainingPins.contains(pgroup))
215  remainingPins[pgroup]--;
216  else
217  remainingPins[pgroup] = pgroup->size()-1;
218  }
219 
220  // for groups that will be deleted after pin assign a create action is needed in undo
221  for (auto it = remainingPins.begin(); it != remainingPins.end(); ++it)
222  {
223  if (it.value() > 0) continue;
224  GroupRestore gr(mParentModule,it.key());
225  mGroupRestore.insert(gr.mRow,gr);
226  }
227  }
228 
229  void ActionPingroup::finalizeUndoAction()
230  {
231  QList<AtomicAction> restoreActions;
232  for (auto it = mGroupRestore.begin(); it != mGroupRestore.end(); ++it)
233  {
234  const GroupRestore& gr = it.value();
235  restoreActions.append(AtomicAction(PinActionType::GroupCreate,gr.mId,gr.mName,gr.mStartIndex));
236  restoreActions.append(AtomicAction(PinActionType::GroupMoveToRow,gr.mId,"",gr.mRow));
237  if (gr.mType != PinType::none)
238  restoreActions.append(AtomicAction(PinActionType::GroupTypeChange,gr.mId,"",(int)gr.mType));
239  if (gr.mDirection != PinDirection::none)
240  restoreActions.append(AtomicAction(PinActionType::GroupDirChange,gr.mId,"",(int)gr.mDirection));
241  }
242  if (!restoreActions.isEmpty())
243  {
244  if (mUndoAction)
245  {
246  ActionPingroup* act = static_cast<ActionPingroup*>(mUndoAction);
247  restoreActions += act->mPinActions;
248  act->mPinActions = restoreActions;
249  }
250  else
251  {
252  mUndoAction = new ActionPingroup(restoreActions);
253  }
254  }
255 
256  for (u32 grpId : mGroupToRemove)
257  {
258  if (mUndoAction)
259  {
260  ActionPingroup* act = static_cast<ActionPingroup*>(mUndoAction);
261  act->mPinActions.append(AtomicAction(PinActionType::GroupDelete,grpId));
262  }
263  else
265  }
266 
267  if (mUndoAction) mUndoAction->setObject(object());
268  }
269 
270  int ActionPingroup::pinGroupRow(Module *m, PinGroup<ModulePin>* pgroup)
271  {
272  int inx = 0;
273  for (PinGroup<ModulePin>* testgroup : m->get_pin_groups())
274  {
275  if (testgroup == pgroup) return inx;
276  ++inx;
277  }
278  return -1;
279  }
280 
282  {
283  mPinGroups.clear();
284  mGroupRestore.clear();
285  mPinsMoved.clear();
286  mGroupToRemove.clear();
288  return false;
289 
290  mParentModule = gNetlist->get_module_by_id(mObject.id());
291  if (!mParentModule)
292  return false;
293 
294  prepareUndoAction(); // create pingroups in case we are going to delete some while assigning
295  LayoutLocker llock;
296 
297  for (const AtomicAction& aa : mPinActions)
298  {
299  PinGroup<ModulePin>* pgroup = nullptr;
300  ModulePin* pin = nullptr;
301 
302  if (PinActionType::useExistingGroup(aa.mType))
303  {
304  auto it = mPinGroups.find(aa.mId);
305  if (it == mPinGroups.end())
306  {
307  pgroup = mParentModule->get_pin_group_by_id(aa.mId);
308  if (!pgroup) return false;
309  mPinGroups.insert(aa.mId,pgroup);
310  }
311  else
312  pgroup = it.value();
313  }
314 
315  if (PinActionType::useExistingPin(aa.mType))
316  {
317  pin = mParentModule->get_pin_by_id(aa.mId);
318  }
319 
320  switch (aa.mType)
321  {
323  {
324  int startIndex = aa.mValue;
325  bool ascending = true;
326  if (aa.mValue < 0)
327  {
328  ascending = false;
329  startIndex = -aa.mValue-1;
330  }
331  if (aa.mId > 0)
332  {
333  if (auto res = mParentModule->create_pin_group(aa.mId, aa.mName.toStdString(), {}, PinDirection::none, PinType::none,ascending,startIndex); res.is_ok())
334  pgroup = res.get();
335  else
336  return false;
337  }
338  else
339  {
340  if (auto res = mParentModule->create_pin_group(aa.mName.toStdString(), {}, PinDirection::none, PinType::none,ascending,startIndex); res.is_ok())
341  pgroup = res.get();
342  else
343  return false;
344  }
345  if (pgroup)
346  {
347  mPinGroups[aa.mId] = pgroup;
348  mGroupToRemove.insert(pgroup->get_id());
349  }
350  break;
351  }
353  {
354  int v = pgroup->get_start_index();
355  if (!pgroup->is_ascending()) v = -v-1;
356  u32 id = pgroup->get_id();
357  int ptype = (int) pgroup->get_type();
358  int pdir = (int) pgroup->get_direction();
360  if (!mParentModule->delete_pin_group(pgroup))
361  return false;
362  addUndoAction(PinActionType::GroupCreate,id,name,v);
363  addUndoAction(PinActionType::GroupTypeChange,id,"",ptype);
364  addUndoAction(PinActionType::GroupDirChange,id,"",pdir);
365  break;
366  }
368  {
369  int inx = pinGroupRow(mParentModule,pgroup);
370  if (inx < 0) return false;
371  addUndoAction(PinActionType::GroupMoveToRow,pgroup->get_id(),"",inx);
372  if (!mParentModule->move_pin_group(pgroup,aa.mValue))
373  return false;
374  break;
375  }
377  addUndoAction(PinActionType::GroupRename,pgroup->get_id(),QString::fromStdString(pgroup->get_name()));
378  if (!mParentModule->set_pin_group_name(pgroup,aa.mName.toStdString()))
379  return false;
380  break;
382  addUndoAction(PinActionType::GroupTypeChange,pgroup->get_id(),"",(int)pgroup->get_type());
383  if (!mParentModule->set_pin_group_type(pgroup, (PinType) aa.mValue))
384  return false;
385  break;
387  addUndoAction(PinActionType::GroupDirChange,pgroup->get_id(),"",(int)pgroup->get_direction());
388  if (!mParentModule->set_pin_group_direction(pgroup, (PinDirection) aa.mValue))
389  return false;
390  break;
392  addUndoAction(PinActionType::PinAsignToGroup,aa.mId,"",pin->get_group().first->get_id());
393  addUndoAction(PinActionType::PinMoveToRow,aa.mId,"",pinIndex2Row(pin,pin->get_group().second));
394  mPinsMoved.insert(aa.mId);
395  pgroup = getGroup(aa.mValue);
396  if (!pgroup) return false;
397  if (!mParentModule->assign_pin_to_group(pgroup,pin))
398  {
399  qDebug() << "assign_pin_to_group failed";
400  return false;
401  }
402  // dumpPingroups();
403  break;
405  addUndoAction(PinActionType::PinRename,aa.mId, QString::fromStdString(pin->get_name()));
406  if (!mParentModule->set_pin_name(pin, aa.mName.toStdString()))
407  return false;
408  break;
410  addUndoAction(PinActionType::PinTypeChange,aa.mId,"",(int)pin->get_type());
411  if (!mParentModule->set_pin_type(pin, (PinType) aa.mValue))
412  return false;
413  break;
415  if (!mPinsMoved.contains(aa.mId))
416  addUndoAction(PinActionType::PinMoveToRow,aa.mId,"",pinIndex2Row(pin,pin->get_group().second));
417  pgroup = pin->get_group().first;
418  if (!mParentModule->move_pin_within_group(pgroup,pin,pinRow2Index(pin,aa.mValue)))
419  {
420  qDebug() << "move_pin_within_group failed";
421  return false;
422  }
423  // dumpPingroups();
424  break;
425  default:
426  break;
427  }
428  }
429 
430  finalizeUndoAction();
431 
432  return UserAction::exec();
433  }
434 
436  {
437  ActionPingroup* retval = nullptr;
438  for (u32 pinId : pinIds)
439  {
440  if (retval)
441  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",grpId));
442  else
443  retval = new ActionPingroup(PinActionType::PinAsignToGroup,pinId,"",grpId);
444  if (pinRow >= 0)
445  retval->mPinActions.append(AtomicAction(PinActionType::PinMoveToRow,pinId,"",pinRow++));
446  }
448  return retval;
449  }
450 
452  {
453  QList<u32> pinIds;
454  pinIds << pinId;
455  return addPinsToExistingGroup(m,grpId,pinIds,pinRow);
456  }
457 
459  {
460  static int vid = -9;
462  if (!pinIds.isEmpty())
463  {
464  ModulePin* pin = m->get_pin_by_id(pinIds.first());
465  if (pin)
466  {
467  retval->mPinActions.append(AtomicAction(PinActionType::GroupDirChange,vid,"",(int)pin->get_direction()));
468  retval->mPinActions.append(AtomicAction(PinActionType::GroupTypeChange,vid,"",(int)pin->get_type()));
469  }
470  }
471  for (u32 pinId : pinIds)
472  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",vid));
473 
474  if (grpRow >= 0)
475  retval->mPinActions.append(AtomicAction(PinActionType::GroupMoveToRow,vid,"",grpRow));
477  return retval;
478  }
479 
481  {
482  QList<u32> pinIds;
483  pinIds << pinId;
484  return addPinsToNewGroup(m,name,pinIds, grpRow);
485  }
486 
488  {
489  ActionPingroup* retval = nullptr;
490 
491  PinGroup<ModulePin>* groupToDelete = m->get_pin_group_by_id(grpId);
492  if (!groupToDelete) return retval;
493 
494  QMap<QString,int> existingGroups;
495  for (PinGroup<ModulePin>* pgroup : m->get_pin_groups())
496  existingGroups.insert(QString::fromStdString(pgroup->get_name()),pgroup->get_id());
497 
498  bool doNotDelete = false; // if there is a pin with the same name as the
499  int vid = -1;
500 
501  for (ModulePin* pin : groupToDelete->get_pins())
502  {
503  if (pin->get_name() == groupToDelete->get_name())
504  doNotDelete = true;
505  else
506  {
507  QString pinName = QString::fromStdString(pin->get_name());
508  auto it = existingGroups.find(pinName);
509  if (it == existingGroups.end())
510  {
511  if (retval)
512  retval->mPinActions.append(AtomicAction(PinActionType::GroupCreate,vid,pinName));
513  else
514  retval = new ActionPingroup(PinActionType::GroupCreate,vid,pinName);
515  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),"",vid));
516  --vid;
517  }
518  else
519  {
520  if (retval)
521  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),"",it.value()));
522  else
523  retval = new ActionPingroup(PinActionType::PinAsignToGroup,pin->get_id(),"",it.value());
524  }
525  }
526 
527  }
528 
529  if (!doNotDelete)
530  {
531  if (retval)
532  retval->mPinActions.append(AtomicAction(PinActionType::GroupDelete,groupToDelete->get_id()));
533  else
534  retval = new ActionPingroup(PinActionType::GroupDelete,groupToDelete->get_id());
535  }
536 
538  return retval;
539  }
540 
542  {
543  ActionPingroup* retval = nullptr;
544  QSet<QString> existingGroupNames;
545  for (PinGroup<ModulePin>* pgroup : m->get_pin_groups())
546  existingGroupNames.insert(QString::fromStdString(pgroup->get_name()));
547  int vid = -1;
548  QString basename;
549  for (u32 pinId : pinIds)
550  {
551  ModulePin* pin = m->get_pin_by_id(pinId);
552  if (!pin) return nullptr;
553  int count = 2;
554  QString name = basename = QString::fromStdString(pin->get_name());
555  while (existingGroupNames.contains(name))
556  name = QString("%1_%2").arg(basename).arg(count++);
557  if (retval)
558  retval->mPinActions.append(AtomicAction(PinActionType::GroupCreate,vid,name));
559  else
561  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",vid));
562  --vid;
563  }
565  return retval;
566  }
567 
568  ActionPingroup::GroupRestore::GroupRestore(Module* m, PinGroup<ModulePin>* pgroup)
569  : mId(pgroup->get_id()),
570  mName(QString::fromStdString(pgroup->get_name())),
571  mRow(pinGroupRow(m,pgroup)),
572  mStartIndex(pgroup->get_start_index()),
573  mDirection(pgroup->get_direction()),
574  mType(pgroup->get_type())
575  {
576  if (!pgroup->is_ascending()) mStartIndex = -mStartIndex-1;
577  }
578 }
UserActionFactory for ActionPingroup.
UserAction * newAction() const
static ActionPingroupFactory * sFactory
Pingroup user actions.
static ActionPingroup * addPinToNewGroup(const Module *m, const QString &name, u32 pinId, int grpRow=-1)
static ActionPingroup * deletePinGroup(const Module *m, u32 grpId)
void readFromXml(QXmlStreamReader &xmlIn) override
static ActionPingroup * addPinToExistingGroup(const Module *m, u32 grpId, u32 pinId, int pinRow=-1)
void writeToXml(QXmlStreamWriter &xmlOut) const override
static ActionPingroup * addPinsToExistingGroup(const Module *m, u32 grpId, QList< u32 > pinIds, int pinRow=-1)
ActionPingroup(PinActionType::Type tp=PinActionType::None, int id=0, const QString &name=QString(), int value=0)
void addToHash(QCryptographicHash &cryptoHash) const override
static ActionPingroup * addPinsToNewGroup(const Module *m, const QString &name, QList< u32 > pinIds, int grpRow=-1)
static ActionPingroup * removePinsFromGroup(const Module *m, QList< u32 > pinIds)
bool exec() override
QString tagname() const override
const std::string & get_name() const
Definition: base_pin.h:108
PinType get_type() const
Definition: base_pin.h:148
const std::pair< PinGroup< T > *, i32 > & get_group() const
Definition: base_pin.h:158
PinDirection get_direction() const
Definition: base_pin.h:128
bool move_pin_within_group(PinGroup< ModulePin > *pin_group, ModulePin *pin, u32 new_index)
Definition: module.cpp:1506
bool assign_pin_to_group(PinGroup< ModulePin > *pin_group, ModulePin *pin, bool delete_empty_groups=true)
Definition: module.cpp:1402
ModulePin * get_pin_by_id(const u32 id) const
Definition: module.cpp:983
bool set_pin_group_type(PinGroup< ModulePin > *pin_group, PinType new_type)
Definition: module.cpp:1201
bool set_pin_type(ModulePin *pin, PinType new_type)
Definition: module.cpp:1122
bool delete_pin_group(PinGroup< ModulePin > *pin_group)
Definition: module.cpp:1320
bool move_pin_group(PinGroup< ModulePin > *pin_group, u32 new_index)
Definition: module.cpp:1360
bool set_pin_name(ModulePin *pin, const std::string &new_name, bool force_name=false)
Definition: module.cpp:1068
std::string get_name() const
Definition: module.cpp:87
bool set_pin_group_direction(PinGroup< ModulePin > *pin_group, PinDirection new_direction)
Definition: module.cpp:1224
Result< PinGroup< ModulePin > * > create_pin_group(const u32 id, const std::string &name, const std::vector< ModulePin * > pins={}, PinDirection direction=PinDirection::none, PinType type=PinType::none, bool ascending=true, u32 start_index=0, bool delete_empty_groups=true, bool force_name=false)
Definition: module.cpp:1251
bool set_pin_group_name(PinGroup< ModulePin > *pin_group, const std::string &new_name, bool force_name=false)
Definition: module.cpp:1145
std::vector< PinGroup< ModulePin > * > get_pin_groups(const std::function< bool(PinGroup< ModulePin > *)> &filter=nullptr) const
Definition: module.cpp:962
PinGroup< ModulePin > * get_pin_group_by_id(const u32 id) const
Definition: module.cpp:1034
std::vector< Module * > get_submodules(const std::function< bool(Module *)> &filter=nullptr, bool recursive=false) const
Definition: module.cpp:259
u32 get_id() const
Definition: module.cpp:82
Module * get_top_module() const
Definition: netlist.cpp:608
Module * get_module_by_id(u32 module_id) const
Definition: netlist.cpp:613
static Type fromString(const QString &s)
static QString toString(Type tp)
static bool useExistingPin(Type tp)
static bool useExistingGroup(Type tp)
std::vector< T * > get_pins(const std::function< bool(T *)> &filter=nullptr) const
Definition: pin_group.h:202
i32 get_start_index() const
Definition: pin_group.h:290
u32 get_id() const
Definition: pin_group.h:130
const std::string & get_name() const
Definition: pin_group.h:150
bool is_ascending() const
Definition: pin_group.h:278
PinDirection get_direction() const
Definition: pin_group.h:190
PinType get_type() const
Definition: pin_group.h:170
The UserActionFactory is the abstract base class for registration.
Definition: user_action.h:225
QString tagname() const
Definition: user_action.h:242
The UserAction class is the abstract base class for user interactions.
Definition: user_action.h:57
UserAction * mUndoAction
Definition: user_action.h:186
virtual bool exec()
Definition: user_action.cpp:23
virtual void setObject(const UserActionObject &obj)
Definition: user_action.cpp:32
UserActionObject mObject
Definition: user_action.h:183
The UserActionObject class represents a single object used in UserAction.
UserActionObjectType::ObjectType type() const
PinDirection
Definition: pin_direction.h:36
int pinGroupIndex(const Module *mod, const PinGroup< ModulePin > *pgrp)
PinEvent
Definition: pin_event.h:42
int pinIndex2Row(const ModulePin *pin, int index)
int pinRow2Index(const ModulePin *pin, int row)
void dumpPingroups(Module *m=nullptr)
Netlist * gNetlist
Definition: plugin_gui.cpp:80
PinType
Definition: pin_type.h:36
QString generateGroupName(const Module *mod, const ModulePin *pin)
uint qHash(const LaneIndex &ri)
quint32 u32
bool ascending
std::string name
void addData(const char *data, int length)
QHash::iterator begin()
bool contains(const Key &key) const const
QHash::iterator end()
int size() const const
void append(const T &value)
T & first()
bool isEmpty() const const
T value(int i) const const
QMap::iterator begin()
void clear()
QMap::iterator end()
QMap::iterator find(const Key &key)
QMap::iterator insert(const Key &key, const T &value)
const char * key(int index) const const
void clear()
bool contains(const T &value) const const
QSet::iterator insert(const T &value)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromStdString(const std::string &str)
QString number(int n, int base)
int toInt(bool *ok, int base) const const
QStringRef name() const const
QString readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour)
bool readNextStartElement()
void writeTextElement(const QString &qualifiedName, const QString &text)