From 2bd0fb01215810241ca1f2831893bef01fdd64e7 Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Wed, 7 Aug 2019 16:57:16 +0800
Subject: [PATCH] add an example of a service and an alg to use it.

---
 Examples/CMakeLists.txt              |  9 ++++++-
 Examples/Examples/IFirstSvc.h        | 14 +++++++++++
 Examples/src/FirstSvc/FirstSvc.cpp   | 25 +++++++++++++++++++
 Examples/src/FirstSvc/FirstSvc.h     | 17 +++++++++++++
 Examples/src/SecondAlg/SecondAlg.cpp | 36 ++++++++++++++++++++++++++++
 Examples/src/SecondAlg/SecondAlg.h   | 24 +++++++++++++++++++
 6 files changed, 124 insertions(+), 1 deletion(-)
 create mode 100644 Examples/Examples/IFirstSvc.h
 create mode 100644 Examples/src/FirstSvc/FirstSvc.cpp
 create mode 100644 Examples/src/FirstSvc/FirstSvc.h
 create mode 100644 Examples/src/SecondAlg/SecondAlg.cpp
 create mode 100644 Examples/src/SecondAlg/SecondAlg.h

diff --git a/Examples/CMakeLists.txt b/Examples/CMakeLists.txt
index 4ea66c94..da2a23ef 100644
--- a/Examples/CMakeLists.txt
+++ b/Examples/CMakeLists.txt
@@ -3,13 +3,20 @@ gaudi_subdir(Examples v0r0)
 
 set(Examples_srcs
     src/HelloWorld/*.cpp
+    src/FirstSvc/*.cpp
+    src/SecondAlg/*.cpp
 )
 
+# Headers and Libraries
+
+gaudi_install_headers(Examples)
+
+# Modules
 gaudi_add_module(Examples ${Examples_srcs}
     INCLUDE_DIRS GaudiKernel
     LINK_LIBRARIES GaudiKernel
 )
 
-# Examples
+# Unit tests
 gaudi_add_test(HelloAlg
                FRAMEWORK options/helloalg.py)
\ No newline at end of file
diff --git a/Examples/Examples/IFirstSvc.h b/Examples/Examples/IFirstSvc.h
new file mode 100644
index 00000000..a8634cfa
--- /dev/null
+++ b/Examples/Examples/IFirstSvc.h
@@ -0,0 +1,14 @@
+#ifndef IFirstSvc_h
+#define IFirstSvc_h
+
+#include "GaudiKernel/IService.h"
+
+class IFirstSvc: virtual public IInterface {
+public:
+    DeclareInterfaceID(IFirstSvc, 0, 1); // major/minor version
+
+    virtual void shoot() = 0;
+
+};
+
+#endif
diff --git a/Examples/src/FirstSvc/FirstSvc.cpp b/Examples/src/FirstSvc/FirstSvc.cpp
new file mode 100644
index 00000000..f188a8e2
--- /dev/null
+++ b/Examples/src/FirstSvc/FirstSvc.cpp
@@ -0,0 +1,25 @@
+#include "FirstSvc.h"
+
+DECLARE_COMPONENT(FirstSvc)
+
+StatusCode
+FirstSvc::initialize() {
+    StatusCode sc = Service::initialize();
+
+    return sc;
+}
+
+StatusCode
+FirstSvc::finalize() {
+    // clear or reset
+
+    // 
+    StatusCode sc = Service::finalize();
+    return sc;
+}
+
+void
+FirstSvc::shoot() {
+    msg() << "shoot it." << endmsg;
+
+}
diff --git a/Examples/src/FirstSvc/FirstSvc.h b/Examples/src/FirstSvc/FirstSvc.h
new file mode 100644
index 00000000..25315673
--- /dev/null
+++ b/Examples/src/FirstSvc/FirstSvc.h
@@ -0,0 +1,17 @@
+#ifndef FirstSvc_h
+#define FirstSvc_h
+
+#include "Examples/IFirstSvc.h"
+#include <GaudiKernel/Service.h>
+
+class FirstSvc: public extends<Service, IFirstSvc> {
+public:
+    using extends::extends;
+
+    StatusCode initialize() override;
+    StatusCode finalize() override;
+
+    void shoot() override;
+};
+
+#endif
diff --git a/Examples/src/SecondAlg/SecondAlg.cpp b/Examples/src/SecondAlg/SecondAlg.cpp
new file mode 100644
index 00000000..fc7f1690
--- /dev/null
+++ b/Examples/src/SecondAlg/SecondAlg.cpp
@@ -0,0 +1,36 @@
+#include "SecondAlg.h"
+
+DECLARE_COMPONENT(SecondAlg)
+
+SecondAlg::SecondAlg(const std::string& name, ISvcLocator* pSvcLocator)
+: Algorithm(name, pSvcLocator) {
+
+}
+
+StatusCode
+SecondAlg::initialize() {
+    StatusCode sc;
+
+    info() << "Retrieving the FirstSvc... " << endmsg;
+
+    m_firstsvc = service("FirstSvc");
+
+    return sc;
+}
+
+StatusCode
+SecondAlg::execute() {
+    StatusCode sc;
+
+    m_firstsvc->shoot();
+
+    return sc;
+}
+
+StatusCode
+SecondAlg::finalize() {
+    StatusCode sc;
+    return sc;
+}
+
+
diff --git a/Examples/src/SecondAlg/SecondAlg.h b/Examples/src/SecondAlg/SecondAlg.h
new file mode 100644
index 00000000..e96306c8
--- /dev/null
+++ b/Examples/src/SecondAlg/SecondAlg.h
@@ -0,0 +1,24 @@
+#ifndef SecondAlg_h
+#define SecondAlg_h
+
+#include <GaudiKernel/Algorithm.h>
+#include <GaudiKernel/Property.h>
+
+#include "Examples/IFirstSvc.h"
+
+// The second algorithm shows how to invoke the services.
+
+class SecondAlg: public Algorithm {
+public:
+    SecondAlg(const std::string& name, ISvcLocator* pSvcLocator);
+
+    StatusCode initialize() override;
+    StatusCode execute() override;
+    StatusCode finalize() override;
+
+private:
+    SmartIF<IFirstSvc> m_firstsvc;
+};
+
+
+#endif
-- 
GitLab