DecompressionRegistrarImpl.h 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/std/containers/vector.h>
  10. #include <AzCore/Memory/SystemAllocator.h>
  11. #include <Compression/DecompressionInterfaceAPI.h>
  12. namespace Compression
  13. {
  14. class DecompressionRegistrarImpl final
  15. : public DecompressionRegistrarInterface
  16. {
  17. public:
  18. AZ_TYPE_INFO_WITH_NAME_DECL(DecompressionRegistrarImpl);
  19. AZ_RTTI_NO_TYPE_INFO_DECL();
  20. AZ_CLASS_ALLOCATOR_DECL;
  21. DecompressionRegistrarImpl();
  22. ~DecompressionRegistrarImpl();
  23. void VisitDecompressionInterfaces(const VisitDecompressionInterfaceCallback&) const override;
  24. //! Registers a decompression interface with a standard deleter
  25. AZ::Outcome<void, AZStd::unique_ptr<IDecompressionInterface>> RegisterDecompressionInterface(
  26. CompressionAlgorithmId algorithmId,
  27. AZStd::unique_ptr<IDecompressionInterface> decompressionInterface) override;
  28. //! Registers a decompression interface with a null deleter
  29. bool RegisterDecompressionInterface(CompressionAlgorithmId algorithmId, IDecompressionInterface& decompressionInterface) override;
  30. bool UnregisterDecompressionInterface(CompressionAlgorithmId algorithmId) override;
  31. [[nodiscard]] IDecompressionInterface* FindDecompressionInterface(CompressionAlgorithmId algorithmId) const override;
  32. [[nodiscard]] IDecompressionInterface* FindDecompressionInterface(AZStd::string_view algorithmName) const override;
  33. [[nodiscard]] bool IsRegistered(CompressionAlgorithmId algorithmId) const override;
  34. struct DecompressionInterfaceDeleter
  35. {
  36. DecompressionInterfaceDeleter();
  37. DecompressionInterfaceDeleter(bool shouldDelete);
  38. void operator()(IDecompressionInterface* ptr) const;
  39. bool m_delete{ true };
  40. };
  41. private:
  42. using DecompressionInterfacePtr = AZStd::unique_ptr<IDecompressionInterface, DecompressionInterfaceDeleter>;
  43. //! Helper function that is used to register a decompression interface into the decompression interface array
  44. //! while taking into account whether the decompression interface should be owned by this registrar
  45. //! @param compressionAlgorithmId Unique Id of the decompression interface to register with this registrar
  46. //! @param decompressionInterface unique_ptr to decompression interface to register
  47. //! @return outcome which indicates whether the decompression interface was registered with the decompression interface array
  48. //! On success an empty Success outcome is returned
  49. //! On failure, the supplied decompression interface parameter is returned back to the caller
  50. [[nodiscard]] AZ::Outcome<void, DecompressionInterfacePtr> RegisterDecompressionInterfaceImpl(
  51. CompressionAlgorithmId algorithmId, DecompressionInterfacePtr decompressionInterface);
  52. struct DecompressionIdIndexEntry
  53. {
  54. CompressionAlgorithmId m_id;
  55. DecompressionInterfacePtr m_decompressionInterface;
  56. };
  57. using IdToDecompressionInterfaceMap = AZStd::vector<DecompressionIdIndexEntry>;
  58. //! Searches within the decompression interface array for the decompression interface registered with the specified id
  59. //! @param compressionAlgorithmId Unique Id of decompression interface to locate
  60. //! @return iterator pointing the decompression interface registered with the specified CompressionAlgorithmId
  61. //! NOTE: It is responsibility of the caller to lock the decompression interface mutex to protect the search
  62. typename IdToDecompressionInterfaceMap::const_iterator FindDecompressionInterfaceImpl(CompressionAlgorithmId compressionAlgorithmId) const;
  63. //! Contains the registered decompression interfaces
  64. //! Sorted to provide O(Log N) search
  65. IdToDecompressionInterfaceMap m_decompressionInterfaces;
  66. //! Protects modifications to the decompression interfaces container
  67. mutable AZStd::mutex m_decompressionInterfaceMutex;
  68. };
  69. }// namespace Compression