Guest

boost::signal binding in chaiscript

By: a guest on May 2nd, 2010  |  syntax: Python  |  size: 4.77 KB  |  hits: 247  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. /*
  2.  * File:   main.cpp
  3.  * Author: suicide
  4.  *
  5.  * Created on 21. März 2010, 16:27
  6.  */
  7.  
  8. #include <stdlib.h>
  9. #include <boost/signal.hpp>
  10. #include <boost/bind.hpp>
  11. #include <boost/shared_ptr.hpp>
  12. #include <boost/config.hpp>
  13. #include <boost/type_traits/function_traits.hpp>
  14. #include <boost/function.hpp>
  15. #include <iostream>
  16. #include "chaiscript/chaiscript.hpp"
  17.  
  18.   template<
  19.     typename Signature, // function type R (T1, T2, ..., TN)
  20.     typename Combiner = boost::last_value<typename boost::function_traits<Signature>::result_type>,
  21.     typename Group = int,
  22.     typename GroupCompare = std::less<Group>,
  23.     typename SlotFunction = boost::function<Signature>
  24.   >
  25.   class pSignal :
  26.   public boost::signals::detail::get_signal_impl<Signature,
  27.                                                             Combiner,
  28.                                                             Group,
  29.                                                             GroupCompare,
  30.                                                             SlotFunction>::type
  31.   {
  32.     typedef typename boost::signals::detail::get_signal_impl<
  33.                        Signature,
  34.                        Combiner,
  35.                        Group,
  36.                        GroupCompare,
  37.                        SlotFunction>::type base_type;
  38.  
  39.   public:
  40.     explicit pSignal(chaiscript::ChaiScript *chai,const Combiner& combiner = Combiner(),
  41.                     const GroupCompare& group_compare = GroupCompare()) :
  42.       base_type(combiner, group_compare)
  43.       {
  44.           chai->add(chaiscript::fun(&pSignal<Signature>::chai_connect),"connect");
  45.           chai->add(chaiscript::fun(&boost::signals::connection::disconnect),"disconnect");
  46.           chai->add(chaiscript::fun(&boost::signals::connection::block),"block");
  47.           chai->add(chaiscript::fun(&boost::signals::connection::unblock),"unblock");
  48.           chai->add(chaiscript::fun(&boost::signals::connection::blocked),"blocked");
  49.           chai->add(chaiscript::fun(&boost::signals::connection::connected),"connected");
  50.           //chai->add(chaiscript::fun(&pSignal<Signature>::chai_disconnect),"disconnect");
  51.           chai->add(chaiscript::fun(&pSignal<Signature>::chai_disconnect_all_slots),"disconnect_all_slots");
  52.           chai->add(chaiscript::fun(&pSignal<Signature>::chai_empty),"empty");
  53.           chai->add(chaiscript::fun(&pSignal<Signature>::chai_num_slots),"num_slots");
  54.  
  55.        /**
  56.         * TODO:register those
  57.         * chai->add(chaiscript::fun(&pSignal<Signature>::operator ()()),"trigger");
  58.         */
  59.     }
  60.  
  61.     boost::signals::connection chai_connect(const chaiscript::Proxy_Function &f)
  62.     {
  63.         return this->connect(chaiscript::functor<Signature>(f));
  64.     }
  65.     void chai_disconnect(const chaiscript::Proxy_Function &f)
  66.     {
  67.         this->disconnect(chaiscript::functor<Signature>(f));
  68.     }
  69.     void chai_disconnect_all_slots(void)
  70.     {
  71.         this->disconnect_all_slots();
  72.     }
  73.     bool chai_empty()
  74.     {
  75.         return this->empty();
  76.     }
  77.     std::size_t chai_num_slots()
  78.     {
  79.         return this->num_slots();
  80.     }
  81.   };
  82.  
  83. class EventManager
  84. {
  85. public:
  86.     EventManager(chaiscript::ChaiScript *cc) : gameStartSignal(cc),gameEndSignal(cc) {
  87.     }
  88.     pSignal<void ()> gameStartSignal;
  89.     pSignal<void ()> gameEndSignal;
  90. };
  91.  
  92. void _ongamestart(){
  93.     std::cout<<"started"<<std::endl;
  94. }
  95. void _createscene(){
  96.     std::cout<<"scene created"<<std::endl;
  97. }
  98. void _ongameend(){
  99.     std::cout<<"ended"<<std::endl;
  100. }
  101.  
  102.  
  103. void connect(boost::signal<void ()> &sig, const chaiscript::Proxy_Function &f)
  104. {
  105.     sig.connect(chaiscript::functor<void (void)>(f));
  106. }
  107.  
  108.  
  109. int main(int argc, char** argv) {
  110.  
  111. // Connect a HelloWorld slot
  112.     chaiscript::ChaiScript chai;
  113.     EventManager *manager = new EventManager(&chai);
  114.  
  115.  
  116.   chai.add(chaiscript::var(manager), "manager");
  117.   //chai.eval("manager.slotadd(fun() { print(\"hallo\") })");
  118. //manager->gameStartSignal.connect( chai.functor<void ()>("fun() { print(\"hallo\") }") );
  119.  
  120.   chai.add(chaiscript::fun(&EventManager::gameStartSignal), "sigStart");
  121.   chai.add(chaiscript::fun(&EventManager::gameEndSignal), "sigEnd");
  122.   chai.add(chaiscript::fun(&connect),"connect");
  123.   //chai.eval("connect(manager.sigStart, fun() { print(\"hallo\") })");
  124.   //chai.eval("connect(manager.sigEnd, fun() { print(\"endo\") })");
  125.   //chai.eval("connect(manager.sigEnd, fun() { print(\"hans\");return 3 })");
  126.  
  127.   chai.eval("var cc := manager.sigStart.connect(fun(){print(\"yay\")})");
  128.   chai.eval("manager.sigStart.num_slots()");
  129.   chai.eval("manager.sigStart.empty()");
  130.   //chai.eval("manager.sigStart.disconnect_all_slots()");
  131.   chai.eval("cc.disconnect()");
  132.  
  133. // Call all of the slots
  134. for(int x=0;x<=100;++x)
  135. {
  136. manager->gameStartSignal();
  137. manager->gameEndSignal();
  138. }
  139. return (EXIT_SUCCESS);
  140. }