1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#ifndef UDBTUI_UDBCPP_HPP
#define UDBTUI_UDBCPP_HPP

/*
 *  udb.h is the C interface used by the ulm to send notifications
 *
 *  udb_cpp.hpp provides an interface for C++ listeners
 *
 */

#include <cstddef>
#include <cstdint>
#include <functional>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>

#include "../ulm2/ulm.h"

//
// C++ only part
//

struct RegMsg
{
    std::size_t id;
    enum UdbMod udbMod;
};

extern int udb_activeMsg;
extern int udb_lastMsg;
extern std::unordered_map<std::size_t, enum UdbMod> udb_reg[];
extern std::unordered_map<std::uint64_t, enum UdbMod> udb_mem[];
extern std::string udb_out;
extern std::string udb_in;
extern bool udb_waitingForInput;
extern bool udb_eof;
extern std::unordered_map<std::uint64_t,std::uint64_t> udb_breakpoint;

extern std::unordered_map<std::unique_ptr<std::function<void()>>, void *>
  udb_listener;

template<typename Listener, typename Method>
void
udb_addCallback(Listener *listener, Method &&method)
{
    auto fn =
      std::make_unique<std::function<void()>>(std::bind(method, listener));
    udb_listener[std::move(fn)] = listener;
}

template<typename Listener>
void
udb_delListener(Listener *listener)
{
    // delete all callback methods from listener
    for (auto it = udb_listener.begin(); it != udb_listener.end();) {
        if (it->second == listener) {
            it = udb_listener.erase(it);
        } else {
            ++it;
        }
    }
}

std::uint64_t udb_getNumCycles();
std::uint64_t udb_getIP();
std::uint64_t udb_getPrevIP();
void udb_step();
void udb_run(std::size_t maxCycles = 0);

#endif // UDBTUI_UDBCPP_HPP