Extended install() to support 7 arguments. Review: https://reviews.apache.org/r/49606/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/90bcedce Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/90bcedce Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/90bcedce Branch: refs/heads/master Commit: 90bcedcef22c960a08cc7056253d2b05d9a4ad81 Parents: c5e2aae Author: Joerg Schad <jo...@mesosphere.io> Authored: Tue Jul 5 17:05:21 2016 -0500 Committer: Vinod Kone <vinodk...@gmail.com> Committed: Tue Jul 5 17:06:05 2016 -0500 ---------------------------------------------------------------------- .../libprocess/include/process/protobuf.hpp | 132 +++++++++++++++++++ 1 file changed, 132 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/90bcedce/3rdparty/libprocess/include/process/protobuf.hpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/include/process/protobuf.hpp b/3rdparty/libprocess/include/process/protobuf.hpp index d478cc0..78ff40e 100644 --- a/3rdparty/libprocess/include/process/protobuf.hpp +++ b/3rdparty/libprocess/include/process/protobuf.hpp @@ -273,6 +273,35 @@ protected: delete m; } + template <typename M, + typename P1, typename P1C, + typename P2, typename P2C, + typename P3, typename P3C, + typename P4, typename P4C, + typename P5, typename P5C, + typename P6, typename P6C, + typename P7, typename P7C> + void install( + void (T::*method)(const process::UPID&, P1C, P2C, P3C, + P4C, P5C, P6C, P7C), + P1 (M::*p1)() const, + P2 (M::*p2)() const, + P3 (M::*p3)() const, + P4 (M::*p4)() const, + P5 (M::*p5)() const, + P6 (M::*p6)() const, + P7 (M::*p7)() const) + { + google::protobuf::Message* m = new M(); + T* t = static_cast<T*>(this); + protobufHandlers[m->GetTypeName()] = + lambda::bind(&handler7<M, P1, P1C, P2, P2C, P3, P3C, + P4, P4C, P5, P5C, P6, P6C, P7, P7C>, + t, method, p1, p2, p3, p4, p5, p6, p7, + lambda::_1, lambda::_2); + delete m; + } + // Installs that do not take the sender. template <typename M> void install(void (T::*method)(const M&)) @@ -419,6 +448,34 @@ protected: delete m; } + template <typename M, + typename P1, typename P1C, + typename P2, typename P2C, + typename P3, typename P3C, + typename P4, typename P4C, + typename P5, typename P5C, + typename P6, typename P6C, + typename P7, typename P7C> + void install( + void (T::*method)(P1C, P2C, P3C, P4C, P5C, P6C, P7C), + P1 (M::*p1)() const, + P2 (M::*p2)() const, + P3 (M::*p3)() const, + P4 (M::*p4)() const, + P5 (M::*p5)() const, + P6 (M::*p6)() const, + P7 (M::*p7)() const) + { + google::protobuf::Message* m = new M(); + T* t = static_cast<T*>(this); + protobufHandlers[m->GetTypeName()] = + lambda::bind(&_handler7<M, P1, P1C, P2, P2C, P3, P3C, + P4, P4C, P5, P5C, P6, P6C, P7, P7C>, + t, method, p1, p2, p3, p4, p5, p6, p7, + lambda::_1, lambda::_2); + delete m; + } + using process::Process<T>::install; private: @@ -613,6 +670,44 @@ private: } } + template <typename M, + typename P1, typename P1C, + typename P2, typename P2C, + typename P3, typename P3C, + typename P4, typename P4C, + typename P5, typename P5C, + typename P6, typename P6C, + typename P7, typename P7C> + static void handler7( + T* t, + void (T::*method)( + const process::UPID&, P1C, P2C, P3C, P4C, P5C, P6C, P7C), + P1 (M::*p1)() const, + P2 (M::*p2)() const, + P3 (M::*p3)() const, + P4 (M::*p4)() const, + P5 (M::*p5)() const, + P6 (M::*p6)() const, + P7 (M::*p7)() const, + const process::UPID& sender, + const std::string& data) + { + M m; + m.ParseFromString(data); + if (m.IsInitialized()) { + (t->*method)(sender, + google::protobuf::convert((&m->*p1)()), + google::protobuf::convert((&m->*p2)()), + google::protobuf::convert((&m->*p3)()), + google::protobuf::convert((&m->*p4)()), + google::protobuf::convert((&m->*p5)()), + google::protobuf::convert((&m->*p6)()), + google::protobuf::convert((&m->*p7)())); + } else { + LOG(WARNING) << "Initialization errors: " + << m.InitializationErrorString(); + } + } // Handlers that ignore the sender. template <typename M> @@ -800,6 +895,43 @@ private: } } + template <typename M, + typename P1, typename P1C, + typename P2, typename P2C, + typename P3, typename P3C, + typename P4, typename P4C, + typename P5, typename P5C, + typename P6, typename P6C, + typename P7, typename P7C> + static void _handler7( + T* t, + void (T::*method)(P1C, P2C, P3C, P4C, P5C, P6C, P7C), + P1 (M::*p1)() const, + P2 (M::*p2)() const, + P3 (M::*p3)() const, + P4 (M::*p4)() const, + P5 (M::*p5)() const, + P6 (M::*p6)() const, + P7 (M::*p7)() const, + const process::UPID&, + const std::string& data) + { + M m; + m.ParseFromString(data); + if (m.IsInitialized()) { + (t->*method)(google::protobuf::convert((&m->*p1)()), + google::protobuf::convert((&m->*p2)()), + google::protobuf::convert((&m->*p3)()), + google::protobuf::convert((&m->*p4)()), + google::protobuf::convert((&m->*p5)()), + google::protobuf::convert((&m->*p6)()), + google::protobuf::convert((&m->*p7)())); + } else { + LOG(WARNING) << "Initialization errors: " + << m.InitializationErrorString(); + } + } + typedef lambda::function< void(const process::UPID&, const std::string&)> handler; hashmap<std::string, handler> protobufHandlers;