IVGCVSW-5980 JSON profiling output

 * Add new ProfilingDetails class to construct operator details string
 * Add new macro which helps append layer details to ostream
 * Add ProfilingEnabled to NetworkProperties so that profiling can be
   realised when loading the network
 * Add further optional info to WorkloadInfo specific to convolutions
 * Generalise some JsonPrinter functions into JsonUtils for reusability
 * Remove explicit enabling of profiling within InferenceModel as it is
   done when loading network
 * Add ProfilingDetails macros to ConvolutionWorkloads for validation

Signed-off-by: Keith Davis <keith.davis@arm.com>
Change-Id: Ie84bc7dc667e72e6bcb635544f9ead7af1765690
diff --git a/src/armnn/JsonPrinter.hpp b/src/armnn/JsonPrinter.hpp
index 04f56b0..4af1609 100644
--- a/src/armnn/JsonPrinter.hpp
+++ b/src/armnn/JsonPrinter.hpp
@@ -5,12 +5,13 @@
 
 #pragma once
 
-#include <ostream>
-#include <string.h>
+#include <string>
 #include <map>
 #include <set>
+#include <sstream>
 
 #include "Instrument.hpp"
+#include "JsonUtils.hpp"
 
 namespace armnn
 {
@@ -18,13 +19,15 @@
 enum class JsonObjectType
 {
     Measurement,
-    Event
+    Event,
+    ExecObjectDesc
 };
 
 struct JsonChildObject
 {
+    // Object type changes according to the JsonObjectType specified in enum
     JsonChildObject(const std::string& label)
-            : m_Label(label), m_Unit(Measurement::Unit::TIME_MS), m_Type(JsonObjectType::Event)
+        : m_Label(label), m_Unit(Measurement::Unit::TIME_MS), m_Type(JsonObjectType::Event)
     {}
     JsonChildObject(const JsonChildObject&) = default;
 
@@ -33,6 +36,16 @@
         m_Measurements.push_back(measurement);
     }
 
+    void SetAndParseDetails(std::string layerDetailsStr)
+    {
+        std::stringstream layerDetails(layerDetailsStr);
+        std::string stringLine;
+        while (std::getline(layerDetails, stringLine, '\n'))
+        {
+            m_LayerDetailsList.push_back(stringLine);
+        }
+    }
+
     void AddChild(const JsonChildObject& childObject)
     {
         m_Children.push_back(childObject);
@@ -69,39 +82,31 @@
     Measurement::Unit m_Unit;
     JsonObjectType m_Type;
     std::vector<double> m_Measurements;
+    std::vector<std::string> m_LayerDetailsList;
     std::vector<JsonChildObject> m_Children;
 
 private:
     JsonChildObject() = delete;
 };
 
-class JsonPrinter
+class JsonPrinter : public JsonUtils
 {
 public:
     void PrintJsonChildObject(const JsonChildObject& object, size_t& id);
-    void PrintHeader();
-    void PrintArmNNHeader();
-    void PrintFooter();
-    void PrintSeparator();
-    void PrintNewLine();
     void PrintLabel(const std::string& label, size_t id);
     void PrintUnit(armnn::Measurement::Unit unit);
     void PrintType(armnn::JsonObjectType type);
     void PrintMeasurementsList(const std::vector<double>& measurementsVector);
 
 public:
-    JsonPrinter(std::ostream &outputStream)
-        : m_OutputStream(outputStream), m_NumTabs(0)
+    JsonPrinter(std::ostream& outputStream)
+        : JsonUtils(outputStream), m_OutputStream(outputStream)
     {}
 
 private:
     std::string MakeKey(const std::string& label, size_t id);
-    void PrintTabs();
-    void DecrementNumberOfTabs();
-    void IncrementNumberOfTabs();
 
-    std::ostream &m_OutputStream;
-    unsigned int m_NumTabs;
+    std::ostream& m_OutputStream;
 };
 
 } // namespace armnn
\ No newline at end of file