#include #include #include qiLogCategory("qi.python.moduletest"); class Mouse { public: int squeak(); qi::Property size; }; QI_REGISTER_OBJECT(Mouse, squeak, size); int Mouse::squeak() { qiLogInfo() << "squeak"; return 18; } class Purr { public: Purr(std::shared_ptr> counter) : counter(counter) { qiLogInfo() << this << " purr constructor "; ++(*counter); } ~Purr() { qiLogInfo() << this << " purr destructor "; --(*counter); } void run() { qiLogInfo() << this << " purring"; } qi::Property volume; private: std::shared_ptr> counter; }; QI_REGISTER_OBJECT(Purr, run, volume); class Sleep { public: Sleep(std::shared_ptr> counter) : counter(counter) { qiLogInfo() << this << " sleep constructor "; ++(*counter); } ~Sleep() { qiLogInfo() << this << " sleep destructor "; --(*counter); } void run() { qiLogInfo() << this << " sleeping"; } private: std::shared_ptr> counter; }; QI_REGISTER_OBJECT(Sleep, run); class Play { public: Play(std::shared_ptr> counter) : counter(counter) { qiLogInfo() << this << " play constructor "; ++(*counter); } ~Play() { qiLogInfo() << this << " play destructor "; --(*counter); } void run() { qiLogInfo() << this << " playing"; } qi::Signal caught; private: std::shared_ptr> counter; }; QI_REGISTER_OBJECT(Play, run, caught); class Cat { public: Cat(); Cat(const std::string& s); Cat(const qi::SessionPtr& s); std::string meow(int volume); bool eat(const Mouse& m); boost::shared_ptr cloneMe() { return boost::make_shared(); } boost::shared_ptr makePurr() const { return boost::make_shared(purrCounter); } boost::shared_ptr makeSleep() const { return boost::make_shared(sleepCounter); } boost::shared_ptr makePlay() const { return boost::make_shared(playCounter); } void order(qi::AnyObject /*action*/) const { // Cats do not follow orders, they do nothing. } int nbPurr() { return purrCounter->load(); } int nbSleep() { return sleepCounter->load(); } int nbPlay() { return playCounter->load(); } qi::Property hunger; qi::Property boredom; qi::Property cuteness; std::shared_ptr> purrCounter = std::make_shared>(0); std::shared_ptr> sleepCounter = std::make_shared>(0); std::shared_ptr> playCounter = std::make_shared>(0); }; QI_REGISTER_OBJECT(Cat, meow, cloneMe, hunger, boredom, cuteness, makePurr, makeSleep, makePlay, order, nbPurr, nbSleep, nbPlay); Cat::Cat() { qiLogInfo() << "Cat constructor"; } Cat::Cat(const std::string& s) : Cat() { qiLogInfo() << "Cat string constructor: " << s; } Cat::Cat(const qi::SessionPtr& s) : Cat() { qiLogInfo() << "Cat string constructor with session"; s->services(); // SEGV? } std::string Cat::meow(int volume) { qiLogInfo() << "meow: " << volume; return "meow"; } bool Cat::eat(const Mouse&) { qiLogInfo() << "eating mouse"; return true; } int lol() { return 3; } void registerObjs(qi::ModuleBuilder* mb) { mb->advertiseFactory("Mouse"); mb->advertiseFactory("Cat"); mb->advertiseFactory("Cat"); mb->advertiseFactory("Cat"); mb->advertiseMethod("lol", &lol); mb->advertiseMethod("_hidden", []{}); } QI_REGISTER_MODULE("moduletest", ®isterObjs);