/*
* File: main.cpp
* Author: suicide
*
* Created on 21. März 2010, 16:27
*/
#include <stdlib.h>
#include <boost/signal.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/config.hpp>
#include <boost/type_traits/function_traits.hpp>
#include <boost/function.hpp>
#include <iostream>
#include "chaiscript/chaiscript.hpp"
template<
typename Signature, // function type R (T1, T2, ..., TN)
typename Combiner = boost::last_value<typename boost::function_traits<Signature>::result_type>,
typename Group = int,
typename GroupCompare = std::less<Group>,
typename SlotFunction = boost::function<Signature>
>
class pSignal :
public boost::signals::detail::get_signal_impl<Signature,
Combiner,
Group,
GroupCompare,
SlotFunction>::type
{
typedef typename boost::signals::detail::get_signal_impl<
Signature,
Combiner,
Group,
GroupCompare,
SlotFunction>::type base_type;
public:
explicit pSignal(chaiscript::ChaiScript *chai,const Combiner& combiner = Combiner(),
const GroupCompare& group_compare = GroupCompare()) :
base_type(combiner, group_compare)
{
chai->add(chaiscript::fun(&pSignal<Signature>::chai_connect),"connect");
chai->add(chaiscript::fun(&boost::signals::connection::disconnect),"disconnect");
chai->add(chaiscript::fun(&boost::signals::connection::block),"block");
chai->add(chaiscript::fun(&boost::signals::connection::unblock),"unblock");
chai->add(chaiscript::fun(&boost::signals::connection::blocked),"blocked");
chai->add(chaiscript::fun(&boost::signals::connection::connected),"connected");
//chai->add(chaiscript::fun(&pSignal<Signature>::chai_disconnect),"disconnect");
chai->add(chaiscript::fun(&pSignal<Signature>::chai_disconnect_all_slots),"disconnect_all_slots");
chai->add(chaiscript::fun(&pSignal<Signature>::chai_empty),"empty");
chai->add(chaiscript::fun(&pSignal<Signature>::chai_num_slots),"num_slots");
/**
* TODO:register those
* chai->add(chaiscript::fun(&pSignal<Signature>::operator ()()),"trigger");
*/
}
boost::signals::connection chai_connect(const chaiscript::Proxy_Function &f)
{
return this->connect(chaiscript::functor<Signature>(f));
}
void chai_disconnect(const chaiscript::Proxy_Function &f)
{
this->disconnect(chaiscript::functor<Signature>(f));
}
void chai_disconnect_all_slots(void)
{
this->disconnect_all_slots();
}
bool chai_empty()
{
return this->empty();
}
std::size_t chai_num_slots()
{
return this->num_slots();
}
};
class EventManager
{
public:
EventManager(chaiscript::ChaiScript *cc) : gameStartSignal(cc),gameEndSignal(cc) {
}
pSignal<void ()> gameStartSignal;
pSignal<void ()> gameEndSignal;
};
void _ongamestart(){
std::cout<<"started"<<std::endl;
}
void _createscene(){
std::cout<<"scene created"<<std::endl;
}
void _ongameend(){
std::cout<<"ended"<<std::endl;
}
void connect(boost::signal<void ()> &sig, const chaiscript::Proxy_Function &f)
{
sig.connect(chaiscript::functor<void (void)>(f));
}
int main(int argc, char** argv) {
// Connect a HelloWorld slot
chaiscript::ChaiScript chai;
EventManager *manager = new EventManager(&chai);
chai.add(chaiscript::var(manager), "manager");
//chai.eval("manager.slotadd(fun() { print(\"hallo\") })");
//manager->gameStartSignal.connect( chai.functor<void ()>("fun() { print(\"hallo\") }") );
chai.add(chaiscript::fun(&EventManager::gameStartSignal), "sigStart");
chai.add(chaiscript::fun(&EventManager::gameEndSignal), "sigEnd");
chai.add(chaiscript::fun(&connect),"connect");
//chai.eval("connect(manager.sigStart, fun() { print(\"hallo\") })");
//chai.eval("connect(manager.sigEnd, fun() { print(\"endo\") })");
//chai.eval("connect(manager.sigEnd, fun() { print(\"hans\");return 3 })");
chai.eval("var cc := manager.sigStart.connect(fun(){print(\"yay\")})");
chai.eval("manager.sigStart.num_slots()");
chai.eval("manager.sigStart.empty()");
//chai.eval("manager.sigStart.disconnect_all_slots()");
chai.eval("cc.disconnect()");
// Call all of the slots
for(int x=0;x<=100;++x)
{
manager->gameStartSignal();
manager->gameEndSignal();
}
return (EXIT_SUCCESS);
}