tp_timeconstraint.cpp
Go to the documentation of this file.
1/* tp_timecontraint.cpp -- model of timeconstraints in timed automata */
2
3
4/* Timeplugin for FAU Discrete Event Systems Library (libfaudes)
5
6 Copyright (C) 2006 B Schlein
7 Copyright (C) 2007 Thomas Moor
8 Exclusive copyright is granted to Klaus Schmidt
9
10*/
11
12
13
14#include "tp_timeconstraint.h"
15
16namespace faudes {
17
18
19/********************************************************************
20
21 Implementation of ClockSet
22
23********************************************************************/
24
25
26// std faudes type (cannot do New() with macro)
27FAUDES_TYPE_IMPLEMENTATION_NEWCOPY(Void,ClockSet,NameSet)
28FAUDES_TYPE_IMPLEMENTATION_CAST(Void,ClockSet,NameSet)
29FAUDES_TYPE_IMPLEMENTATION_ASSIGN(Void,ClockSet,NameSet)
30FAUDES_TYPE_IMPLEMENTATION_MOVE(Void,ClockSet,NameSet)
31FAUDES_TYPE_IMPLEMENTATION_EQUAL(Void,ClockSet,NameSet)
32
33// ClockSet(void);
35 // overwrite default static symboltable
36 mpSymbolTable=GlobalClockSymbolTablep();
37 NameSet::Name("Clocks");
38 FD_DC("ClockSet("<<this<<")::ClockSet() with csymtab "<< SymbolTablep());
39}
40
41// ClockSet(clockset)
42ClockSet::ClockSet(const ClockSet& rOtherSet) : NameSet(rOtherSet) {
43 FD_DC("ClockSet(" << this << ")::ClockSet(rOtherSet " << &rOtherSet << ")");
44}
45
46// ClockSet(file);
47ClockSet::ClockSet(const std::string& rFilename, const std::string& rLabel) : NameSet() {
48 // overwrite default static symboltable
50 NameSet::Name("Clocks");
51 // read file
52 NameSet::Read(rFilename,rLabel);
53}
54
55// Clockset::New()
56ClockSet* ClockSet::New(void) const {
57 ClockSet* res = new ClockSet();
59 return res;
60}
61
62// DoCopy()
63void ClockSet::DoCopy(const ClockSet& rSourceSet) {
64 // call base
65 NameSet::DoCopy(rSourceSet);
66}
67
68// DoCopy()
69void ClockSet::DoMove(ClockSet& rSourceSet) {
70 // call base
71 NameSet::DoMove(rSourceSet);
72}
73
74// DoEqual()
75bool ClockSet::DoEqual(const ClockSet& rOtherSet) const {
76 // call base
77 return NameSet::DoEqual(rOtherSet);
78}
79
80
81
82// ClockSet::GlobalClockSymbolTablep
83// (initialize on first use pattern)
85 static SymbolTable fls;
86 return &fls;
87}
88
89
90
91
92
93
94/********************************************************************
95
96 Implementation of ElemConstraint
97
98********************************************************************/
99
100
101// helper (conversion from operatorname to string
103 switch(op){
104 case LessThan: return "LT";
105 case GreaterThan: return "GT";
106 case LessEqual: return "LE";
107 case GreaterEqual: return "GE";
108 }
109 return "Inalid";
110}
111
112
113// Constructor
117
118// Constructor
119ElemConstraint::ElemConstraint(Idx clockindex, Operator op, const Time::Type timeconst) {
120 Set(clockindex,op,timeconst);
121}
122
123
124// Set(clockindex, op, timeconst)
125void ElemConstraint::Set(Idx clockindex, Operator op, const Time::Type timeconst) {
126 mClockIndex = clockindex;
127 mCompOperator = op;
128 mTimeConstant = timeconst;
129}
130
131// Clock(clockindex)
133 mClockIndex=clockindex;
134 return mClockIndex;
135}
136
137// Clock()
139 return mClockIndex;
140}
141
142// CompOperator(newOp)
146
147
148// CompOperator()
152
153
154// TimeConstant(newTimeConst)
156 mTimeConstant = newTimeConst;
157}
158
159// TimeConstant()
163
164// Str() const
165std::string ElemConstraint::Str(void) const {
166 std::stringstream resstream;
167 resstream << "(" << mClockIndex << " "
168 << OperatorName(mCompOperator) << " " << mTimeConstant << ")";
169 std::string result = resstream.str();
170 return result;
171}
172
173// operator==
174bool ElemConstraint::operator== (const ElemConstraint & otherClockConstraint) const {
175 return ( mClockIndex == otherClockConstraint.mClockIndex
176 && mCompOperator == otherClockConstraint.mCompOperator
177 && mTimeConstant == otherClockConstraint.mTimeConstant );
178}
179
180// operator!=
181bool ElemConstraint::operator!= (const ElemConstraint & otherClockConstraint) const {
182 return !(operator==(otherClockConstraint));
183}
184
185// operator <
186bool ElemConstraint::operator < (const ElemConstraint& otherElemConstraint) const {
187 if (mClockIndex < otherElemConstraint.mClockIndex) return true;
188 if (mClockIndex > otherElemConstraint.mClockIndex) return false;
189 if (mCompOperator < otherElemConstraint.mCompOperator) return true;
190 if (mCompOperator > otherElemConstraint.mCompOperator) return false;
191 if (mTimeConstant < otherElemConstraint.mTimeConstant) return true;
192 return false;
193}
194
195
196/********************************************************************
197
198 Implementation of TimeConstraint
199
200********************************************************************/
201
202
203
204// empty constructor
206 FD_DC("TimeConstraint(" << this << ")::TimeConstraint()");
208 mName="TimeConstraint";
209}
210
211// read file constructor
212TimeConstraint::TimeConstraint(const std::string& rFilename, const std::string& rLabel) {
213 FD_DC("TimeConstraint(" << this << ")::TimeConstraint(" << rFilename << ")");
215 Read(rFilename, rLabel);
216}
217
218// constructor
219TimeConstraint::TimeConstraint(const TimeConstraint& rOtherTimeConstraint) {
220 FD_DC("TimeConstraint(" << this << ")::TimeConstraint(other)");
221 mName=rOtherTimeConstraint.mName;
222 mpClockSymbolTable= rOtherTimeConstraint.mpClockSymbolTable;
223 mClockConstraints = rOtherTimeConstraint.ClockConstraints();
224}
225
226
227// Destructor
230
231// ClockSymbolTablep()
235
236// ClockSymbolTablep(pSymTab)
238 if(mClockConstraints.empty()) {
239 mpClockSymbolTable=pSymTab;
240 } else {
241 // TODO: implement reindex
242 FD_ERR("TimeConstraint::SymboltTable(pSymTab): "
243 << "set SymbolTable not implemented!!");
244 abort();
245 }
246}
247
248// Empty()
249bool TimeConstraint::Empty(void) const {
250 return mClockConstraints.empty();
251}
252
253// Size of set of ElemConstraints
255 return (Idx)mClockConstraints.size();
256}
257
258// InsClock()
259Idx TimeConstraint::InsClock(const std::string& rClockName) const {
260 return mpClockSymbolTable->InsEntry(rClockName);
261}
262
263// ClockName(clockindex)
264std::string TimeConstraint::ClockName(Idx clockindex) const {
265 return mpClockSymbolTable->Symbol(clockindex);
266}
267
268// ClockIndex(clockname)
269Idx TimeConstraint::ClockIndex(const std::string& rClockName) const {
270 return mpClockSymbolTable->Index(rClockName);
271}
272
273
274// EStr(ElemConstraint) const
275std::string TimeConstraint::EStr(const ElemConstraint& rElemConstraint) const {
276 std::stringstream resstream;
277 resstream << "(" << ClockName(rElemConstraint.Clock()) << "[" << rElemConstraint.Clock()
278 << "] " << ElemConstraint::OperatorName(rElemConstraint.CompOperator()) << " "
279 << rElemConstraint.TimeConstant() << ")";
280 std::string result = resstream.str();
281 return result;
282}
283
284// Insert(rNewConstr)
286 FD_DC("TimeConstraint(" << this << ")::Insert(" << rNewConstr.Str() << ")");
287 if(rNewConstr.Clock()<=0 || ClockName(rNewConstr.Clock())=="") {
288 std::stringstream errstr;
289 errstr << "Invalid ElemConstraint: \"" << rNewConstr.Str();
290 throw Exception("TimeConstraint::Insert", errstr.str(), 55);
291 }
292 return mClockConstraints.insert(rNewConstr).first;
293}
294
295// Insert(clock, op, timeconst)
297 FD_DC("TimeConstraint(" << this << ")::Insert("
298 << clockindex << " " << ElemConstraint::OperatorName(op) << " " << timeconst << ")");
299 ElemConstraint newconstr(clockindex,op,timeconst);
300 return Insert(newconstr);
301}
302
303
304// Insert(clock, op, timeconst)
306 const std::string clockname,
307 Operator op,
308 const Time::Type timeconst)
309{
310 FD_DC("TimeConstraint(" << this << ")::Insert(\""
311 << clockname << "\" " << ElemConstraint::OperatorName(op) << " " << timeconst << ")");
312 Idx clockindex = InsClock(clockname);
313 return Insert(clockindex,op,timeconst);
314}
315
316// Insert(rNewConstraints)
317void TimeConstraint::Insert(const std::list<ElemConstraint>& rNewConstraints) {
318 FD_DC("TimeConstraint(" << this << ")::Insert(const std::list<ElemConstraint>&)");
319 // HELPERS
320 std::list<ElemConstraint>::const_iterator it;
321 // ALGORITHM
322 for(it = rNewConstraints.begin(); it != rNewConstraints.end(); it++)
323 Insert(*it);
324}
325
326
327// Insert(rOtherTimeConstraint)
328void TimeConstraint::Insert(const TimeConstraint& rOtherTimeConstraint) {
329 FD_DC("TimeConstraint(" << this << ")::Insert(" << rOtherTimeConstraint.ToString() << ")");
330 // HELPERS
331 Iterator it;
332 // ALGORITHM
333 if(mpClockSymbolTable != rOtherTimeConstraint.mpClockSymbolTable) {
334 FD_ERR("TimeConstraint::Insert "
335 << "SymbolTable mismatch aka not implemented!!");
336 abort();
337 }
338 for(it = rOtherTimeConstraint.Begin(); it != rOtherTimeConstraint.End(); it++) {
339 Insert(*it);
340 }
341}
342
343// ClockConstraints()
344std::set<ElemConstraint> TimeConstraint::ClockConstraints(void) const {
345 return mClockConstraints;
346}
347
348
349// EraseByClock(clock)
351 FD_DC("TimeConstraint(" << this << ")::EraseByClock(" << clock << ") const");
352 // HELPERS
353 iterator lit,uit;
354
355 // ALGORITHM
358
359 if(lit==mClockConstraints.end())
360 return false;
361
362 mClockConstraints.erase(lit,uit);
363 return true;
364}
365
366
367// Erase(it)
369 FD_DC("TimeConstraint(" << this << ")::Erase(" << it->Str() << ") const");
370 if(it==End()) return it;
371 iterator del= it; //cit
372 it++;
373 mClockConstraints.erase(del);
374 return it;
375}
376
377
378// Erase(rElemConstr)
379bool TimeConstraint::Erase(const ElemConstraint& rElemConstr) {
380 FD_DC("TimeConstraint(" << this << ")::Erase(" << rElemConstr.Str() << ") const");
381 // HELPERS
382 iterator it;
383 // ALGORITHM
384 it = mClockConstraints.find(rElemConstr);
385 if(it == End()) return false;
386 mClockConstraints.erase(it);
387 return true;
388}
389
390// Erase(clock, op, timeconst)
391bool TimeConstraint::Erase(Idx clockindex, Operator op, const Time::Type timeconst) {
392 FD_DC("TimeConstraint(" << this << ")::Erase("
393 << clockindex << " " << ElemConstraint::OperatorName(op) << " " << timeconst << ")");
394 ElemConstraint newconstr(clockindex,op,timeconst);
395 return Erase(newconstr);
396}
397
398
399// Erase(clock, op, timeconst)
400bool TimeConstraint::Erase(const std::string& clockname, Operator op, const Time::Type timeconst)
401{
402 FD_DC("TimeConstraint(" << this << ")::Erase(\""
403 << clockname << "\" " << ElemConstraint::OperatorName(op) << " " << timeconst << ")");
404 Idx clockindex = ClockIndex(clockname);
405 return Erase(clockindex,op,timeconst);
406}
407
408// Exists(rElemConstr)
409bool TimeConstraint::Exists(const ElemConstraint& rElemConstr) const {
410 FD_DC("TimeConstraint(" << this << ")::ExistsElConstr(" << rElemConstr.Str() << ") const");
411 // HELPERS
412 Iterator it;
413 // ALGORITHM
414 it = mClockConstraints.find(rElemConstr);
415 return (it != End()) ;
416}
417
418
419// Deletes all ElemConstraints
421 FD_DC("TimeConstraint(" << this << ")::Clear() const");
422 mClockConstraints.clear();
423}
424
425
426
427// Iterator Begin() const
431
432
433// iterator End() const
437
438// reverse iterator RBegin()
442
443// reverse iterator REnd() const
447
448// iterator Begin(clock) const
452
453// iterator End(clock) const
457
458// returns ClockSet filled with clocks used by ElemConstraints
460 FD_DC("TimeConstraint(" << this << ")::ActiveClocks() const");
461 //Helpers
462 ClockSet result;
464 Iterator it;
465 // Algorithm
466 for(it = Begin(); it != End(); it++)
467 result.Insert(it->Clock());
468 return result;
469}
470
471// valid timeinterval for given clock
472TimeInterval TimeConstraint::Interval(const std::string& clockname) const{
473 Idx clockindex = ClockIndex(clockname);
474 return Interval(clockindex);
475}
476
477// valid timeinterval for given clock
479 FD_DC("TimeConstraint(" << this << ")::Interval(" << clockindex <<") const");
480 TimeInterval res;
481 TimeInterval tint;
482 Iterator it;
483 for(it = Begin(clockindex); it != End(clockindex); it++) {
484 FD_DC("TimeConstraint(" << this << ")::Interval: elemconstraint: " << it->Str());
485 tint.SetFull();
486 if(it->CompOperator() == ElemConstraint::LessThan) {
487 tint.UB(it->TimeConstant());
488 tint.UBincl(false);
489 }
490 if(it->CompOperator() == ElemConstraint::LessEqual) {
491 tint.UB(it->TimeConstant());
492 tint.UBincl(true);
493 }
494 if(it->CompOperator() == ElemConstraint::GreaterThan) {
495 tint.LB(it->TimeConstant());
496 tint.LBincl(false);
497 }
498 if(it->CompOperator() == ElemConstraint::GreaterEqual) {
499 tint.LB(it->TimeConstant());
500 tint.LBincl(true);
501 }
502 FD_DC("TimeConstraint(" << this << ")::Interval: interval: " << tint.Str());
503 res.Intersect(tint);
504 }
505 return res;
506}
507
508
509// set valid timeinterval for given clock
510void TimeConstraint::Interval(const std::string& clockname, const TimeInterval& rInterval) {
511 Idx clockindex = InsClock(clockname);
512 Interval(clockindex,rInterval);
513}
514
515// set valid timeinterval for given clock
516void TimeConstraint::Interval(Idx clockindex, const TimeInterval& rInterval) {
517 FD_DC("TimeConstraint(" << this << ")::Interval(" << clockindex <<", " << rInterval.Str() << ") ");
518 EraseByClock(clockindex);
519 if(rInterval.LBinf()==false) {
520 ElemConstraint newconstraint;
521 newconstraint.Clock(clockindex);
522 if(rInterval.LBincl())
524 else
526 newconstraint.TimeConstant(rInterval.LB());
527 Insert(newconstraint);
528 }
529 if(rInterval.UBinf()==false) {
530 ElemConstraint newconstraint;
531 newconstraint.Clock(clockindex);
532 if(rInterval.UBincl())
534 else
536 newconstraint.TimeConstant(rInterval.UB());
537 Insert(newconstraint);
538 }
539}
540
541
542// Minimize()
544 ClockSet aclocks=ActiveClocks();
545 ClockSet::Iterator cit;
546 for(cit=aclocks.Begin(); cit != aclocks.End(); cit++) {
547 TimeInterval tint=Interval(*cit);
548 Interval(*cit, tint);
549 }
550}
551
552// operator==
553bool TimeConstraint::operator== (const TimeConstraint & rOther) const {
554 ClockSet aclocks=ActiveClocks();
555 aclocks.InsertSet(rOther.ActiveClocks());
556 ClockSet::Iterator cit;
557 for(cit=aclocks.Begin(); cit != aclocks.End(); cit++) {
558 TimeInterval tint=Interval(*cit);
559 if(rOther.Interval(*cit)!=tint) return false;
560 }
561 return true;
562}
563
564// operator!=
565bool TimeConstraint::operator!= (const TimeConstraint & rOther) const {
566 return !(operator==(rOther));
567}
568
569
570// Write()
571void TimeConstraint::Write(void) const {
573 Write(tw);
574}
575
576// Write(rFilename, rLabel, openmode)
577void TimeConstraint::Write(const std::string& rFilename, const std::string& rLabel,
578 std::ios::openmode openmode) const {
579 try {
580 TokenWriter tw(rFilename, openmode);
581 Write(tw, rLabel);
582 }
583 catch (std::ios::failure&) {
584 std::stringstream errstr;
585 errstr << "Exception opening/writing file \"" << rFilename << "\"";
586 throw Exception("TimeConstraint::Write", errstr.str(), 2);
587 }
588}
589
590// Write(tw)
592 Write(tw, Name());
593}
594
595
596// Write(tw, rLabel)
597void TimeConstraint::Write(TokenWriter& tw, const std::string& rLabel) const {
598 Token token;
599 Iterator it;
600 int oldcolumns = tw.Columns();
601 tw.Columns(3);
602 tw.WriteBegin(rLabel);
603 for (it = Begin(); it != End(); ++it) {
604 // 1. clock
605 if(ClockName(it->Clock()) != "") {
606 token.SetString(ClockName(it->Clock()));
607 tw << token;
608 } else {
609 token.SetInteger(it->Clock());
610 tw << token;
611 }
612 // 2. operator
613 token.SetString(ElemConstraint::OperatorName(it->CompOperator()));
614 tw << token;
615 // 3. timeconst
616 token.SetFloat((Float) it->TimeConstant());
617 tw << token;
618 }
619 tw.WriteEnd(rLabel);
620 tw.Columns(oldcolumns);
621}
622
623
624// ToString()
625std::string TimeConstraint::ToString(void) const {
627 Write(tw);
628 return tw.Str();
629}
630
631
632// DWrite()
633void TimeConstraint::DWrite(void) const {
635 DWrite(tw);
636}
637
638// DWrite(tw)
640 Token token;
641 Iterator it;
642 tw.WriteBegin(Name());
643 for (it = Begin(); it != End(); ++it) {
644 tw << EStr(*it);
645 }
646 tw.WriteEnd(Name());
647}
648
649// Read(rFilename, rLabel)
650void TimeConstraint::Read(const std::string& rFilename, const std::string& rLabel) {
651 TokenReader tr(rFilename);
652 Read(tr,rLabel);
653}
654
655// Read(rTr, rLabel)
656void TimeConstraint::Read(TokenReader& rTr, const std::string& rLabel) {
657 Clear();
658 Name(rLabel);
659 rTr.ReadBegin(rLabel);
660
661 std::string clockname;
662 Time::Type timeconst;
664 Token token;
665 while(rTr.Peek(token)) {
666 // 0. check for end
667 if (token.Type() == Token::End) {
668 break;
669 }
670 // 1. read clock
671 rTr >> token;
672 if (token.Type() != Token::String) {
673 std::stringstream errstr;
674 errstr << "Invalid clock" << rTr.FileLine();
675 throw Exception("TimeConstraint::Read", errstr.str(), 56);
676 }
677 clockname=token.StringValue();
678 // 2. read operator
679 rTr >> token;
680 if (token.Type() != Token::String) {
681 std::stringstream errstr;
682 errstr << "Invalid operator" << rTr.FileLine();
683 throw Exception("TimeConstraint::Read", errstr.str(), 56);
684 }
685 if(token.StringValue() == "LE") {
687 } else if(token.StringValue() == "GE") {
689 } else if(token.StringValue() == "LT") {
691 } else if(token.StringValue() == "GT") {
693 } else {
694 std::stringstream errstr;
695 errstr << "Invalid operator value " << rTr.FileLine();
696 throw Exception("TimedTransSet::ReadTimeConstraint", errstr.str(), 56);
697 }
698 // 3. read timeconst
699 rTr >> token;
700 if (!token.IsFloat()) {
701 std::stringstream errstr;
702 errstr << "Invalid timeconstant" << rTr.FileLine();
703 throw Exception("TimeConstraint::Read", errstr.str(), 56);
704 }
705 timeconst=(Time::Type) token.FloatValue();
706 // 4. set constraint
707 Insert(clockname,compop,timeconst);
708 } // while not end
709 rTr.ReadEnd(rLabel);
710}
711
712
713// End Implementation of TimeConstraint
714
715
716
717} // namespace faudes
#define FD_DC(message)
#define FD_ERR(message)
#define FAUDES_TYPE_IMPLEMENTATION_MOVE(ftype, ctype, cbase)
Definition cfl_types.h:959
#define FAUDES_TYPE_IMPLEMENTATION_EQUAL(ftype, ctype, cbase)
Definition cfl_types.h:967
#define FAUDES_TYPE_IMPLEMENTATION_CAST(ftype, ctype, cbase)
Definition cfl_types.h:948
#define FAUDES_TYPE_IMPLEMENTATION_ASSIGN(ftype, ctype, cbase)
Definition cfl_types.h:951
#define FAUDES_TYPE_IMPLEMENTATION_NEWCOPY(ftype, ctype, cbase)
Definition cfl_types.h:946
virtual bool DoEqual(const ClockSet &rOtherSet) const
virtual void DoCopy(const ClockSet &rSourceSet)
static SymbolTable * GlobalClockSymbolTablep(void)
virtual void DoMove(ClockSet &rSourceSet)
bool operator<(const ElemConstraint &otherElemConstraint) const
Operator CompOperator(void) const
bool operator==(const ElemConstraint &otherElemConstraint) const
Time::Type TimeConstant(void) const
bool operator!=(const ElemConstraint &otherElemConstraint) const
void Set(Idx clockindex, Operator op, Time::Type timeconst)
std::string Str(void) const
void TimeConstant(Time::Type newTimeConst)
static std::string OperatorName(Operator op)
void CompOperator(Operator newOp)
void DoCopy(const NameSet &rSourceSet)
virtual void InsertSet(const NameSet &rOtherSet)
bool DoEqual(const NameSet &rOtherSet) const
SymbolTable * SymbolTablep(void) const
bool Insert(const Idx &rIndex)
void DoMove(NameSet &rSourceSet)
SymbolTable * mpSymbolTable
std::string Symbol(Idx index) const
Idx InsEntry(Idx index, const std::string &rName)
Idx Index(const std::string &rName) const
std::set< ElemConstraint > ClockConstraints(void) const
Idx InsClock(const std::string &rClockName) const
std::set< ElemConstraint >::const_iterator Iterator
Iterator Erase(Iterator it)
std::string ToString(void) const
bool Exists(const ElemConstraint &rElemConstr) const
Iterator End(void) const
std::string ClockName(Idx clockindex) const
std::string EStr(const ElemConstraint &rElemConstr) const
std::set< ElemConstraint > mClockConstraints
void Read(const std::string &rFileName, const std::string &rLabel="TimeConstraint")
RIterator RBegin(void) const
TimeInterval Interval(Idx clockindex) const
bool operator==(const TimeConstraint &rOther) const
bool operator!=(const TimeConstraint &rOther) const
std::set< ElemConstraint >::const_reverse_iterator RIterator
Idx ClockIndex(const std::string &rClockName) const
RIterator REnd(void) const
Iterator Begin(void) const
std::string Name(void) const
std::set< ElemConstraint >::iterator iterator
Iterator Insert(const ElemConstraint &rElemConstr)
ClockSet ActiveClocks(void) const
SymbolTable * ClockSymbolTablep(void) const
void LB(Time::Type time)
bool UBinf(void) const
std::string Str(void) const
void UBincl(bool incl)
void LBincl(bool incl)
void UB(Time::Type time)
bool LBinf(void) const
void Intersect(const TimeInterval &rOtherInterval)
std::string FileLine(void) const
void ReadEnd(const std::string &rLabel)
void ReadBegin(const std::string &rLabel)
bool Peek(Token &token)
std::string Str(void)
void WriteEnd(const std::string &rLabel)
int Columns(void) const
void WriteBegin(const std::string &rLabel)
void SetInteger(const Int number)
@ End
<\label> (end of section)
Definition cfl_token.h:85
@ String
any string, space separated or quoted, must start with a letter
Definition cfl_token.h:86
void SetString(const std::string &rName)
Definition cfl_token.cpp:85
void SetFloat(const faudes::Float number)
TokenType Type(void) const
void Read(const std::string &rFileName, const std::string &rLabel="", const Type *pContext=0)
virtual const std::string & Name(void) const
virtual Type * New(void) const
Definition cfl_types.cpp:54
Iterator End(void) const
Iterator Begin(void) const
uint32_t Idx
double Float

libFAUDES 2.34e --- 2026.03.16 --- c++ api documentaion by doxygen