// // Copyright © 2022 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include namespace armnn { // A bare bones Mock backend to enable unit testing of simple tensor manipulation features. class MockBackend : public IBackendInternal { public: MockBackend() = default; ~MockBackend() = default; static const BackendId& GetIdStatic(); const BackendId& GetId() const override { return GetIdStatic(); } IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override { IgnoreUnused(memoryManager); return nullptr; } IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override { return nullptr; }; }; class MockWorkloadFactory : public IWorkloadFactory { public: explicit MockWorkloadFactory(const std::shared_ptr& memoryManager); MockWorkloadFactory(); ~MockWorkloadFactory() {} const BackendId& GetBackendId() const override; bool SupportsSubTensors() const override { return false; } ARMNN_DEPRECATED_MSG("Use ITensorHandleFactory::CreateSubTensorHandle instead") std::unique_ptr CreateSubTensorHandle(ITensorHandle&, TensorShape const&, unsigned int const*) const override { return nullptr; } ARMNN_DEPRECATED_MSG("Use ITensorHandleFactory::CreateTensorHandle instead") std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo, const bool IsMemoryManaged = true) const override { IgnoreUnused(IsMemoryManaged); return std::make_unique(tensorInfo, m_MemoryManager); }; ARMNN_DEPRECATED_MSG("Use ITensorHandleFactory::CreateTensorHandle instead") std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo, DataLayout dataLayout, const bool IsMemoryManaged = true) const override { IgnoreUnused(dataLayout, IsMemoryManaged); return std::make_unique(tensorInfo, static_cast(MemorySource::Malloc)); }; ARMNN_DEPRECATED_MSG_REMOVAL_DATE( "Use ABI stable " "CreateWorkload(LayerType, const QueueDescriptor&, const WorkloadInfo& info) instead.", "22.11") std::unique_ptr CreateInput(const InputQueueDescriptor& descriptor, const WorkloadInfo& info) const override { if (info.m_InputTensorInfos.empty()) { throw InvalidArgumentException("MockWorkloadFactory::CreateInput: Input cannot be zero length"); } if (info.m_OutputTensorInfos.empty()) { throw InvalidArgumentException("MockWorkloadFactory::CreateInput: Output cannot be zero length"); } if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes()) { throw InvalidArgumentException( "MockWorkloadFactory::CreateInput: data input and output differ in byte count."); } return std::make_unique(descriptor, info); }; std::unique_ptr CreateWorkload(LayerType type, const QueueDescriptor& descriptor, const WorkloadInfo& info) const override; private: mutable std::shared_ptr m_MemoryManager; }; } // namespace armnn