IVGCVSW-6382 Add Gather operator support to ONNX parser

 * Add ParseGather to support Gather operator on ONNX
 * Add Support of int64 converted to int32 for constant
 * Add OnnxParserTestUtils
 * Refactor ValidateTensorShapesFromInputs of GatherLayer
 * Unit tests

Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com>
Change-Id: Ie9dff640240e14a062fef38f7faf0ccc212de5f7
diff --git a/src/armnnOnnxParser/OnnxParser.hpp b/src/armnnOnnxParser/OnnxParser.hpp
index 101e99f..b71b8dc 100644
--- a/src/armnnOnnxParser/OnnxParser.hpp
+++ b/src/armnnOnnxParser/OnnxParser.hpp
@@ -98,6 +98,7 @@
     void AddPoolingLayer(const onnx::NodeProto& nodeProto, armnn::Pooling2dDescriptor& desc);
 
     void CreateConstantLayer(const std::string& tensorName, const std::string& layerName);
+    void CreateInt64ConstantLayer(const std::string& tensorName, const std::string& layerName);
     void CreateReshapeLayer(const std::string& inputName,
                             const std::string& outputName,
                             const std::string& layerName);
@@ -115,6 +116,7 @@
     void ParseConstant(const onnx::NodeProto& nodeProto);
     void ParseConv(const onnx::NodeProto& nodeProto);
     void ParseFlatten(const onnx::NodeProto& node);
+    void ParseGather(const onnx::NodeProto& node);
     void ParseGlobalAveragePool(const onnx::NodeProto& node);
     void ParseMaxPool(const onnx::NodeProto& nodeProto);
     void ParseShape(const onnx::NodeProto& node);
@@ -133,6 +135,10 @@
     CreateConstTensor(const std::string name,
                       armnn::Optional<armnn::PermutationVector&> permutationVector = armnn::EmptyOptional());
 
+    std::pair<armnn::ConstTensor, std::unique_ptr<int32_t[]>>
+    CreateInt64ConstTensor(const std::string name,
+                           armnn::Optional<armnn::PermutationVector&> permutationVector = armnn::EmptyOptional());
+
     template <typename TypeList, typename Location>
     void ValidateInputs(const onnx::NodeProto& node,
                         TypeList validInputs,