362c1f4c3b5ce9e3fce11167a51fbe4cdb2174de
Stefan Schuermans created template class for...

Stefan Schuermans authored 12 years ago

src/noarch/ListTracker_impl.h   1) /* Blinker
Stefan Schuermans update copyright header

Stefan Schuermans authored 5 years ago

src/common/ListTracker_impl.h   2)    Copyright 2011-2019 Stefan Schuermans <stefan@blinkenarea.org>
Stefan Schuermans created template class for...

Stefan Schuermans authored 12 years ago

src/noarch/ListTracker_impl.h   3)    Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
src/noarch/ListTracker_impl.h   4)    a blinkenarea.org project */
src/noarch/ListTracker_impl.h   5) 
Stefan Schuermans namespace for preprocessor...

Stefan Schuermans authored 12 years ago

src/noarch/ListTracker_impl.h   6) #ifndef BLINKER_LISTTRACKER_IMPL_H
src/noarch/ListTracker_impl.h   7) #define BLINKER_LISTTRACKER_IMPL_H
Stefan Schuermans created template class for...

Stefan Schuermans authored 12 years ago

src/noarch/ListTracker_impl.h   8) 
src/noarch/ListTracker_impl.h   9) #include <list>
src/noarch/ListTracker_impl.h  10) #include <string>
src/noarch/ListTracker_impl.h  11) 
src/noarch/ListTracker_impl.h  12) #include "Directory.h"
src/noarch/ListTracker_impl.h  13) #include "File.h"
src/noarch/ListTracker_impl.h  14) #include "ListTracker.h"
src/noarch/ListTracker_impl.h  15) 
src/noarch/ListTracker_impl.h  16) namespace Blinker {
src/noarch/ListTracker_impl.h  17) 
src/noarch/ListTracker_impl.h  18) /* ###################
src/noarch/ListTracker_impl.h  19)    # ListTrackerFiDi #
src/noarch/ListTracker_impl.h  20)    ################### */
src/noarch/ListTracker_impl.h  21) 
src/noarch/ListTracker_impl.h  22) 
src/noarch/ListTracker_impl.h  23) /// internal helper class to achive different behavior for FIDI parameter
src/noarch/ListTracker_impl.h  24) template <typename FIDI>
src/noarch/ListTracker_impl.h  25) class ListTrackerFiDi
src/noarch/ListTracker_impl.h  26) {
src/noarch/ListTracker_impl.h  27) public:
src/noarch/ListTracker_impl.h  28)   static inline Directory::Type type();
src/noarch/ListTracker_impl.h  29)   static inline FIDI get(const Directory &dir, const std::string name);
src/noarch/ListTracker_impl.h  30) };
src/noarch/ListTracker_impl.h  31) 
src/noarch/ListTracker_impl.h  32) template<>
src/noarch/ListTracker_impl.h  33) inline Directory::Type ListTrackerFiDi<File>::type()
src/noarch/ListTracker_impl.h  34) {
src/noarch/ListTracker_impl.h  35)   return Directory::TypeFile;
src/noarch/ListTracker_impl.h  36) }
src/noarch/ListTracker_impl.h  37) 
src/noarch/ListTracker_impl.h  38) template<>
src/noarch/ListTracker_impl.h  39) inline File ListTrackerFiDi<File>::
src/noarch/ListTracker_impl.h  40)   get(const Directory &dir, const std::string name)
src/noarch/ListTracker_impl.h  41) {
src/noarch/ListTracker_impl.h  42)   return dir.getFile(name);
src/noarch/ListTracker_impl.h  43) }
src/noarch/ListTracker_impl.h  44) 
src/noarch/ListTracker_impl.h  45) template<>
src/noarch/ListTracker_impl.h  46) inline Directory::Type ListTrackerFiDi<Directory>::type()
src/noarch/ListTracker_impl.h  47) {
src/noarch/ListTracker_impl.h  48)   return Directory::TypeSubdir;
src/noarch/ListTracker_impl.h  49) }
src/noarch/ListTracker_impl.h  50) 
src/noarch/ListTracker_impl.h  51) template<>
src/noarch/ListTracker_impl.h  52) inline Directory ListTrackerFiDi<Directory>::
src/noarch/ListTracker_impl.h  53)   get(const Directory &dir, const std::string name)
src/noarch/ListTracker_impl.h  54) {
src/noarch/ListTracker_impl.h  55)   return dir.getSubdir(name);
src/noarch/ListTracker_impl.h  56) }
src/noarch/ListTracker_impl.h  57) 
src/noarch/ListTracker_impl.h  58) /* ###############
src/noarch/ListTracker_impl.h  59)    # ListTracker #
src/noarch/ListTracker_impl.h  60)    ############### */
src/noarch/ListTracker_impl.h  61) 
src/noarch/ListTracker_impl.h  62) /**
src/noarch/ListTracker_impl.h  63)  * @brief constructor
src/noarch/ListTracker_impl.h  64)  * @param[in] dir directory containing list and begin tracked
src/noarch/ListTracker_impl.h  65)  * @param[in] parent parent object
src/noarch/ListTracker_impl.h  66)  */
src/noarch/ListTracker_impl.h  67) template<typename PARENT, typename TYPE, typename FIDI>
src/noarch/ListTracker_impl.h  68) ListTracker<PARENT, TYPE, FIDI>::ListTracker(PARENT &parent,
src/noarch/ListTracker_impl.h  69)                                              const Directory &dir):
src/noarch/ListTracker_impl.h  70)   m_parent(parent),
src/noarch/ListTracker_impl.h  71)   m_dir(dir)
src/noarch/ListTracker_impl.h  72) {
src/noarch/ListTracker_impl.h  73) }
src/noarch/ListTracker_impl.h  74) 
src/noarch/ListTracker_impl.h  75) /// destructor
src/noarch/ListTracker_impl.h  76) template<typename PARENT, typename TYPE, typename FIDI>
src/noarch/ListTracker_impl.h  77) ListTracker<PARENT, TYPE, FIDI>::~ListTracker()
src/noarch/ListTracker_impl.h  78) {
src/noarch/ListTracker_impl.h  79)   /* free leftover list entries:
src/noarch/ListTracker_impl.h  80)      Depending on the interaction bet ween the list entry object and
src/noarch/ListTracker_impl.h  81)      the parent, it might be too late to free them, as the parent might
src/noarch/ListTracker_impl.h  82)      already be partly deconstructed and thus might be in an inconsistent
src/noarch/ListTracker_impl.h  83)      state. It's recommended to call clear manually before, so that the
src/noarch/ListTracker_impl.h  84)      following call becomes a no-operation. */
src/noarch/ListTracker_impl.h  85)   clear();
src/noarch/ListTracker_impl.h  86) }
src/noarch/ListTracker_impl.h  87) 
src/noarch/ListTracker_impl.h  88) /// initialize list by reading directory
src/noarch/ListTracker_impl.h  89) template<typename PARENT, typename TYPE, typename FIDI>
src/noarch/ListTracker_impl.h  90) void ListTracker<PARENT, TYPE, FIDI>::init()
src/noarch/ListTracker_impl.h  91) {
src/noarch/ListTracker_impl.h  92)   updateListFull();
src/noarch/ListTracker_impl.h  93) }
src/noarch/ListTracker_impl.h  94) 
src/noarch/ListTracker_impl.h  95) /// clear list
src/noarch/ListTracker_impl.h  96) template<typename PARENT, typename TYPE, typename FIDI>
src/noarch/ListTracker_impl.h  97) void ListTracker<PARENT, TYPE, FIDI>::clear()
src/noarch/ListTracker_impl.h  98) {
src/noarch/ListTracker_impl.h  99)   while (!m_list.empty()) {
src/noarch/ListTracker_impl.h 100)     delete m_list.back().m_pObj;
src/noarch/ListTracker_impl.h 101)     m_list.pop_back();
src/noarch/ListTracker_impl.h 102)   }
src/noarch/ListTracker_impl.h 103) }
src/noarch/ListTracker_impl.h 104) 
src/noarch/ListTracker_impl.h 105) /// check for update of configuration
src/noarch/ListTracker_impl.h 106) template<typename PARENT, typename TYPE, typename FIDI>
src/noarch/ListTracker_impl.h 107) void ListTracker<PARENT, TYPE, FIDI>::updateConfig()
src/noarch/ListTracker_impl.h 108) {
src/noarch/ListTracker_impl.h 109)   // directory modified -> full, otherwise -> light
src/noarch/ListTracker_impl.h 110)   if (m_dir.checkModified())
src/noarch/ListTracker_impl.h 111)     updateListFull();
src/noarch/ListTracker_impl.h 112)   else
src/noarch/ListTracker_impl.h 113)     updateListLight();
src/noarch/ListTracker_impl.h 114) }
src/noarch/ListTracker_impl.h 115) 
src/noarch/ListTracker_impl.h 116) /// light update of list, i.e. check all entries in current list
src/noarch/ListTracker_impl.h 117) template<typename PARENT, typename TYPE, typename FIDI>
src/noarch/ListTracker_impl.h 118) void ListTracker<PARENT, TYPE, FIDI>::updateListLight()
src/noarch/ListTracker_impl.h 119) {
src/noarch/ListTracker_impl.h 120)   typename List::iterator it;
src/noarch/ListTracker_impl.h 121)   for (it = m_list.begin(); it != m_list.end(); ++it)
src/noarch/ListTracker_impl.h 122)     it->m_pObj->updateConfig();
src/noarch/ListTracker_impl.h 123) }
src/noarch/ListTracker_impl.h 124) 
src/noarch/ListTracker_impl.h 125) /// full update of list, i.e. scan files/subdirs in list directory
src/noarch/ListTracker_impl.h 126) template<typename PARENT, typename TYPE, typename FIDI>
src/noarch/ListTracker_impl.h 127) void ListTracker<PARENT, TYPE, FIDI>::updateListFull()
src/noarch/ListTracker_impl.h 128) {
src/noarch/ListTracker_impl.h 129)   // get list of files/subdirs in directory
src/noarch/ListTracker_impl.h 130)   typedef std::list<std::string> FileList;
src/noarch/ListTracker_impl.h 131)   FileList curFiles;
src/noarch/ListTracker_impl.h 132)   m_dir.getEntries(ListTrackerFiDi<FIDI>::type(), curFiles);
src/noarch/ListTracker_impl.h 133) 
src/noarch/ListTracker_impl.h 134)   // walk through current list and file/subdir list simultaneously
src/noarch/ListTracker_impl.h 135)   FileList::const_iterator itFile = curFiles.begin();
src/noarch/ListTracker_impl.h 136)   typename List::iterator  it     = m_list.begin();
src/noarch/ListTracker_impl.h 137)   while (itFile != curFiles.end() || it != m_list.end()) {
src/noarch/ListTracker_impl.h 138) 
src/noarch/ListTracker_impl.h 139)     // new entry inserted
src/noarch/ListTracker_impl.h 140)     if (it == m_list.end() ||
src/noarch/ListTracker_impl.h 141)         (itFile != curFiles.end() && *itFile < it->m_name)) {
src/noarch/ListTracker_impl.h 142)       // create object
src/noarch/ListTracker_impl.h 143)       Entry entry;
src/noarch/ListTracker_impl.h 144)       entry.m_name = *itFile;
src/noarch/ListTracker_impl.h 145)       entry.m_pObj = new TYPE(m_parent, *itFile,
src/noarch/ListTracker_impl.h 146)                               ListTrackerFiDi<FIDI>::get(m_dir, *itFile));
src/noarch/ListTracker_impl.h 147)       if (entry.m_pObj)
src/noarch/ListTracker_impl.h 148)         // insert list entry
src/noarch/ListTracker_impl.h 149)         m_list.insert(it, entry);
src/noarch/ListTracker_impl.h 150)       // advance to next file/subdir
src/noarch/ListTracker_impl.h 151)       ++itFile;
src/noarch/ListTracker_impl.h 152)     }
src/noarch/ListTracker_impl.h 153) 
src/noarch/ListTracker_impl.h 154)     // entry removed
src/noarch/ListTracker_impl.h 155)     else if (itFile == curFiles.end() || *itFile > it->m_name) {
src/noarch/ListTracker_impl.h 156)       // remove entry
src/noarch/ListTracker_impl.h 157)       delete it->m_pObj;
src/noarch/ListTracker_impl.h 158)       it = m_list.erase(it);
src/noarch/ListTracker_impl.h 159)       // do not advance to next file/subdir
src/noarch/ListTracker_impl.h 160)     }
src/noarch/ListTracker_impl.h 161) 
src/noarch/ListTracker_impl.h 162)     // entry stayed in list
src/noarch/ListTracker_impl.h 163)     else {
src/noarch/ListTracker_impl.h 164)       // check for update
src/noarch/ListTracker_impl.h 165)       it->m_pObj->updateConfig();
src/noarch/ListTracker_impl.h 166)       // advance to next file/subdir and next entry
src/noarch/ListTracker_impl.h 167)       ++itFile;
src/noarch/ListTracker_impl.h 168)       ++it;
src/noarch/ListTracker_impl.h 169)     }
src/noarch/ListTracker_impl.h 170) 
src/noarch/ListTracker_impl.h 171)   } // while itFile it
src/noarch/ListTracker_impl.h 172) }
src/noarch/ListTracker_impl.h 173) 
src/noarch/ListTracker_impl.h 174) } // namespace Blinker
src/noarch/ListTracker_impl.h 175) 
Stefan Schuermans namespace for preprocessor...

Stefan Schuermans authored 12 years ago

src/noarch/ListTracker_impl.h 176) #endif // #ifndef BLINKER_LISTTRACKER_IMPL_H