[DEV] recurtion
This commit is contained in:
parent
3772d04916
commit
9003745811
@ -31,18 +31,18 @@ namespace esignal {
|
|||||||
virtual void disconnect(std::size_t _uid) = 0;
|
virtual void disconnect(std::size_t _uid) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Handle {
|
class Connection {
|
||||||
public:
|
public:
|
||||||
Handle(SignalBase* _sig, std::size_t _id):
|
Connection(SignalBase* _sig, std::size_t _id):
|
||||||
m_signal(_sig), m_uid(_id) {
|
m_signal(_sig), m_uid(_id) {
|
||||||
|
|
||||||
}
|
}
|
||||||
Handle(const Handle&) = delete; // not copyable
|
Connection(const Connection&) = delete; // not copyable
|
||||||
Handle* operator=(const Handle&) = delete; // no copy operator
|
Connection* operator=(const Connection&) = delete; // no copy operator
|
||||||
Handle(Handle&&) = default; // movable
|
Connection(Connection&&) = default; // movable
|
||||||
Handle& operator=(Handle&&) = default; // movable op
|
Connection& operator=(Connection&&) = default; // movable op
|
||||||
|
|
||||||
~Handle() {
|
~Connection() {
|
||||||
if (m_signal == nullptr) {
|
if (m_signal == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -128,20 +128,20 @@ namespace esignal {
|
|||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
template< class ObserverType >
|
template< class ObserverType >
|
||||||
Handle connect(ObserverType&& observer ) {
|
Connection connect(ObserverType&& observer ) {
|
||||||
std::unique_ptr<Executor> executer(new Executor(std::forward<ObserverType>(observer)));
|
std::unique_ptr<Executor> executer(new Executor(std::forward<ObserverType>(observer)));
|
||||||
std::size_t uid = executer->m_uid;
|
std::size_t uid = executer->m_uid;
|
||||||
m_executors.push_back(std::move(executer));
|
m_executors.push_back(std::move(executer));
|
||||||
return Handle(this, uid);
|
return Connection(this, uid);
|
||||||
}
|
}
|
||||||
template<class pointer, class Func, class... Arg>
|
template<class pointer, class Func, class... Arg>
|
||||||
Handle connect(pointer* _class, Func _f, Arg... _arg) {
|
Connection connect(pointer* _class, Func _f, Arg... _arg) {
|
||||||
std::unique_ptr<Executor> executer(new Executor([=]( auto&&... cargs ){
|
std::unique_ptr<Executor> executer(new Executor([=]( auto&&... cargs ){
|
||||||
(*_class.*_f)(cargs..., _arg... );
|
(*_class.*_f)(cargs..., _arg... );
|
||||||
}));
|
}));
|
||||||
std::size_t uid = executer->m_uid;
|
std::size_t uid = executer->m_uid;
|
||||||
m_executors.push_back(std::move(executer));
|
m_executors.push_back(std::move(executer));
|
||||||
return Handle(this, uid);
|
return Connection(this, uid);
|
||||||
}
|
}
|
||||||
template<class pointer, class Func, class... Arg>
|
template<class pointer, class Func, class... Arg>
|
||||||
void connect(const std::shared_ptr<pointer>& _class, Func _f, Arg... _arg) {
|
void connect(const std::shared_ptr<pointer>& _class, Func _f, Arg... _arg) {
|
||||||
@ -154,8 +154,8 @@ namespace esignal {
|
|||||||
template< class... CallArgs>
|
template< class... CallArgs>
|
||||||
void emit( CallArgs&&... args) {
|
void emit( CallArgs&&... args) {
|
||||||
m_callInProgress++;
|
m_callInProgress++;
|
||||||
for(auto& it: m_executors) {
|
for (size_t iii=0; iii < m_executors.size(); ++iii) {
|
||||||
it->emit(args...);
|
m_executors[iii]->emit(args...);
|
||||||
}
|
}
|
||||||
if (m_callInProgress == 1) {
|
if (m_callInProgress == 1) {
|
||||||
auto it = m_executors.begin();
|
auto it = m_executors.begin();
|
||||||
@ -171,9 +171,9 @@ namespace esignal {
|
|||||||
m_callInProgress--;
|
m_callInProgress--;
|
||||||
}
|
}
|
||||||
void disconnect(std::size_t _uid) {
|
void disconnect(std::size_t _uid) {
|
||||||
for (auto &it : m_executors) {
|
for (size_t iii=0; iii < m_executors.size(); ++iii) {
|
||||||
if (it->m_uid == _uid) {
|
if (m_executors[iii]->m_uid == _uid) {
|
||||||
it->m_removed = true;
|
m_executors[iii]->m_removed = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,26 +103,26 @@ TEST(test_signal_arg, checkType) {
|
|||||||
auto display_values_1 = []( int a, float b, char c){
|
auto display_values_1 = []( int a, float b, char c){
|
||||||
std::cout << " 1111 " << a << " " << b << " " << c << " " << std::endl;
|
std::cout << " 1111 " << a << " " << b << " " << c << " " << std::endl;
|
||||||
};
|
};
|
||||||
signal.connect(display_values_1);
|
esignal::Connection h1 = signal.connect(display_values_1);
|
||||||
|
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
auto display_values_2 = []( int a, float b, char c, int w ){
|
auto display_values_2 = []( int a, float b, char c, int w ){
|
||||||
std::cout << " 2222 " << a << " " << b << " " << c << " " << w << std::endl;
|
std::cout << " 2222 " << a << " " << b << " " << c << " " << w << std::endl;
|
||||||
};
|
};
|
||||||
signal.connect( complete_args( display_values_2, 72 ) );
|
esignal::Connection h2 = signal.connect( complete_args( display_values_2, 72 ) );
|
||||||
|
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
TestConnect connectedClass;
|
TestConnect connectedClass;
|
||||||
signal.connect( [&](int a, float b, char c) {
|
esignal::Connection h3 = signal.connect([&](int a, float b, char c) {
|
||||||
connectedClass.display_values_4(a,b,c);}
|
connectedClass.display_values_4(a,b,c);
|
||||||
);
|
});
|
||||||
/*
|
/*
|
||||||
signal.connect( [&](auto && ... _cargs) {
|
signal.connect( [&](auto && ... _cargs) {
|
||||||
connectedClass.display_values_3(_cargs);}
|
connectedClass.display_values_3(_cargs);}
|
||||||
);
|
);
|
||||||
*/
|
*/
|
||||||
signal.connect(&connectedClass, &TestConnect::display_values_4);
|
esignal::Connection h4 = signal.connect(&connectedClass, &TestConnect::display_values_4);
|
||||||
signal.connect(&connectedClass, &TestConnect::display_values_5, "coucou");
|
esignal::Connection h5 = signal.connect(&connectedClass, &TestConnect::display_values_5, "coucou");
|
||||||
|
|
||||||
std::shared_ptr<TestConnectShared> connectedClassShared = std::make_shared<TestConnectShared>();
|
std::shared_ptr<TestConnectShared> connectedClassShared = std::make_shared<TestConnectShared>();
|
||||||
signal.connect(connectedClassShared, &TestConnectShared::display_values_6);
|
signal.connect(connectedClassShared, &TestConnectShared::display_values_6);
|
||||||
@ -132,9 +132,17 @@ TEST(test_signal_arg, checkType) {
|
|||||||
//signal.connect( complete_class(&connectedClass, &TestConnect::display_values_3) );
|
//signal.connect( complete_class(&connectedClass, &TestConnect::display_values_3) );
|
||||||
//signal.connect( TestConnect::display_values_3(&connectedClass) );
|
//signal.connect( TestConnect::display_values_3(&connectedClass) );
|
||||||
|
|
||||||
|
auto display_values_recursive = [&]( int a, float b, char c, int w ){
|
||||||
|
std::cout << " 99999 " << a << " " << b << " " << c << " " << w << std::endl;
|
||||||
|
std::cout << " ----------------------------------" << std::endl;
|
||||||
|
if (a == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
signal.emit(a-1, 2.66, 'l');
|
||||||
|
};
|
||||||
|
esignal::Connection h6 = signal.connect( complete_args( display_values_recursive, 72 ) );
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
|
|
||||||
signal.emit( 42, 2.99, 'k');
|
signal.emit( 5, 2.99, 'k');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user