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)
|