113 return p->reqPageDef;
136 if (
p->reqPageDef==
nullptr)
166 p->reqPageDef->setRefItems(e->
sli);
172 return !
p->requirements.empty();
178 for (
const auto &req :
p->requirements)
180 result.push_back(req.get());
187 AUTO_TRACE(
"#requirements={}",
p->requirements.size());
188 if (!
Config_getBool(GENERATE_REQUIREMENTS) ||
p->requirements.empty())
return;
189 std::vector<const SectionInfo*> anchors;
190 std::stable_sort(
p->requirements.begin(),
p->requirements.end(),
191 [](
const auto &left,
const auto &right) { return dstricmp(left->id(),right->id()) < 0; });
192 DString doc =
"<table class=\"doxtable reqlist\">";
198 using RequirementPtrVector = std::vector<const Requirement*>;
199 RequirementPtrVector missingSatisfiedRef, missingVerifiedRef;
200 for (
const auto &req :
p->requirements)
204 anchors.push_back(si);
206 doc +=
"<tr><td valign=\"top\">";
207 doc +=
" \\ifile \""+req->file()+
"\" \\iline "+
DString().
setNum(req->line())+
" ";
211 doc +=
"<span class=\"req_id\">";
212 if (
DString tagFile = req->getTagFile(); !tagFile.
empty())
217 doc +=
"\">"+req->id()+
"</a>";
225 doc +=
"<div class=\"req_title\">"+req->title()+
"</div>";
226 doc +=
"<p/><div class=\"req_docs\">";
228 req->sortReferences();
231 DString symName = sym->qualifiedName();
239 int numSatisfiedBy =
static_cast<int>(req->satisfiedBy().size());
240 if (numSatisfiedBy>0)
242 doc +=
"<p><div class=\"satisfiedby\">";
246 [&symToString, &refs = req->satisfiedBy()](
size_t entryIndex) {
247 return symToString(refs[entryIndex]);
253 missingSatisfiedRef.push_back(req.get());
255 int numVerifiedBy =
static_cast<int>(req->verifiedBy().size());
258 doc +=
"<p><div class=\"verifiedby\">";
262 [&symToString, &refs = req->verifiedBy()](
size_t entryIndex) {
263 return symToString(refs[entryIndex]);
269 missingVerifiedRef.push_back(req.get());
271 doc +=
"\n</div></td></tr>\n";
276 doc +=
" \\ifile \"requirements\" \\iline 1\n";
278 auto writeMissingRef = [&doc,&anchors](
const RequirementPtrVector &reqs,
285 anchors.push_back(si);
286 doc +=
"\\htmlonly <div class=\"missing_";
288 doc +=
"\">\\endhtmlonly\n";
289 doc +=
DString(
"@section missing_")+label+
" "+section+
"\n"+text+
"\n";
290 doc +=
"\\htmlonly </div>\\endhtmlonly\n";
296 int numMissingSatisfied =
static_cast<int>(missingSatisfiedRef.size());
297 if ((traceInfo==REQ_TRACEABILITY_INFO_t::YES || traceInfo==REQ_TRACEABILITY_INFO_t::UNSATISFIED_ONLY) && numMissingSatisfied>0)
299 writeMissingRef(missingSatisfiedRef,
305 [&missingSatisfiedRef](
size_t entryIndex) {
306 DString id = missingSatisfiedRef[entryIndex]->id();
307 return
"@ref "+id +
" \""+id+
"\"";
312 int numMissingVerified =
static_cast<int>(missingVerifiedRef.size());
313 if ((traceInfo==REQ_TRACEABILITY_INFO_t::YES || traceInfo==REQ_TRACEABILITY_INFO_t::UNVERIFIED_ONLY) && numMissingVerified>0)
315 writeMissingRef(missingVerifiedRef,
321 [&missingVerifiedRef](
size_t entryIndex) {
322 DString id = missingVerifiedRef[entryIndex]->id();
323 return
"@ref "+id +
" \""+id+
"\"";
328 p->reqPageDef->setDocumentation(doc,
"requirements",1,
false);
329 p->reqPageDef->addSectionsToDefinition(anchors);
334 return p->requirements.find(reqId);
353 warn(ref.file(),ref.line(),
"Reference to unknown requirement '{}' found",ref.reqId());
372 else if (!req->title().empty())
375 title += req->title();
393 if (!
p->requirements.empty())
395 for (
const auto &req :
p->requirements)
397 tagFile <<
" <compound kind=\"requirement\">\n";
398 tagFile <<
" <id>" << req->id() <<
"</id>\n";
399 tagFile <<
" <title>" <<
convertToXML(req->title()) <<
"</title>\n";
400 DString fn = req->getOutputFileBase();
402 tagFile <<
" <filename>" << fn <<
"</filename>\n";
403 tagFile <<
" </compound>\n";
413 std::stable_sort(uniqueRefs.begin(),uniqueRefs.end(),
414 [](
const auto &left,
const auto &right)
415 { return left.reqId()< right.reqId() ||
416 (left.reqId()==right.reqId() &&
417 dstricmp(left.title(),right.title())<0);
421 auto last = std::unique(uniqueRefs.begin(),uniqueRefs.end(),
422 [](
const auto &left,
const auto &right)
423 { return left.reqId()==right.reqId() &&
424 dstricmp(left.title(),right.title())==0;
428 uniqueRefs.erase(last, uniqueRefs.end());
433 inputReqRefs.begin(),
435 std::back_inserter(satisfiesRefs),
436 std::back_inserter(verifiesRefs),
437 [](
const auto &ref) { return ref.type()==RequirementRefType::Satisfies; }
441 makeUnique(satisfiesRefs);
442 makeUnique(verifiesRefs);
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
DString & setNum(short n)
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString & prepend(const char *s)
void reserve(size_t size)
Reserve space for size bytes without changing the string contents.
const std::string & str() const
The common base class of all entity definitions found in the sources.
virtual const DString & name() const =0
virtual const RequirementRefs & requirementReferences() const =0
virtual DString qualifiedName() const =0
Represents an unstructured piece of information, about an entity found in the sources.
const TagInfo * tagInfo() const
DString fileName
file this entry was extracted from
DString doc
documentation block (partly parsed)
DString brief
brief description (doc block)
int startLine
start line of entry in the source
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
Container class representing a vector of objects with keys.
A model of a class/file/namespace member symbol.
virtual bool isObjCMethod() const =0
virtual bool isFunctionOrSignalSlot() const =0
Class representing a list of output generators that are written to in parallel.
void writeObjectLink(const DString &ref, const DString &file, const DString &anchor, const DString &name)
void docify(const DString &s)
A model of a page symbol.
std::vector< const Definition * > DefinitionVector
LinkedMap< Requirement > requirements
static RequirementManager & instance()
std::unique_ptr< Private > p
bool hasRequirements() const
const RequirementIntf * find(const DString &reqId) const
void writeTagFile(TextStream &tagFile)
void writeRef(OutputList &ol, const RequirementRef &ref)
void addRequirement(Entry *e)
const PageDef * requirementsPage() const
void addRequirementRefsForSymbol(const Definition *symbol)
RequirementIntfList requirements() const
Class to hold requirement reference information.
class that provide information about a section.
singleton class that owns the list of all sections
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Anchor
static constexpr int Section
static constexpr int Requirement
Text streaming class that buffers data.
virtual DString trUnsatisfiedRequirements()=0
virtual DString trRequirements()=0
virtual DString trRequirementID()=0
virtual DString trUnverifiedRequirementsText(bool singular, const DString &list)=0
virtual DString trSatisfiedBy(const DString &list)=0
virtual DString trUnsatisfiedRequirementsText(bool singular, const DString &list)=0
virtual DString trVerifiedBy(const DString &list)=0
virtual DString trWriteList(int numEntries)=0
virtual DString trUnverifiedRequirements()=0
#define Config_getBool(name)
#define Config_getEnum(name)
#define AUTO_TRACE_ADD(...)
DString parseCommentAsText(const Definition *scope, const MemberDef *md, const DString &doc, const DString &fileName, int lineNr)
int dstricmp_sort(const char *str1, const char *str2)
Translator * theTranslator
MemberDef * toMemberDef(Definition *d)
#define warn(file, line, fmt,...)
PageDef * addRelatedPage(const DString &name, const DString &ptitle, const DString &doc, const DString &fileName, int docLine, int startLine, const RefItemVector &sli, GroupDef *gd, const TagInfo *tagInfo, bool xref, SrcLangExt lang)
void splitRequirementRefs(const RequirementRefs &inputReqRefs, RequirementRefs &satisfiesRefs, RequirementRefs &verifiesRefs)
std::vector< const RequirementIntf * > RequirementIntfList
std::vector< RequirementRef > RequirementRefs
List of requirement references.
Requirement(const DString &id_, const DString &file_, int line_, const DString &title_, const DString &doc_, const DString &tagFile_, const DString &extPage_)
DString getTagFile() const override
const DefinitionVector & satisfiedBy() const override
void addSatisfiedBy(const Definition *def)
DString getExtPage() const override
void addVerifiedBy(const Definition *def)
int line() const override
DString file() const override
DString doc() const override
DString id() const override
DefinitionVector m_verifiedBy
DString title() const override
const DefinitionVector & verifiedBy() const override
DString getOutputFileBase() const override
DefinitionVector m_satisfiedBy
void addHtmlExtensionIfMissing(DString &fName)
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
DString createHtmlUrl(const DString &relPath, const DString &ref, bool isLocalFile, const DString &targetFileName, const DString &anchor)
void writeMarkerList(OutputList &ol, const std::string &markerText, size_t numMarkers, std::function< void(size_t)> replaceFunc)
A bunch of utility functions.