COMPMID-782 Port examples to the new format

Change-Id: Ib178a97c080ff650094d02ee49e2a0aa22376dd0
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/115717
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Tested-by: Jenkins <bsgcomp@arm.com>
diff --git a/examples/cl_events.cpp b/examples/cl_events.cpp
index c9c3e5d..ec02fc3 100644
--- a/examples/cl_events.cpp
+++ b/examples/cl_events.cpp
@@ -33,78 +33,88 @@
 using namespace arm_compute;
 using namespace utils;
 
-void main_cl_events(int argc, char **argv)
+class CLEventsExample : public Example
 {
-    /** [OpenCL events] **/
-    PPMLoader     ppm;
-    CLImage       src, tmp_scale_median, tmp_median_gauss, dst;
-    constexpr int scale_factor = 2;
-
-    CLScheduler::get().default_init();
-
-    if(argc < 2)
+public:
+    void do_setup(int argc, char **argv) override
     {
-        // Print help
-        std::cout << "Usage: ./build/cl_events [input_image.ppm]\n\n";
-        std::cout << "No input_image provided, creating a dummy 640x480 image\n";
-        // Create an empty grayscale 640x480 image
-        src.allocator()->init(TensorInfo(640, 480, Format::U8));
+        /** [OpenCL events] **/
+        PPMLoader     ppm;
+        constexpr int scale_factor = 2;
+
+        CLScheduler::get().default_init();
+
+        if(argc < 2)
+        {
+            // Print help
+            std::cout << "Usage: ./build/cl_events [input_image.ppm]\n\n";
+            std::cout << "No input_image provided, creating a dummy 640x480 image\n";
+            // Create an empty grayscale 640x480 image
+            src.allocator()->init(TensorInfo(640, 480, Format::U8));
+        }
+        else
+        {
+            ppm.open(argv[1]);
+            ppm.init_image(src, Format::U8);
+        }
+
+        TensorInfo dst_info(src.info()->dimension(0) / scale_factor, src.info()->dimension(1) / scale_factor, Format::U8);
+
+        // Configure the temporary and destination images
+        dst.allocator()->init(dst_info);
+        tmp_scale_median.allocator()->init(dst_info);
+        tmp_median_gauss.allocator()->init(dst_info);
+
+        //Configure the functions:
+        scale.configure(&src, &tmp_scale_median, InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::REPLICATE);
+        median.configure(&tmp_scale_median, &tmp_median_gauss, BorderMode::REPLICATE);
+        gauss.configure(&tmp_median_gauss, &dst, BorderMode::REPLICATE);
+
+        // Allocate all the images
+        src.allocator()->allocate();
+        dst.allocator()->allocate();
+        tmp_scale_median.allocator()->allocate();
+        tmp_median_gauss.allocator()->allocate();
+
+        // Fill the input image with the content of the PPM image if a filename was provided:
+        if(ppm.is_open())
+        {
+            ppm.fill_image(src);
+            output_filename = std::string(argv[1]) + "_out.ppm";
+        }
+        /** [OpenCL events] **/
     }
-    else
+    void do_run() override
     {
-        ppm.open(argv[1]);
-        ppm.init_image(src, Format::U8);
+        // Enqueue and flush the scale OpenCL kernel:
+        scale.run();
+        // Create a synchronisation event between scale and median:
+        cl::Event scale_event = CLScheduler::get().enqueue_sync_event();
+        // Enqueue and flush the median OpenCL kernel:
+        median.run();
+        // Enqueue and flush the Gaussian OpenCL kernel:
+        gauss.run();
+
+        //Make sure all the OpenCL jobs are done executing:
+        scale_event.wait();        // Block until Scale is done executing (Median3x3 and Gaussian5x5 might still be running)
+        CLScheduler::get().sync(); // Block until Gaussian5x5 is done executing
+    }
+    void do_teardown() override
+    {
+        // Save the result to file:
+        if(!output_filename.empty())
+        {
+            save_to_ppm(dst, output_filename); // save_to_ppm maps and unmaps the image to store as PPM
+        }
     }
 
-    // Declare and configure the functions to create the following pipeline: scale -> median -> gauss
-    CLScale       scale;
-    CLMedian3x3   median;
-    CLGaussian5x5 gauss;
-
-    TensorInfo dst_info(src.info()->dimension(0) / scale_factor, src.info()->dimension(1) / scale_factor, Format::U8);
-
-    // Configure the temporary and destination images
-    dst.allocator()->init(dst_info);
-    tmp_scale_median.allocator()->init(dst_info);
-    tmp_median_gauss.allocator()->init(dst_info);
-
-    //Configure the functions:
-    scale.configure(&src, &tmp_scale_median, InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::REPLICATE);
-    median.configure(&tmp_scale_median, &tmp_median_gauss, BorderMode::REPLICATE);
-    gauss.configure(&tmp_median_gauss, &dst, BorderMode::REPLICATE);
-
-    // Allocate all the images
-    src.allocator()->allocate();
-    dst.allocator()->allocate();
-    tmp_scale_median.allocator()->allocate();
-    tmp_median_gauss.allocator()->allocate();
-    // Fill the input image with the content of the PPM image if a filename was provided:
-    if(ppm.is_open())
-    {
-        ppm.fill_image(src);
-    }
-
-    // Enqueue and flush the scale OpenCL kernel:
-    scale.run();
-    // Create a synchronisation event between scale and median:
-    cl::Event scale_event = CLScheduler::get().enqueue_sync_event();
-    // Enqueue and flush the median OpenCL kernel:
-    median.run();
-    // Enqueue and flush the Gaussian OpenCL kernel:
-    gauss.run();
-
-    //Make sure all the OpenCL jobs are done executing:
-    scale_event.wait();        // Block until Scale is done executing (Median3x3 and Gaussian5x5 might still be running)
-    CLScheduler::get().sync(); // Block until Gaussian5x5 is done executing
-
-    // Save the result to file:
-    if(ppm.is_open())
-    {
-        const std::string output_filename = std::string(argv[1]) + "_out.ppm";
-        save_to_ppm(dst, output_filename); // save_to_ppm maps and unmaps the image to store as PPM
-    }
-    /** [OpenCL events] **/
-}
+private:
+    CLImage       src{}, tmp_scale_median{}, tmp_median_gauss{}, dst{};
+    CLScale       scale{};
+    CLMedian3x3   median{};
+    CLGaussian5x5 gauss{};
+    std::string   output_filename{};
+};
 
 /** Main program for convolution test
  *
@@ -113,5 +123,5 @@
  */
 int main(int argc, char **argv)
 {
-    return utils::run_example(argc, argv, main_cl_events);
+    return utils::run_example<CLEventsExample>(argc, argv);
 }