diff options
Diffstat (limited to 'src/reflist.h')
-rw-r--r-- | src/reflist.h | 134 |
1 files changed, 90 insertions, 44 deletions
diff --git a/src/reflist.h b/src/reflist.h index d064c58..4030c8b 100644 --- a/src/reflist.h +++ b/src/reflist.h @@ -1,9 +1,6 @@ /****************************************************************************** * - * - * - * - * Copyright (C) 1997-2015 by Dimitri van Heesch. + * Copyright (C) 1997-2020 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby @@ -21,37 +18,49 @@ #include <qintdict.h> #include <qlist.h> -#include "sortdict.h" +#include "util.h" +#include "linkedmap.h" class Definition; +class RefList; /** This struct represents an item in the list of references. */ -struct RefItem +class RefItem { - RefItem() : scope(0) {} - QCString text; //!< text of the item. - QCString listAnchor; //!< anchor in the list + public: + RefItem(int id,RefList *list) : m_id(id), m_list(list) {} - QCString prefix; //!< type prefix for the name - Definition *scope; //!< scope to use for references. - QCString name; //!< name of the entity containing the reference - QCString title; //!< display name of the entity - QCString args; //!< optional arguments for the entity (if function) - //bool written; - QList<RefItem> extraItems; //!< more items belonging to the same entity -}; + void setText (const char *text) { m_text = text; } + void setAnchor(const char *anchor) { m_anchor = anchor; } + void setPrefix(const char *prefix) { m_prefix = prefix; } + void setName (const char *name) { m_name = name; } + void setTitle (const char *title) { m_title = title; } + void setArgs (const char *args) { m_args = args; } + void setGroup (const char *group) { m_group = group; } + void setScope (const Definition *scope) { m_scope = scope; } + + QCString text() const { return m_text; } + QCString anchor() const { return m_anchor; } + QCString prefix() const { return m_prefix; } + QCString name() const { return m_name; } + QCString title() const { return m_title; } + QCString args() const { return m_args; } + QCString group() const { return m_group; } + int id() const { return m_id; } + RefList *list() const { return m_list; } + const Definition *scope() const { return m_scope; } -/** List of items sorted by title */ -class SortedRefItems : public SDict<RefItem> -{ - public: - SortedRefItems(int size=17) : SDict<RefItem>(size) {} - virtual ~SortedRefItems() {} private: - int compareValues(const RefItem *r1,const RefItem *r2) const - { - return qstricmp(r1->title,r2->title); - } + int m_id = 0; //!< unique identifier for this item within its list + RefList *m_list; //!< list owning this item + QCString m_text; //!< text of the item. + QCString m_anchor; //!< anchor in the list + QCString m_prefix; //!< type prefix for the name + QCString m_name; //!< name of the entity containing the reference + QCString m_title; //!< display name of the entity + QCString m_args; //!< optional arguments for the entity (if function) + QCString m_group; //!< group id used to combine item under a single header + const Definition *m_scope = 0; //!< scope to use for references. }; /** List of cross-referenced items @@ -67,31 +76,68 @@ class SortedRefItems : public SDict<RefItem> class RefList { public: - int addRefItem(); - RefItem *getRefItem(int todoItemId); - RefItem *getFirstRefItem(); - RefItem *getNextRefItem(); - QCString listName() const; - QCString fileName() const; - QCString pageTitle() const; - QCString sectionTitle() const; + /*! Create a list of items that are cross referenced with documentation blocks + * @param listName String representing the name of the list. + * @param pageTitle String representing the title of the list page. + * @param secTitle String representing the title of the section. + */ + RefList(const char *listName, const char *pageTitle, const char *secTitle) : + m_listName(listName), m_fileName(convertNameToFile(listName,FALSE,TRUE)), + m_pageTitle(pageTitle), m_secTitle(secTitle) {} + + /*! Adds a new item to the list. + * @returns A unique id for this item. + */ + RefItem *add() + { + m_id++; + std::unique_ptr<RefItem> item = std::make_unique<RefItem>(m_id,this); + RefItem *result = item.get(); + m_entries.push_back(std::move(item)); + m_lookup.insert({m_id,result}); + return result; + } + + /*! Returns an item given it's id that is obtained with addRefItem() + * @param itemId item's identifier. + * @returns A pointer to the todo item's structure. + */ + RefItem *find(int itemId) + { + auto it = m_lookup.find(itemId); + return it!=m_lookup.end() ? it->second : nullptr; + } + + QCString listName() const { return m_listName; } + QCString fileName() const { return m_fileName; } + QCString pageTitle() const { return m_pageTitle; } + QCString sectionTitle() const { return m_secTitle; } - RefList(const char *listName, - const char *pageTitle,const char *secTitle - ); - ~RefList(); - void insertIntoList(const char *key,RefItem *item); void generatePage(); private: - int m_id; + int m_id = 0; QCString m_listName; QCString m_fileName; QCString m_pageTitle; QCString m_secTitle; - SortedRefItems *m_itemList; - QIntDict<RefItem> *m_dict; - QIntDictIterator<RefItem> *m_dictIterator; + std::vector< std::unique_ptr< RefItem > > m_entries; + std::unordered_map< int, RefItem* > m_lookup; +}; + +class RefListManager : public LinkedMap<RefList> +{ + public: + static RefListManager &instance() + { + static RefListManager rlm; + return rlm; + } + + private: + RefListManager() {} + RefListManager(const RefListManager &other) = delete; + RefListManager &operator=(const RefListManager &other) = delete; }; #endif |