#include <boost/signals2.hpp>
#include <functional>
#include <string>
-#include <set>
+#include <map>
class Disassembler;
class Function;
+class BasicBlock;
class QString;
+class RenameFunctionEvent;
+
class InformationManager {
public:
+ ~InformationManager();
+
void reset(const std::string& filename);
void save(const QString& filename);
+ void signal_new_function(Function* f);
+ void signal_new_dyn_symbol(const std::string& f)
+ { new_dyn_symbol_signal(f); }
+
boost::signals2::connection
connect_new_function_signal(std::function<void(Function*)> f)
{ return new_function_signal.connect(f); }
- void signal_new_function(Function* f)
- { functions.insert(f); new_function_signal(f); }
-
boost::signals2::connection
connect_new_dyn_symbol_signal(std::function<void(const std::string& name)> f)
{ return new_dyn_symbol_signal.connect(f); }
- void signal_new_dyn_symbol(const std::string& f)
- { new_dyn_symbol_signal(f); }
-
boost::signals2::connection
connect_reset_signal(std::function<void ()> f)
{ return reset_signal.connect(f); }
+ boost::signals2::connection
+ connect_rename_function_signal(std::function<void (RenameFunctionEvent*)> f)
+ { return rename_function_signal.connect(f); }
+
Disassembler* getDisassembler()
{ return disassembler.get(); }
+
+ void dispatch(RenameFunctionEvent* event)
+ { rename_function_signal(event); }
+
+ Function* getFunction(uint64_t address)
+ { return functions[address]; }
+
+ BasicBlock* getBlock(uint64_t address)
+ { return blocks[address]; }
+
private:
boost::signals2::signal<void ()> reset_signal;
boost::signals2::signal<void (Function*)> new_function_signal;
boost::signals2::signal<void (const std::string& name)> new_dyn_symbol_signal;
+ boost::signals2::signal<void (RenameFunctionEvent*)> rename_function_signal;
std::unique_ptr<Disassembler> disassembler;
- std::set<Function*> functions;
+ std::map<uint64_t, Function*> functions;
+ std::map<uint64_t, BasicBlock*> blocks;
};
#endif /* INCLUDE__InformationManager_hxx */