IVGCVSW-5303 Remove some boost::numeric_cast from rest of ArmNN

 * Replaced with armnn/utility/NumericCast.hpp
 * Exclusions in TypeUtils.cpp and QuantizerVisitor.cpp
 * Excluded as requires float implementation in NumericCast.hpp

Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: I5c4c60e7028e1a51bf9379457278d253fd37bc70
diff --git a/src/armnn/Descriptors.cpp b/src/armnn/Descriptors.cpp
index 6388d4a..c6fbfff 100644
--- a/src/armnn/Descriptors.cpp
+++ b/src/armnn/Descriptors.cpp
@@ -6,13 +6,13 @@
 #include "armnn/Logging.hpp"
 
 #include <armnn/utility/Assert.hpp>
+#include <armnn/utility/NumericCast.hpp>
 
 #include <algorithm>
 #include <array>
 #include <vector>
 
 #include <boost/format.hpp>
-#include <boost/numeric/conversion/cast.hpp>
 
 namespace armnn
 {
@@ -69,7 +69,7 @@
 }
 
 PermutationVector::PermutationVector(std::initializer_list<ValueType> dimMappings)
-    : PermutationVector(dimMappings.begin(), boost::numeric_cast<SizeType>(dimMappings.size()))
+    : PermutationVector(dimMappings.begin(), armnn::numeric_cast<SizeType>(dimMappings.size()))
 {
 }
 
@@ -374,7 +374,7 @@
         }
     }
 
-    const int axisSize = boost::numeric_cast<int>(inputShape[axis]);
+    const int axisSize = armnn::numeric_cast<int>(inputShape[axis]);
     if (start < 0)
     {
         start += (axisSize);
@@ -408,7 +408,7 @@
         }
     }
 
-    const int axisSize = boost::numeric_cast<int>(inputShape[axis]);
+    const int axisSize = armnn::numeric_cast<int>(inputShape[axis]);
     if (stop < 0)
     {
         stop += axisSize;
diff --git a/src/armnn/Graph.cpp b/src/armnn/Graph.cpp
index 2a60072..a497a45 100644
--- a/src/armnn/Graph.cpp
+++ b/src/armnn/Graph.cpp
@@ -14,6 +14,7 @@
 #include <armnn/TypesUtils.hpp>
 #include <armnn/Utils.hpp>
 #include <armnn/utility/Assert.hpp>
+#include <armnn/utility/NumericCast.hpp>
 
 #include <boost/format.hpp>
 
@@ -384,7 +385,7 @@
                                                                          &compLayer->GetInputSlot(0)));
 
                     // The input strategy of a compatibility layer is always DirectCompatibilty.
-                    srcOutputSlot.SetEdgeStrategy(boost::numeric_cast<unsigned int>(newSrcConnectionIndex),
+                    srcOutputSlot.SetEdgeStrategy(armnn::numeric_cast<unsigned int>(newSrcConnectionIndex),
                                                     EdgeStrategy::DirectCompatibility);
                 }
             }
@@ -442,8 +443,8 @@
     const SubgraphView::InputSlots& subgraphInputSlots = subgraph.GetInputSlots();
     const SubgraphView::OutputSlots& subgraphOutputSlots = subgraph.GetOutputSlots();
 
-    unsigned int subgraphNumInputSlots = boost::numeric_cast<unsigned int>(subgraphInputSlots.size());
-    unsigned int subgraphNumOutputSlots = boost::numeric_cast<unsigned int>(subgraphOutputSlots.size());
+    unsigned int subgraphNumInputSlots = armnn::numeric_cast<unsigned int>(subgraphInputSlots.size());
+    unsigned int subgraphNumOutputSlots = armnn::numeric_cast<unsigned int>(subgraphOutputSlots.size());
 
     const SubgraphView::InputSlots& substituteSubgraphInputSlots = substituteSubgraph.GetInputSlots();
     const SubgraphView::OutputSlots& substituteSubgraphOutputSlots = substituteSubgraph.GetOutputSlots();
