From 41130cb61317077df465b0a43abc1f59d61fe46e Mon Sep 17 00:00:00 2001 From: Matthew Cline Date: Sun, 24 Jul 2011 21:24:34 -0700 Subject: [PATCH] ClassNameCheck tracks class names used Each time the ClassNameCheck constructor is called it adds to the list of class names given to it, which can later be retrieved by a class static method. --- library/Core.cpp | 36 ++++++++++++++++++++++++++++++++ library/include/dfhack/Process.h | 22 +++++++++---------- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/library/Core.cpp b/library/Core.cpp index 33ee910d4..3b4b03785 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -567,6 +567,42 @@ int Core::SDL_Event(SDL::Event* ev, int orig_return) // do stuff with the events... } +//////////////// +// ClassNamCheck +//////////////// + +// Since there is no Process.cpp, put ClassNamCheck stuff in Core.cpp + +static std::set known_class_names; +static std::map known_vptrs; + +ClassNameCheck::ClassNameCheck(std::string _name) : name(_name), vptr(0) +{ + known_class_names.insert(name); +} + +ClassNameCheck &ClassNameCheck::operator= (const ClassNameCheck &b) +{ + name = b.name; vptr = b.vptr; return *this; +} + +bool ClassNameCheck::operator() (Process *p, void * ptr) const { + if (vptr == 0 && p->readClassName(ptr) == name) + { + vptr = ptr; + known_vptrs[name] = ptr; + } + return (vptr && vptr == ptr); +} + +void ClassNameCheck::getKnownClassNames(std::vector &names) +{ + std::set::iterator it = known_class_names.begin(); + + for (; it != known_class_names.end(); it++) + names.push_back(*it); +} + /******************************************************************************* M O D U L E S *******************************************************************************/ diff --git a/library/include/dfhack/Process.h b/library/include/dfhack/Process.h index 75b0edc86..d2ca7e355 100644 --- a/library/include/dfhack/Process.h +++ b/library/include/dfhack/Process.h @@ -282,18 +282,18 @@ namespace DFHack { std::string name; mutable void * vptr; + public: - ClassNameCheck() : vptr(0) {}; - ClassNameCheck(std::string _name) : name(_name), vptr(0) {}; - ClassNameCheck &operator= (const ClassNameCheck &b) - { - name = b.name; vptr = b.vptr; return *this; - } - bool operator() (Process *p, void * ptr) const { - if (vptr == 0 && p->readClassName(ptr) == name) - vptr = ptr; - return (vptr && vptr == ptr); - }; + ClassNameCheck() : vptr(0) {} + ClassNameCheck(std::string _name); + ClassNameCheck &operator= (const ClassNameCheck &b); + + // Is the class name of the given virtual table pointer the same as the + // name for thei ClassNameCheck object? + bool operator() (Process *p, void * ptr) const; + + // Get list of names given to ClassNameCheck constructors. + static void getKnownClassNames(std::vector &names); }; } #endif