Moving delegate to poly.

This commit is contained in:
Ben Vanik
2014-12-20 08:49:11 -08:00
parent a0eebf8898
commit c1df273600
6 changed files with 31 additions and 61 deletions

View File

@@ -1,80 +0,0 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2013 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef ALLOY_DELEGATE_H_
#define ALLOY_DELEGATE_H_
#include <functional>
#include <mutex>
#include <vector>
namespace alloy {
// TODO(benvanik): go lockfree, and don't hold the lock while emitting.
template <typename T>
class Delegate;
template <typename T>
class Delegate {
public:
typedef std::function<void(T&)> Listener;
void AddListener(Listener const& listener) {
std::lock_guard<std::mutex> guard(lock_);
listeners_.push_back(listener);
}
void RemoveAllListeners() {
std::lock_guard<std::mutex> guard(lock_);
listeners_.clear();
}
void operator()(T& e) {
std::lock_guard<std::mutex> guard(lock_);
for (auto& listener : listeners_) {
listener(e);
}
}
private:
std::mutex lock_;
std::vector<Listener> listeners_;
};
template <>
class Delegate<void> {
public:
typedef std::function<void()> Listener;
void AddListener(Listener const& listener) {
std::lock_guard<std::mutex> guard(lock_);
listeners_.push_back(listener);
}
void RemoveAllListeners() {
std::lock_guard<std::mutex> guard(lock_);
listeners_.clear();
}
void operator()() {
std::lock_guard<std::mutex> guard(lock_);
for (auto& listener : listeners_) {
listener();
}
}
private:
std::mutex lock_;
std::vector<Listener> listeners_;
};
} // namespace alloy
#endif // ALLOY_DELEGATE_H_

View File

@@ -15,7 +15,7 @@
#include <string>
#include <unordered_map>
#include <alloy/delegate.h>
#include <poly/delegate.h>
namespace alloy {
namespace runtime {
@@ -104,7 +104,7 @@ class Debugger {
void OnBreakpointHit(ThreadState* thread_state, Breakpoint* breakpoint);
public:
Delegate<BreakpointHitEvent> breakpoint_hit;
poly::Delegate<BreakpointHitEvent> breakpoint_hit;
private:
Runtime* runtime_;

View File

@@ -6,7 +6,6 @@
'alloy.h',
'arena.cc',
'arena.h',
'delegate.h',
'memory.cc',
'memory.h',
'reset_scope.h',