diff --git a/src/armnn/Layer.cpp b/src/armnn/Layer.cpp
index dc211b7..2256e48 100644
--- a/src/armnn/Layer.cpp
+++ b/src/armnn/Layer.cpp
@@ -6,10 +6,10 @@
 
 #include "Graph.hpp"
 #include <ProfilingService.hpp>
+#include <armnn/utility/NumericCast.hpp>
 #include <backendsCommon/WorkloadData.hpp>
 #include <backendsCommon/CpuTensorHandle.hpp>
 
-#include <boost/cast.hpp>
 #include <boost/format.hpp>
 
 #include <numeric>
@@ -31,7 +31,7 @@
         // Connects inserted layer to parent.
         ARMNN_ASSERT(layer.GetNumInputSlots() == 1);
         int idx = prevSlot->Connect(layer.GetInputSlot(0));
-        prevSlot->SetEdgeStrategy(boost::numeric_cast<unsigned int>(idx), EdgeStrategy::Undefined);
+        prevSlot->SetEdgeStrategy(armnn::numeric_cast<unsigned int>(idx), EdgeStrategy::Undefined);
 
         // Sets tensor info for inserted layer.
         const TensorInfo& tensorInfo = prevSlot->GetTensorInfo();
@@ -85,7 +85,7 @@
     destination.SetConnection(this);
     m_Connections.push_back(&destination);
     m_EdgeStrategies.push_back(EdgeStrategy::Undefined);
-    return boost::numeric_cast<int>(m_Connections.size() - 1);
+    return armnn::numeric_cast<int>(m_Connections.size() - 1);
 }
 
 void OutputSlot::Disconnect(InputSlot& slot)
