IVGCVSW-3691 Rework the CounterDirectory class to take into consideration
the connections between components

 * Added constructors and connections to the profiling classes
 * Used hash table to keep track of the profiling objects by UID
 * Added register methods
 * Added find/check helper methods
 * Updated the makefile to include the profiling directory
 * Added unit tests for the CounterDirectory class
 * Added ICounterDirectory interface class for read-only use
 * Added custom macro to locally disable conversion warnings

Change-Id: I3f53a68663ee77b8d03ac0ef7dc01e90c6893511
Signed-off-by: Matteo Martincigh <matteo.martincigh@arm.com>
diff --git a/src/profiling/ProfilingUtils.hpp b/src/profiling/ProfilingUtils.hpp
index 0e94e61..793f94d 100644
--- a/src/profiling/ProfilingUtils.hpp
+++ b/src/profiling/ProfilingUtils.hpp
@@ -7,8 +7,12 @@
 
 #include <armnn/Exceptions.hpp>
 
+#include <boost/numeric/conversion/cast.hpp>
+
 #include <string>
-#include <stdint.h>
+#include <vector>
+#include <algorithm>
+#include <cstring>
 
 namespace armnn
 {
@@ -16,7 +20,65 @@
 namespace profiling
 {
 
-uint16_t GetNextUid();
+struct SwTraceCharPolicy
+{
+    static bool IsValidChar(unsigned char c)
+    {
+        // Check that the given character has ASCII 7-bit encoding
+        return c < 128;
+    }
+};
+
+struct SwTraceNameCharPolicy
+{
+    static bool IsValidChar(unsigned char c)
+    {
+        // Check that the given character has ASCII 7-bit encoding, alpha-numeric and underscore only
+        return c < 128 && (std::isalnum(c) || c == '_');
+    }
+};
+
+template <typename SwTracePolicy>
+bool IsValidSwTraceString(const std::string& s)
+{
+    // Check that all the characters in the given string conform to the given policy
+    return std::all_of(s.begin(), s.end(), [](unsigned char c)
+    {
+        return SwTracePolicy::IsValidChar(c);
+    });
+}
+
+template <typename SwTracePolicy>
+bool StringToSwTraceString(const std::string& s, std::vector<uint32_t>& outputBuffer)
+{
+    // Converts the given string to an SWTrace "string" (i.e. a string of "chars"), and writes it into
+    // the given buffer including the null-terminator. It also pads it to the next uint32_t if necessary
+
+    // Clear the output buffer
+    outputBuffer.clear();
+
+    // Check that the given string is a valid SWTrace "string" (i.e. a string of "chars")
+    if (!IsValidSwTraceString<SwTracePolicy>(s))
+    {
+        return false;
+    }
+
+    // Prepare the output buffer
+    size_t s_size = s.size() + 1; // The size of the string (in chars) plus the null-terminator
+    size_t uint32_t_size = sizeof(uint32_t);
+    size_t outBufferSize = 1 + s_size / uint32_t_size + (s_size % uint32_t_size != 0 ? 1 : 0);
+    outputBuffer.resize(outBufferSize, '\0');
+
+    // Write the SWTrace string to the output buffer
+    outputBuffer[0] = boost::numeric_cast<uint32_t>(s_size);
+    std::memcpy(outputBuffer.data() + 1, s.data(), s_size);
+
+    return true;
+}
+
+uint16_t GetNextUid(bool peekOnly = false);
+
+std::vector<uint16_t> GetNextCounterUids(uint16_t cores);
 
 void WriteUint64(unsigned char* buffer, unsigned int offset, uint64_t value);