From e27e43387be6fbb73f81e4c3a20bd9c66280a475 Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Thu, 5 Mar 2020 14:15:39 +0900 Subject: [PATCH] example: add new example for DSObject pimpl and property Change-Id: I68d3ae9869ac6df51b70f5a735d3fec5a8ca4454 Signed-off-by: MinJeong Kim --- meson.build | 22 +++++-- src/bin/example/exampleObjectPimpl.cpp | 95 +++++++++++++++++++++++++++ src/bin/example/exampleProperty.cpp | 115 ++++++++++++++++++++++++++++++++ src/bin/example/exampleSignalSlot.cpp | 116 +++++++++++++++++++++++++++++++++ src/bin/sample1.cpp | 86 ------------------------ 5 files changed, 343 insertions(+), 91 deletions(-) create mode 100644 src/bin/example/exampleObjectPimpl.cpp create mode 100644 src/bin/example/exampleProperty.cpp create mode 100644 src/bin/example/exampleSignalSlot.cpp delete mode 100644 src/bin/sample1.cpp diff --git a/meson.build b/meson.build index 925619d..84d3d18 100644 --- a/meson.build +++ b/meson.build @@ -63,15 +63,27 @@ subdir('tests') path_test_server = dir_bin #deps_test_server = [ dep_libds, dependency('libds') ] -src_test_server = [ - 'src/bin/sample1.cpp' -] -executable('test-server', - src_test_server, +executable('exampleSignalSlot', + 'src/bin/example/exampleSignalSlot.cpp', + dependencies : dep_libds, + link_args : link_args, + install_dir : path_test_server, + install : true + ) + +executable('exampleObjectPimpl', + 'src/bin/example/exampleObjectPimpl.cpp', dependencies : dep_libds, link_args : link_args, install_dir : path_test_server, install : true ) +executable('exampleProperty', + 'src/bin/example/exampleProperty.cpp', + dependencies : dep_libds, + link_args : link_args, + install_dir : path_test_server, + install : true + ) diff --git a/src/bin/example/exampleObjectPimpl.cpp b/src/bin/example/exampleObjectPimpl.cpp new file mode 100644 index 0000000..d098b6b --- /dev/null +++ b/src/bin/example/exampleObjectPimpl.cpp @@ -0,0 +1,95 @@ +#include +#include +#include + +/* RESULT + +=== ObjectPimpl *myobj = new ObjectPimpl() === +Constructor 'ObjectPimplPrivate' : example::ObjectPimplPrivate::ObjectPimplPrivate(example::ObjectPimpl*) +Constructor 'ObjectPimpl' : example::ObjectPimpl::ObjectPimpl() + +=== ObjectPimpl *myobj2 = new ObjectPimpl() === +Constructor 'ObjectPimplPrivate' : example::ObjectPimplPrivate::ObjectPimplPrivate(example::ObjectPimpl*) +Constructor 'ObjectPimpl' : example::ObjectPimpl::ObjectPimpl() + +=== delete myobj === +Destructor 'ObjectPimpl' : virtual example::ObjectPimpl::~ObjectPimpl() +Destructor 'ObjectPimplPrivate' : virtual example::ObjectPimplPrivate::~ObjectPimplPrivate() + +=== delete myobj2 === +Destructor 'ObjectPimpl' : virtual example::ObjectPimpl::~ObjectPimpl() +Destructor 'ObjectPimplPrivate' : virtual example::ObjectPimplPrivate::~ObjectPimplPrivate() + +*/ + +namespace example { + class ObjectPimpl; + + class ObjectPimplPrivate : public display_server::DSObjectPrivate { + public: + ObjectPimplPrivate() = delete; + ObjectPimplPrivate(ObjectPimpl *p_ptr); + ~ObjectPimplPrivate(); + }; + + class ObjectPimpl : public display_server::DSObject { + public: + explicit ObjectPimpl(); + virtual ~ObjectPimpl(); + + private: + inline ObjectPimplPrivate *d_func() + { + return reinterpret_cast(__d_ptr.get()); + } + inline const ObjectPimplPrivate *d_func() const + { + return reinterpret_cast(__d_ptr.get()); + } + friend class ObjectPimplPrivate; + }; + + ObjectPimplPrivate::ObjectPimplPrivate(ObjectPimpl *p_ptr) : + display_server::DSObjectPrivate(p_ptr) + { + std::cout << "Constructor 'ObjectPimplPrivate' : " << __PRETTY_FUNCTION__ << std::endl; + } + + ObjectPimplPrivate::~ObjectPimplPrivate() + { + std::cout << "Destructor 'ObjectPimplPrivate' : " << __PRETTY_FUNCTION__ << std::endl; + } + + ObjectPimpl::ObjectPimpl() : + display_server::DSObject(std::make_unique(this)) + { + std::cout << "Constructor 'ObjectPimpl' : " << __PRETTY_FUNCTION__ << std::endl; + } + + ObjectPimpl::~ObjectPimpl() + { + std::cout << "Destructor 'ObjectPimpl' : " << __PRETTY_FUNCTION__ << std::endl; + } + + int exampleObjectPimpl(void) + { + std::cout << "\n=== ObjectPimpl *myobj = new ObjectPimpl() ===" << std::endl; + ObjectPimpl *myobj = new ObjectPimpl(); + + std::cout << "\n=== ObjectPimpl *myobj2 = new ObjectPimpl() ===" << std::endl; + ObjectPimpl *myobj2 = new ObjectPimpl(); + + std::cout << "\n=== delete myobj ===" << std::endl; + delete myobj; + + std::cout << "\n=== delete myobj2 ===" << std::endl; + delete myobj2; + + return 0; + } +} // namespace example + +int main() +{ + return example::exampleObjectPimpl(); +} diff --git a/src/bin/example/exampleProperty.cpp b/src/bin/example/exampleProperty.cpp new file mode 100644 index 0000000..e3520d0 --- /dev/null +++ b/src/bin/example/exampleProperty.cpp @@ -0,0 +1,115 @@ +#include +#include +#include + +/* RESULT +=== Property *myproperty = new Property() === +Constructor 'Property' : example::Property::Property() + +=== Property *myproperty2 = new Property() === +Constructor 'Property' : example::Property::Property() + +=== Add Property [myProperty:1234(int)] to myproperty +Try get Property (key:"myProperty", type:int) of myproperty +myProperty: 1234 +Try get Property (key:"myProperty", type:float) of myproperty +ERR: Unexpected index + +=== Add Property [myProperty:0x11fd378(ptr)] to myproperty === +Try get Property (key:"myProperty", type:int) of myproperty +ERR: Unexpected index +Try get Property (key:"myProperty", type:void *) of myproperty +myProperty: 0x####### +Try get Property (key:"yourProperty", type:DSPropertyVariant&) of myproperty +SUCCESS: NOT_EXIST + +=== delete myproperty === +Destructor 'Property' : virtual example::Property::~Property() + +=== delete myproperty2 === +Destructor 'Property' : virtual example::Property::~Property() +*/ + +namespace example { + class Property : public display_server::DSObject { + public: + explicit Property(); + virtual ~Property(); + }; + + Property::Property() + { + std::cout << "Constructor 'Property' : " << __PRETTY_FUNCTION__ << std::endl; + } + + Property::~Property() + { + std::cout << "Destructor 'Property' : " << __PRETTY_FUNCTION__ << std::endl; + } + + int exampleProperty(void) + { + std::cout << "\n=== Property *myproperty = new Property() ===" << std::endl; + Property *myproperty = new Property(); + + std::cout << "\n=== Property *myproperty2 = new Property() ===" << std::endl; + Property *myproperty2 = new Property(); + + std::cout << "\n=== Add Property [myProperty:1234(int)] to myproperty ===" << std::endl; + myproperty->setProperty("myProperty", 1234, display_server::DSPropertyType::INTEGER); + try { + std::cout << "Try get Property (key:\"myProperty\", type:int) of myproperty" << std::endl; + std::cout << "myProperty: " << std::get(myproperty->getProperty("myProperty")) << std::endl; + } + catch (std::exception &e) { + std::cout << "ERR: " << e.what() << std::endl; + } + try { + std::cout << "Try get Property (key:\"myProperty\", type:float) of myproperty" << std::endl; + std::cout << std::get(myproperty->getProperty("myProperty")) << std::endl; + } + catch (std::exception &e) { + std::cout << "ERR: " << e.what() << std::endl; + } + + std::cout << "\n=== Add Property [myProperty:" << myproperty2 << "(ptr)] to myproperty ===" << std::endl; + myproperty->setProperty("myProperty", static_cast(myproperty2), display_server::DSPropertyType::POINTER); + try { + std::cout << "Try get Property (key:\"myProperty\", type:int) of myproperty" << std::endl; + std::cout << std::get(myproperty->getProperty("myProperty")) << std::endl; + } + catch (std::exception &e) { + std::cout << "ERR: " << e.what() << std::endl; + } + try { + std::cout << "Try get Property (key:\"myProperty\", type:void *) of myproperty" << std::endl; + Property *mypropertyptr = static_cast(std::get(myproperty->getProperty("myProperty"))); + std::cout << "myProperty: " << mypropertyptr << std::endl; + } + catch (std::exception &e) { + std::cout << "ERR: " << e.what() << std::endl; + } + + try { + std::cout << "Try get Property (key:\"yourProperty\", type:DSPropertyVariant&) of myproperty" << std::endl; + const display_server::DSPropertyVariant &ptr = myproperty->getProperty("yourProperty"); + std::cout << " THIS LINE SHOULD BE NOT PRINTED! yourProperty: " << &ptr << std::endl; + } + catch (std::exception &e) { + std::cout << "SUCCESS: " << e.what() << std::endl; + } + + std::cout << "\n=== delete myproperty ===" << std::endl; + delete myproperty; + + std::cout << "\n=== delete myproperty2 ===" << std::endl; + delete myproperty2; + + return 0; + } +} // namespace example + +int main() +{ + return example::exampleProperty(); +} diff --git a/src/bin/example/exampleSignalSlot.cpp b/src/bin/example/exampleSignalSlot.cpp new file mode 100644 index 0000000..42e35f3 --- /dev/null +++ b/src/bin/example/exampleSignalSlot.cpp @@ -0,0 +1,116 @@ +#include +#include +#include +#include + +/* RESULT +construct Sender +construct Sender +construct Receiver +construct Receiver +slotA invoked! a:1234 +slotA2 invoked! a:1234 +slotB invoked! a:45.67 +Lambda slot invoked! val: 45.67 +destruct Receiver(ref: 0) +slotB invoked! a:5678 +slotA invoked! a:90 +destruct Sender +destruct Sender +destruct Receiver(ref: 1) + */ +namespace example { + + using SignalAType = display_server::DSSignal; + using SignalBType = display_server::DSSignal; + + class Sender : public display_server::DSObject { + public: + Sender() : + display_server::DSObject() + { + std::cout << "construct Sender" << std::endl; + } + ~Sender() + { + std::cout << "destruct Sender " << getName() << std::endl; + } + + struct SignalA : public SignalAType { + void emit(int val) + { + SignalAType::emit(val); + } + } signalA; + + struct SignalB : public SignalBType { + void emit(double val) + { + SignalBType::emit(val); + } + } signalB; + }; + + class Receiver : public display_server::DSObject, public display_server::DSRefBase { + public: + Receiver() : + display_server::DSObject(), display_server::DSRefBase() + { + std::cout << "construct Receiver" << std::endl; + } + ~Receiver() + { + std::cout << "destruct Receiver(ref: " << getref() << ") " << getName() << std::endl; + } + + static void slotA(int a) + { + std::cout << "slotA invoked! a:" << a << std::endl; + }; + static void slotA2(int a) + { + std::cout << "slotA2 invoked! a:" << a << std::endl; + } + static void slotB(double a) + { + std::cout << "slotB invoked! a:" << a << std::endl; + }; + }; + + int main(void) + { + Sender *sender = new Sender(); + Sender *sender2 = new Sender(); + Receiver *receiver = new Receiver(); + Receiver *receiver2 = new Receiver(); + + sender->signalA.connect(receiver, Receiver::slotA); + sender->signalA.connect(receiver2, Receiver::slotA2); + sender->signalB.connect(receiver, Receiver::slotB); + sender->signalB.connect(receiver2, [](double val) { + std::cout << "Lambda slot invoked! val: " << val << std::endl; + }); + + sender->signalA.emit(1234); + sender->signalB.emit(45.67); + + if (receiver2->getref() == 1) { + receiver2->unref(); + receiver2 = nullptr; + } + + sender->signalB.emit(5678); + sender->signalA.emit(90.1); + + delete sender; + delete sender2; + delete receiver; + + return 0; + } +} // namespace example + +int main() +{ + return example::main(); +} diff --git a/src/bin/sample1.cpp b/src/bin/sample1.cpp deleted file mode 100644 index 546dbd8..0000000 --- a/src/bin/sample1.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include -#include - -/* SAMPLE RESULT -construct Sender sender -construct Sender sender2 -construct Receiver receiver1 -construct Receiver receiver2 -slotA invoked! a:1234 -slotA2 invoked! a:1234 -slotB invoked! a:45.67 -Lambda slot invoked! val: 45.67 -destruct Receiver(ref: 0) receiver2 -slotB invoked! a:5678 -slotA invoked! a:90 -destruct Sender sender -destruct Sender sender2 -destruct Receiver(ref: 1) receiver1 - */ - -using namespace display_server; - -using SignalAType = DSSignal; -using SignalBType = DSSignal; - -class Sender : public DSObject -{ - public: - Sender() : DSObject("Sender"){ std::cout << "construct Sender" << std::endl;} - Sender(std::string name) : DSObject(name) {std::cout << "construct Sender " << name << std::endl;} - ~Sender(){ std::cout << "destruct Sender " << getName() << std::endl;} - - struct SignalA : public SignalAType { - void emit(int val) { SignalAType::emit(val); } - } signalA; - - struct SignalB : public SignalBType { - void emit(double val) { SignalBType::emit(val); } - } signalB; -}; - -class Receiver : public DSObject, public DSRefBase { - public: - Receiver() : DSObject("Receiver"), DSRefBase() { std::cout << "construct Receiver" << std::endl;} - Receiver(std::string name) : DSObject(name), DSRefBase() { std::cout << "construct Receiver " << name << std::endl;} - ~Receiver() { std::cout << "destruct Receiver(ref: " << getref() << ") " << getName() << std::endl; } - - static void slotA(int a) { std::cout << "slotA invoked! a:" << a << std::endl; }; - static void slotA2(int a) {std::cout << "slotA2 invoked! a:" << a << std::endl; } - static void slotB(double a) { std::cout << "slotB invoked! a:" << a << std::endl; }; -}; - -int main (void) -{ - Sender *sender = new Sender("sender"); - Sender *sender2 = new Sender("sender2"); - Receiver *receiver = new Receiver("receiver1"); - Receiver *receiver2 = new Receiver("receiver2"); - - sender->signalA.connect(receiver, Receiver::slotA); - sender->signalA.connect(receiver2, Receiver::slotA2); - sender->signalB.connect(receiver, Receiver::slotB); - sender->signalB.connect(receiver2, [](double val) { - std::cout << "Lambda slot invoked! val: " << val << std::endl; - }); - - sender->signalA.emit(1234); - sender->signalB.emit(45.67); - - if (receiver2->getref() == 1) - { - receiver2->unref(); - receiver2 = nullptr; - } - - sender->signalB.emit(5678); - sender->signalA.emit(90.1); - - delete sender; - delete sender2; - delete receiver; - - return 0; -} -- 2.7.4