@@ -157,7 +157,7 @@
 
 void OutputSlot::ValidateConnectionIndex(unsigned int index) const
 {
-    if (boost::numeric_cast<std::size_t>(index) >= m_Connections.size())
+    if (armnn::numeric_cast<std::size_t>(index) >= m_Connections.size())
     {
         throw InvalidArgumentException(
             boost::str(boost::format("GetConnection: Invalid index %1% provided") % index));
diff --git a/src/armnn/Layer.hpp b/src/armnn/Layer.hpp
index d4a24e4..fff5773 100644
--- a/src/armnn/Layer.hpp
+++ b/src/armnn/Layer.hpp
@@ -18,6 +18,7 @@
 #include <armnn/Tensor.hpp>
 #include <armnn/INetwork.hpp>
 #include <armnn/utility/IgnoreUnused.hpp>
+#include <armnn/utility/NumericCast.hpp>
 #include <armnn/utility/PolymorphicDowncast.hpp>
 
 #include <algorithm>
@@ -28,8 +29,6 @@
 #include <string>
 #include <vector>
 
-#include <boost/cast.hpp>
-
 namespace armnn
 {
 
@@ -135,7 +134,7 @@
 
     // IOutputSlot
 
-    unsigned int GetNumConnections() const override { return boost::numeric_cast<unsigned int>(m_Connections.size()); }
+    unsigned int GetNumConnections() const override { return armnn::numeric_cast<unsigned int>(m_Connections.size()); }
     const InputSlot* GetConnection(unsigned int index) const override;
     InputSlot* GetConnection(unsigned int index) override;
 
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index cd5f369..1f59ed5 100644
--- a/src/armnn/Network.cpp
+++ b/src/armnn/Network.cpp
@@ -37,7 +37,6 @@
 
 #include <boost/format.hpp>
 #include <boost/numeric/conversion/converter_policies.hpp>
-#include <boost/cast.hpp>
 
 namespace armnn
 {
diff --git a/src/armnn/QuantizerVisitor.cpp b/src/armnn/QuantizerVisitor.cpp
index a30a29d..9fbdd9f 100644
--- a/src/armnn/QuantizerVisitor.cpp
+++ b/src/armnn/QuantizerVisitor.cpp
@@ -10,6 +10,8 @@
 
 #include <armnn/utility/PolymorphicDowncast.hpp>
 
+#include <boost/numeric/conversion/cast.hpp>
+
 namespace armnn
 {
 
diff --git a/src/armnn/SubgraphView.cpp b/src/armnn/SubgraphView.cpp
index d65c677..92ba5df 100644
--- a/src/armnn/SubgraphView.cpp
+++ b/src/armnn/SubgraphView.cpp
@@ -7,9 +7,9 @@
 #include "Graph.hpp"
 
 #include <armnn/utility/IgnoreUnused.hpp>
+#include <armnn/utility/NumericCast.hpp>
 #include <armnn/utility/PolymorphicDowncast.hpp>
 
-#include <boost/numeric/conversion/cast.hpp>
 #include <utility>
 
 namespace armnn
@@ -149,12 +149,12 @@
 
 unsigned int SubgraphView::GetNumInputSlots() const
 {
-    return boost::numeric_cast<unsigned int>(m_InputSlots.size());
+    return armnn::numeric_cast<unsigned int>(m_InputSlots.size());
 }
 
 unsigned int SubgraphView::GetNumOutputSlots() const
 {
-    return boost::numeric_cast<unsigned int>(m_OutputSlots.size());
+    return armnn::numeric_cast<unsigned int>(m_OutputSlots.size());
 }
 
 const SubgraphView::Layers& SubgraphView::GetLayers() const
diff --git a/src/armnn/Tensor.cpp b/src/armnn/Tensor.cpp
index c2dd1d3..449fdf1 100644
--- a/src/armnn/Tensor.cpp
+++ b/src/armnn/Tensor.cpp
@@ -9,8 +9,7 @@
 #include "armnn/TypesUtils.hpp"
 
 #include <armnn/utility/Assert.hpp>
-
-#include <boost/numeric/conversion/cast.hpp>
+#include <armnn/utility/NumericCast.hpp>
 
 #include <iostream>
 
@@ -53,7 +52,7 @@
 }
 
 TensorShape::TensorShape(std::initializer_list<unsigned int> dimensionSizeList)
- : TensorShape(boost::numeric_cast<unsigned int>(dimensionSizeList.size()), dimensionSizeList.begin())
+ : TensorShape(armnn::numeric_cast<unsigned int>(dimensionSizeList.size()), dimensionSizeList.begin())
 {
 }
 
diff --git a/src/armnn/TypesUtils.cpp b/src/armnn/TypesUtils.cpp
index 9e58dc8..dd27df9 100644
--- a/src/armnn/TypesUtils.cpp
+++ b/src/armnn/TypesUtils.cpp
@@ -49,8 +49,7 @@
     static_assert(IsQuantizedType<QuantizedType>(), "Not an integer type.");
     ARMNN_ASSERT(scale != 0.f);
     ARMNN_ASSERT(!IsNan(value));
-    float dequantized = boost::numeric_cast<float>(value - offset) * scale;
-    return dequantized;
+    return (boost::numeric_cast<float>(value - offset)) * scale;
 }
 
 /// Explicit specialization of Quantize for int8_t
diff --git a/src/armnn/layers/MeanLayer.cpp b/src/armnn/layers/MeanLayer.cpp
index a1a3a40..0c5959c 100644
--- a/src/armnn/layers/MeanLayer.cpp
+++ b/src/armnn/layers/MeanLayer.cpp
@@ -6,6 +6,8 @@
 #include "MeanLayer.hpp"
 #include "LayerCloneBase.hpp"
 
+#include <armnn/utility/NumericCast.hpp>
+
 #include <backendsCommon/CpuTensorHandle.hpp>
 #include <backendsCommon/WorkloadData.hpp>
 #include <backendsCommon/WorkloadFactory.hpp>
@@ -69,7 +71,7 @@
     }
     else
     {
-        outputRank = input.GetNumDimensions() - boost::numeric_cast<unsigned int>(m_Param.m_Axis.size());
+        outputRank = input.GetNumDimensions() - armnn::numeric_cast<unsigned int>(m_Param.m_Axis.size());
         if (outputRank == 0)
         {
             outputRank = 1;
@@ -85,7 +87,7 @@
         {
             if (std::find(m_Param.m_Axis.begin(), m_Param.m_Axis.end(), i) == m_Param.m_Axis.end())
             {
-                dimSizes[outputIndex] = boost::numeric_cast<unsigned int>(input.GetShape()[i]);
+                dimSizes[outputIndex] = armnn::numeric_cast<unsigned int>(input.GetShape()[i]);
                 ++outputIndex;
             }
             else if (m_Param.m_KeepDims)
diff --git a/src/armnn/layers/PreluLayer.cpp b/src/armnn/layers/PreluLayer.cpp
index a57aa85..365dd4f 100644
--- a/src/armnn/layers/PreluLayer.cpp
+++ b/src/armnn/layers/PreluLayer.cpp
@@ -7,6 +7,8 @@
 
 #include "LayerCloneBase.hpp"
 
+#include <armnn/utility/NumericCast.hpp>
+
 #include <backendsCommon/WorkloadData.hpp>
 #include <backendsCommon/WorkloadFactory.hpp>
 #include <backendsCommon/CpuTensorHandle.hpp>
@@ -52,15 +54,15 @@
 
     TensorShape outputShape(outputDimensions);
 
-    int inputShapeIndex = boost::numeric_cast<int>(inputShapeDimensions) - 1;
-    int alphaShapeIndex = boost::numeric_cast<int>(alphaShapeDimensions) - 1;
+    int inputShapeIndex = armnn::numeric_cast<int>(inputShapeDimensions) - 1;
+    int alphaShapeIndex = armnn::numeric_cast<int>(alphaShapeDimensions) - 1;
     unsigned int outputShapeIndex = outputDimensions - 1;
 
     // Loop backwards through the common part of the shapes
     while (inputShapeIndex >= 0 && alphaShapeIndex >= 0)
     {
-        unsigned int inputDimension = inputShape[boost::numeric_cast<unsigned int>(inputShapeIndex)];
-        unsigned int alphaDimension = alphaShape[boost::numeric_cast<unsigned int>(alphaShapeIndex)];
+        unsigned int inputDimension = inputShape[armnn::numeric_cast<unsigned int>(inputShapeIndex)];
+        unsigned int alphaDimension = alphaShape[armnn::numeric_cast<unsigned int>(alphaShapeIndex)];
 
         // Check that the inputs are broadcast compatible
         ARMNN_ASSERT_MSG(inputDimension == alphaDimension || inputDimension == 1 || alphaDimension == 1,
@@ -76,7 +78,7 @@
     // Loop backwards through the remaing part of the input shape (if any)
     while (inputShapeIndex >= 0)
     {
-        outputShape[outputShapeIndex] = inputShape[boost::numeric_cast<unsigned int>(inputShapeIndex)];
+        outputShape[outputShapeIndex] = inputShape[armnn::numeric_cast<unsigned int>(inputShapeIndex)];
 
         inputShapeIndex--;
         outputShapeIndex--;
@@ -85,7 +87,7 @@
     // Loop backwards through the remaing part of the alpha shape (if any)
     while (alphaShapeIndex >= 0)
     {
-        outputShape[outputShapeIndex] = alphaShape[boost::numeric_cast<unsigned int>(alphaShapeIndex)];
+        outputShape[outputShapeIndex] = alphaShape[armnn::numeric_cast<unsigned int>(alphaShapeIndex)];
 
         alphaShapeIndex--;
         outputShapeIndex--;
diff --git a/src/armnn/layers/SliceLayer.cpp b/src/armnn/layers/SliceLayer.cpp
index 0f1d438..bfa16e5 100644
--- a/src/armnn/layers/SliceLayer.cpp
+++ b/src/armnn/layers/SliceLayer.cpp
@@ -8,12 +8,11 @@
 #include "LayerCloneBase.hpp"
 
 #include <armnn/TypesUtils.hpp>
+#include <armnn/utility/NumericCast.hpp>
 
 #include <backendsCommon/WorkloadData.hpp>
 #include <backendsCommon/WorkloadFactory.hpp>
 
-#include <boost/numeric/conversion/cast.hpp>
-
 namespace armnn
 {
 
@@ -53,7 +52,7 @@
     IgnoreUnused(inputShapes);
     ARMNN_ASSERT(inputShapes.size() == 1);
 
-    TensorShape outputShape(boost::numeric_cast<unsigned int>(m_Param.m_Size.size()), m_Param.m_Size.data());
+    TensorShape outputShape(armnn::numeric_cast<unsigned int>(m_Param.m_Size.size()), m_Param.m_Size.data());
 
     return std::vector<TensorShape>({ outputShape });
 }
diff --git a/src/armnn/layers/StridedSliceLayer.cpp b/src/armnn/layers/StridedSliceLayer.cpp
index 9b1706b..957f585 100644
--- a/src/armnn/layers/StridedSliceLayer.cpp
+++ b/src/armnn/layers/StridedSliceLayer.cpp
@@ -6,11 +6,11 @@
 
 #include "LayerCloneBase.hpp"
 
+#include <armnn/utility/NumericCast.hpp>
+
 #include <backendsCommon/WorkloadData.hpp>
 #include <backendsCommon/WorkloadFactory.hpp>
 
-#include <boost/numeric/conversion/cast.hpp>
-
 namespace armnn
 {
 
@@ -82,7 +82,7 @@
 
         newSize = std::max(0, newSize);
 
-        outputShape.push_back(boost::numeric_cast<unsigned int>(newSize));
+        outputShape.push_back(armnn::numeric_cast<unsigned int>(newSize));
     }
 
     if (outputShape.size() == 0 && (inputShape.GetNumDimensions() - amountDimShrunk) == 0)
@@ -91,7 +91,7 @@
     }
 
     return std::vector<TensorShape>({
-        TensorShape(boost::numeric_cast<unsigned int>(outputShape.size()), &outputShape[0]) });
+        TensorShape(armnn::numeric_cast<unsigned int>(outputShape.size()), &outputShape[0]) });
 }
 
 void StridedSliceLayer::ValidateTensorShapesFromInputs()
diff --git a/src/armnn/test/CreateWorkload.hpp b/src/armnn/test/CreateWorkload.hpp
index b13b9b5..3f3cdc3 100644
--- a/src/armnn/test/CreateWorkload.hpp
+++ b/src/armnn/test/CreateWorkload.hpp
@@ -19,7 +19,6 @@
 #include <backendsCommon/CpuTensorHandle.hpp>
 
 #include <boost/test/unit_test.hpp>
-#include <boost/cast.hpp>
 
 #include <utility>
 
diff --git a/src/armnn/test/GraphTests.cpp b/src/armnn/test/GraphTests.cpp
index 5a17c1c..55a01fc 100644
--- a/src/armnn/test/GraphTests.cpp
+++ b/src/armnn/test/GraphTests.cpp
@@ -9,6 +9,7 @@
 
 #include <armnn/TypesUtils.hpp>
 #include <armnn/Exceptions.hpp>
+#include <armnn/utility/NumericCast.hpp>
 #include <armnn/utility/PolymorphicDowncast.hpp>
 
 #include <armnn/backends/IBackendInternal.hpp>
@@ -16,7 +17,6 @@
 #include <backendsCommon/CpuTensorHandle.hpp>
 #include <backendsCommon/TensorHandleFactoryRegistry.hpp>
 
-#include <boost/cast.hpp>
 #include <boost/test/unit_test.hpp>
 
 BOOST_AUTO_TEST_SUITE(Graph)
@@ -299,7 +299,7 @@
             if (origEdge.first->GetNameStr() == edge.first->GetNameStr() &&
                 origEdge.second->GetNameStr() == edge.second->GetNameStr())
             {
-                originalEdge = boost::numeric_cast<int>(i);
+                originalEdge = armnn::numeric_cast<int>(i);
             }
         }
 
diff --git a/src/armnn/test/SubgraphViewTests.cpp b/src/armnn/test/SubgraphViewTests.cpp
index a9467fb..a8cb797 100644
--- a/src/armnn/test/SubgraphViewTests.cpp
+++ b/src/armnn/test/SubgraphViewTests.cpp
@@ -4,11 +4,12 @@
 //
 #include <boost/test/unit_test.hpp>
 
-
 #include <Graph.hpp>
 #include <SubgraphView.hpp>
 #include <SubgraphViewSelector.hpp>
 
+#include <armnn/utility/NumericCast.hpp>
+
 #include <backendsCommon/CpuTensorHandle.hpp>
 #include <fstream>
 #include <map>
@@ -1374,8 +1375,8 @@
 
         if (subgraphs[0].get() != nullptr)
         {
-            unsigned int numInputSlots = boost::numeric_cast<unsigned int>(subgraphs[0]->GetInputSlots().size());
-            unsigned int numOutputSlots = boost::numeric_cast<unsigned int>(subgraphs[0]->GetOutputSlots().size());
+            unsigned int numInputSlots = armnn::numeric_cast<unsigned int>(subgraphs[0]->GetInputSlots().size());
+            unsigned int numOutputSlots = armnn::numeric_cast<unsigned int>(subgraphs[0]->GetOutputSlots().size());
 
             BOOST_TEST((numInputSlots == 1));
             BOOST_TEST((numOutputSlots == 1));
@@ -1456,11 +1457,11 @@
                       }
             );
 
-            unsigned int numInputSlots1  = boost::numeric_cast<unsigned int>(subgraphs[0]->GetInputSlots().size());
-            unsigned int numOutputSlots1 = boost::numeric_cast<unsigned int>(subgraphs[0]->GetOutputSlots().size());
+            unsigned int numInputSlots1  = armnn::numeric_cast<unsigned int>(subgraphs[0]->GetInputSlots().size());
+            unsigned int numOutputSlots1 = armnn::numeric_cast<unsigned int>(subgraphs[0]->GetOutputSlots().size());
 
-            unsigned int numInputSlots2  = boost::numeric_cast<unsigned int>(subgraphs[1]->GetInputSlots().size());
-            unsigned int numOutputSlots2 = boost::numeric_cast<unsigned int>(subgraphs[1]->GetOutputSlots().size());
+            unsigned int numInputSlots2  = armnn::numeric_cast<unsigned int>(subgraphs[1]->GetInputSlots().size());
+            unsigned int numOutputSlots2 = armnn::numeric_cast<unsigned int>(subgraphs[1]->GetOutputSlots().size());
 
             // Save sub-graph connections for comparison after substitution
             IOutputSlot* subgraph1InputConn  = subgraphs[0]->GetInputSlot(0)->GetConnection();
diff --git a/src/armnn/test/TensorHelpers.hpp b/src/armnn/test/TensorHelpers.hpp
index 4536035..d67cd5b 100644
--- a/src/armnn/test/TensorHelpers.hpp
+++ b/src/armnn/test/TensorHelpers.hpp
@@ -10,7 +10,6 @@
 #include <QuantizeHelper.hpp>
 
 #include <boost/multi_array.hpp>
-#include <boost/numeric/conversion/cast.hpp>
 #include <boost/random/uniform_real_distribution.hpp>
 #include <boost/random/mersenne_twister.hpp>
 #include <boost/test/tools/floating_point_comparison.hpp>
diff --git a/src/armnn/test/UnitTests.cpp b/src/armnn/test/UnitTests.cpp
index 032a49f..7b5ba37 100644
--- a/src/armnn/test/UnitTests.cpp
+++ b/src/armnn/test/UnitTests.cpp
@@ -7,6 +7,7 @@
 
 #include "UnitTests.hpp"
 #include <armnn/Logging.hpp>
+#include <armnn/utility/NumericCast.hpp>
 
 struct ConfigureLoggingFixture
 {
@@ -34,7 +35,7 @@
     std::streamsize write(const char* s, std::streamsize n)
     {
         // The given string is not null-terminated, so we need to copy it.
-        std::string s2(s, boost::numeric_cast<size_t>(n));
+        std::string s2(s, armnn::numeric_cast<size_t>(n));
         OutputDebugString(s2.c_str());
         return n;
     }
diff --git a/src/armnnConverter/ArmnnConverter.cpp b/src/armnnConverter/ArmnnConverter.cpp
index f143e69..21b89ea 100644
--- a/src/armnnConverter/ArmnnConverter.cpp
+++ b/src/armnnConverter/ArmnnConverter.cpp
@@ -21,6 +21,7 @@
 #endif
 
 #include <HeapProfiling.hpp>
+#include <armnn/utility/NumericCast.hpp>
 #include "armnn/utility/StringUtils.hpp"
 
 #include <boost/format.hpp>
@@ -49,7 +50,7 @@
             {
                 try
                 {
-                    result.push_back(boost::numeric_cast<unsigned int>(std::stoi((token))));
+                    result.push_back(armnn::numeric_cast<unsigned int>(std::stoi((token))));
                 }
                 catch (const std::exception&)
                 {
@@ -59,7 +60,7 @@
         }
     }
 
-    return armnn::TensorShape(boost::numeric_cast<unsigned int>(result.size()), result.data());
+    return armnn::TensorShape(armnn::numeric_cast<unsigned int>(result.size()), result.data());
 }
 
 bool CheckOption(const po::variables_map& vm,
diff --git a/src/armnnDeserializer/Deserializer.cpp b/src/armnnDeserializer/Deserializer.cpp
index 7143cdb..4c2f2f1 100644
--- a/src/armnnDeserializer/Deserializer.cpp
+++ b/src/armnnDeserializer/Deserializer.cpp
@@ -15,12 +15,12 @@
 #include <armnnUtils/Transpose.hpp>
 #include <armnn/utility/Assert.hpp>
 #include <armnn/utility/IgnoreUnused.hpp>
+#include <armnn/utility/NumericCast.hpp>
 
 #include <ParserHelper.hpp>
 #include <VerificationHelpers.hpp>
 
 #include <boost/format.hpp>
-#include <boost/numeric/conversion/cast.hpp>
 
 #include <fstream>
 #include <algorithm>
@@ -885,7 +885,7 @@
         unsigned int inputLayerIndex = 0xFFFFFFFF;
         if (GetFeatureVersions(graph).m_BindingIdScheme == 0)
         {
-            const unsigned int inputId = boost::numeric_cast<unsigned int>(graph->inputIds()->Get(i));
+            const unsigned int inputId = armnn::numeric_cast<unsigned int>(graph->inputIds()->Get(i));
             inputLayerIndex = GetLayerIndexInVector(graph, inputId);
         }
         else
@@ -924,7 +924,7 @@
         unsigned int outputLayerIndex = 0xFFFFFFFF;
         if (GetFeatureVersions(graph).m_BindingIdScheme == 0)
         {
-            const unsigned int outputId = boost::numeric_cast<unsigned int>(graph->outputIds()->Get(i));
+            const unsigned int outputId = armnn::numeric_cast<unsigned int>(graph->outputIds()->Get(i));
             outputLayerIndex = GetLayerIndexInVector(graph, outputId);
         }
         else
@@ -2006,7 +2006,7 @@
         }
 
         auto targetNumElements =
-           boost::numeric_cast<unsigned int>(
+           armnn::numeric_cast<unsigned int>(
                std::accumulate(targetDimsIn.begin(), targetDimsIn.end(), -1, std::multiplies<int32_t>()));
 
         auto stretchIndex = static_cast<size_t>(std::distance(targetDimsIn.begin(), stretchDim));
diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp
index 8a1f771..f85aae1 100644
--- a/src/armnnSerializer/Serializer.cpp
+++ b/src/armnnSerializer/Serializer.cpp
@@ -8,10 +8,10 @@
 #include <armnn/LstmParams.hpp>
 #include <armnn/QuantizedLstmParams.hpp>
 #include <armnn/utility/IgnoreUnused.hpp>
+#include <armnn/utility/NumericCast.hpp>
 
 #include <iostream>
 
-#include <boost/numeric/conversion/cast.hpp>
 #include <flatbuffers/util.h>
 
 #include "SerializerUtils.hpp"
@@ -1752,7 +1752,7 @@
 {
     flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
 
-    auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
+    auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
     stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
     return !stream.bad();
 }
diff --git a/src/armnnUtils/QuantizeHelper.hpp b/src/armnnUtils/QuantizeHelper.hpp
index 596ec98..231b841 100644
--- a/src/armnnUtils/QuantizeHelper.hpp
+++ b/src/armnnUtils/QuantizeHelper.hpp
@@ -6,6 +6,7 @@
 #pragma once
 
 #include <armnn/utility/IgnoreUnused.hpp>
+#include <armnn/utility/NumericCast.hpp>
 #include <armnn/TypesUtils.hpp>
 
 #include <BFloat16.hpp>
@@ -15,8 +16,6 @@
 #include <iterator>
 #include <vector>
 
-#include <boost/numeric/conversion/cast.hpp>
-
 namespace armnnUtils
 {
 
@@ -106,7 +105,7 @@
 std::vector<T> QuantizedVector(FloatIt first, FloatIt last, float qScale, int32_t qOffset)
 {
     std::vector<T> quantized;
-    quantized.reserve(boost::numeric_cast<size_t>(std::distance(first, last)));
+    quantized.reserve(armnn::numeric_cast<size_t>(std::distance(first, last)));
 
     for (auto it = first; it != last; ++it)
     {
diff --git a/src/armnnUtils/TensorUtils.cpp b/src/armnnUtils/TensorUtils.cpp
index 952c768..adaf811 100644
--- a/src/armnnUtils/TensorUtils.cpp
+++ b/src/armnnUtils/TensorUtils.cpp
@@ -7,9 +7,9 @@
 
 #include <armnn/backends/ITensorHandle.hpp>
 #include <armnn/utility/Assert.hpp>
+#include <armnn/utility/NumericCast.hpp>
 
 #include <boost/format.hpp>
-#include <boost/numeric/conversion/cast.hpp>
 
 using namespace armnn;
 
@@ -86,7 +86,7 @@
 {
     unsigned int outputDim = tensorShape.GetNumDimensions() + 1;
 
-    if (axis < -boost::numeric_cast<int>(outputDim) || axis > boost::numeric_cast<int>(tensorShape.GetNumDimensions()))
+    if (axis < -armnn::numeric_cast<int>(outputDim) || axis > armnn::numeric_cast<int>(tensorShape.GetNumDimensions()))
     {
         throw InvalidArgumentException(
             boost::str(boost::format("Invalid expansion axis %1% for %2%D input tensor. %3%") %
@@ -97,7 +97,7 @@
 
     if (axis < 0)
     {
-        axis = boost::numeric_cast<int>(outputDim) + axis;
+        axis = armnn::numeric_cast<int>(outputDim) + axis;
     }
 
     std::vector<unsigned int> outputShape;
@@ -126,14 +126,14 @@
 
 unsigned int GetUnsignedAxis(const unsigned int inputDimension, const int axis)
 {
-    ARMNN_ASSERT_MSG(axis < boost::numeric_cast<int>(inputDimension),
+    ARMNN_ASSERT_MSG(axis < armnn::numeric_cast<int>(inputDimension),
                      "Required axis index greater than number of dimensions.");
-    ARMNN_ASSERT_MSG(axis >= -boost::numeric_cast<int>(inputDimension),
+    ARMNN_ASSERT_MSG(axis >= -armnn::numeric_cast<int>(inputDimension),
                      "Required axis index lower than negative of the number of dimensions");
 
     unsigned int uAxis = axis < 0  ?
-                         inputDimension - boost::numeric_cast<unsigned int>(abs(axis))
-                         : boost::numeric_cast<unsigned int>(axis);
+                         inputDimension - armnn::numeric_cast<unsigned int>(abs(axis))
+                         : armnn::numeric_cast<unsigned int>(axis);
     return uAxis;
 }