/src/skia/include/private/base/SkAnySubclass.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2023 Google LLC |
3 | | * |
4 | | * Use of this source code is governed by a BSD-style license that can be |
5 | | * found in the LICENSE file. |
6 | | */ |
7 | | |
8 | | #ifndef SkAnySubclass_DEFINED |
9 | | #define SkAnySubclass_DEFINED |
10 | | |
11 | | #include "include/private/base/SkAssert.h" |
12 | | |
13 | | #include <cstddef> |
14 | | #include <new> |
15 | | #include <type_traits> // IWYU pragma: keep |
16 | | #include <utility> |
17 | | |
18 | | /** |
19 | | * Stores any subclass `T` of `Base`, where sizeof(T) <= `Size`, without using the heap. |
20 | | * Doesn't need advance knowledge of T, so it's particularly suited to platform or backend |
21 | | * implementations of a generic interface, where the set of possible subclasses is finite and |
22 | | * known, but can't be made available at compile-time. |
23 | | */ |
24 | | template <typename Base, size_t Size> |
25 | | class SkAnySubclass { |
26 | | public: |
27 | 1.26M | SkAnySubclass() = default; SkAnySubclass<GrBackendFormatData, 80ul>::SkAnySubclass() Line | Count | Source | 27 | 1.26M | SkAnySubclass() = default; |
Unexecuted instantiation: SkAnySubclass<GrBackendTextureData, 176ul>::SkAnySubclass() Unexecuted instantiation: SkAnySubclass<GrBackendRenderTargetData, 176ul>::SkAnySubclass() Unexecuted instantiation: SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::SkAnySubclass() Unexecuted instantiation: SkAnySubclass<GrBackendSemaphoreData, 24ul>::SkAnySubclass() |
28 | 1.26M | ~SkAnySubclass() { |
29 | 1.26M | this->reset(); |
30 | 1.26M | } SkAnySubclass<GrBackendFormatData, 80ul>::~SkAnySubclass() Line | Count | Source | 28 | 1.26M | ~SkAnySubclass() { | 29 | 1.26M | this->reset(); | 30 | 1.26M | } |
Unexecuted instantiation: SkAnySubclass<GrBackendTextureData, 176ul>::~SkAnySubclass() Unexecuted instantiation: SkAnySubclass<GrBackendRenderTargetData, 176ul>::~SkAnySubclass() Unexecuted instantiation: SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::~SkAnySubclass() Unexecuted instantiation: SkAnySubclass<GrBackendSemaphoreData, 24ul>::~SkAnySubclass() |
31 | | |
32 | | SkAnySubclass(const SkAnySubclass&) = delete; |
33 | | SkAnySubclass& operator=(const SkAnySubclass&) = delete; |
34 | | SkAnySubclass(SkAnySubclass&&) = delete; |
35 | | SkAnySubclass& operator=(SkAnySubclass&&) = delete; |
36 | | |
37 | | template <typename T, typename... Args> |
38 | 0 | void emplace(Args&&... args) { |
39 | 0 | static_assert(std::is_base_of_v<Base, T>); |
40 | 0 | static_assert(sizeof(T) <= Size); |
41 | | // We're going to clean up our stored object by calling ~Base: |
42 | 0 | static_assert(std::has_virtual_destructor_v<Base> || std::is_trivially_destructible_v<T>); |
43 | 0 | SkASSERT(!fValid); |
44 | 0 | new (fData) T(std::forward<Args>(args)...); |
45 | 0 | fValid = true; |
46 | 0 | } Unexecuted instantiation: void SkAnySubclass<GrBackendFormatData, 80ul>::emplace<GrVkBackendFormatData, VkFormat const&, skgpu::VulkanYcbcrConversionInfo const&>(VkFormat const&, skgpu::VulkanYcbcrConversionInfo const&) Unexecuted instantiation: void SkAnySubclass<GrBackendTextureData, 176ul>::emplace<GrVkBackendTextureData, GrVkImageInfo const&, sk_sp<skgpu::MutableTextureState> const&>(GrVkImageInfo const&, sk_sp<skgpu::MutableTextureState> const&) Unexecuted instantiation: void SkAnySubclass<GrBackendRenderTargetData, 176ul>::emplace<GrVkBackendRenderTargetData, GrVkImageInfo const&, sk_sp<skgpu::MutableTextureState> const&>(GrVkImageInfo const&, sk_sp<skgpu::MutableTextureState> const&) Unexecuted instantiation: void SkAnySubclass<GrBackendFormatData, 80ul>::emplace<GrVkBackendFormatData, GrVkBackendFormatData const&>(GrVkBackendFormatData const&) Unexecuted instantiation: void SkAnySubclass<GrBackendTextureData, 176ul>::emplace<GrVkBackendTextureData, GrVkBackendTextureData const&>(GrVkBackendTextureData const&) Unexecuted instantiation: void SkAnySubclass<GrBackendRenderTargetData, 176ul>::emplace<GrVkBackendRenderTargetData, GrVkBackendRenderTargetData const&>(GrVkBackendRenderTargetData const&) Unexecuted instantiation: void SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::emplace<skgpu::MutableTextureStates::VulkanMutableTextureState, VkImageLayout const&, unsigned int const&>(VkImageLayout const&, unsigned int const&) Unexecuted instantiation: void SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::emplace<skgpu::MutableTextureStates::VulkanMutableTextureState, skgpu::MutableTextureStates::VulkanMutableTextureState const&>(skgpu::MutableTextureStates::VulkanMutableTextureState const&) Unexecuted instantiation: void SkAnySubclass<GrBackendSemaphoreData, 24ul>::emplace<GrVkBackendSemaphoreData, VkSemaphore_T* const&>(VkSemaphore_T* const&) Unexecuted instantiation: void SkAnySubclass<GrBackendSemaphoreData, 24ul>::emplace<GrVkBackendSemaphoreData, GrVkBackendSemaphoreData&>(GrVkBackendSemaphoreData&) Unexecuted instantiation: void SkAnySubclass<GrBackendFormatData, 80ul>::emplace<GrVkBackendFormatData, VkFormat const&, skgpu::VulkanYcbcrConversionInfo const&>(VkFormat const&, skgpu::VulkanYcbcrConversionInfo const&) Unexecuted instantiation: void SkAnySubclass<GrBackendTextureData, 176ul>::emplace<GrVkBackendTextureData, GrVkImageInfo const&, sk_sp<skgpu::MutableTextureState> const&>(GrVkImageInfo const&, sk_sp<skgpu::MutableTextureState> const&) Unexecuted instantiation: void SkAnySubclass<GrBackendRenderTargetData, 176ul>::emplace<GrVkBackendRenderTargetData, GrVkImageInfo const&, sk_sp<skgpu::MutableTextureState> const&>(GrVkImageInfo const&, sk_sp<skgpu::MutableTextureState> const&) Unexecuted instantiation: void SkAnySubclass<GrBackendFormatData, 80ul>::emplace<GrVkBackendFormatData, GrVkBackendFormatData const&>(GrVkBackendFormatData const&) Unexecuted instantiation: void SkAnySubclass<GrBackendTextureData, 176ul>::emplace<GrVkBackendTextureData, GrVkBackendTextureData const&>(GrVkBackendTextureData const&) Unexecuted instantiation: void SkAnySubclass<GrBackendRenderTargetData, 176ul>::emplace<GrVkBackendRenderTargetData, GrVkBackendRenderTargetData const&>(GrVkBackendRenderTargetData const&) Unexecuted instantiation: void SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::emplace<skgpu::MutableTextureStates::VulkanMutableTextureState, VkImageLayout const&, unsigned int const&>(VkImageLayout const&, unsigned int const&) Unexecuted instantiation: void SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::emplace<skgpu::MutableTextureStates::VulkanMutableTextureState, skgpu::MutableTextureStates::VulkanMutableTextureState const&>(skgpu::MutableTextureStates::VulkanMutableTextureState const&) Unexecuted instantiation: void SkAnySubclass<GrBackendSemaphoreData, 24ul>::emplace<GrVkBackendSemaphoreData, VkSemaphore_T* const&>(VkSemaphore_T* const&) Unexecuted instantiation: void SkAnySubclass<GrBackendSemaphoreData, 24ul>::emplace<GrVkBackendSemaphoreData, GrVkBackendSemaphoreData&>(GrVkBackendSemaphoreData&) |
47 | | |
48 | 1.26M | void reset() { |
49 | 1.26M | if (fValid) { |
50 | 0 | this->get()->~Base(); |
51 | 0 | } |
52 | 1.26M | fValid = false; |
53 | 1.26M | } SkAnySubclass<GrBackendFormatData, 80ul>::reset() Line | Count | Source | 48 | 1.26M | void reset() { | 49 | 1.26M | if (fValid) { | 50 | 0 | this->get()->~Base(); | 51 | 0 | } | 52 | 1.26M | fValid = false; | 53 | 1.26M | } |
Unexecuted instantiation: SkAnySubclass<GrBackendTextureData, 176ul>::reset() Unexecuted instantiation: SkAnySubclass<GrBackendRenderTargetData, 176ul>::reset() Unexecuted instantiation: SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::reset() Unexecuted instantiation: SkAnySubclass<GrBackendSemaphoreData, 24ul>::reset() |
54 | | |
55 | 0 | const Base* get() const { |
56 | 0 | SkASSERT(fValid); |
57 | 0 | return std::launder(reinterpret_cast<const Base*>(fData)); |
58 | 0 | } Unexecuted instantiation: SkAnySubclass<GrBackendFormatData, 80ul>::get() const Unexecuted instantiation: SkAnySubclass<GrBackendTextureData, 176ul>::get() const Unexecuted instantiation: SkAnySubclass<GrBackendRenderTargetData, 176ul>::get() const Unexecuted instantiation: SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::get() const Unexecuted instantiation: SkAnySubclass<GrBackendSemaphoreData, 24ul>::get() const Unexecuted instantiation: SkAnySubclass<GrBackendFormatData, 80ul>::get() const Unexecuted instantiation: SkAnySubclass<GrBackendTextureData, 176ul>::get() const Unexecuted instantiation: SkAnySubclass<GrBackendRenderTargetData, 176ul>::get() const Unexecuted instantiation: SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::get() const Unexecuted instantiation: SkAnySubclass<GrBackendSemaphoreData, 24ul>::get() const |
59 | | |
60 | 0 | Base* get() { |
61 | 0 | SkASSERT(fValid); |
62 | 0 | return std::launder(reinterpret_cast<Base*>(fData)); |
63 | 0 | } Unexecuted instantiation: SkAnySubclass<GrBackendFormatData, 80ul>::get() Unexecuted instantiation: SkAnySubclass<GrBackendTextureData, 176ul>::get() Unexecuted instantiation: SkAnySubclass<GrBackendRenderTargetData, 176ul>::get() Unexecuted instantiation: SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::get() Unexecuted instantiation: SkAnySubclass<GrBackendSemaphoreData, 24ul>::get() Unexecuted instantiation: SkAnySubclass<GrBackendFormatData, 80ul>::get() Unexecuted instantiation: SkAnySubclass<GrBackendTextureData, 176ul>::get() Unexecuted instantiation: SkAnySubclass<GrBackendRenderTargetData, 176ul>::get() Unexecuted instantiation: SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::get() Unexecuted instantiation: SkAnySubclass<GrBackendSemaphoreData, 24ul>::get() |
64 | | |
65 | 0 | Base* operator->() { return this->get(); } Unexecuted instantiation: SkAnySubclass<GrBackendFormatData, 80ul>::operator->() Unexecuted instantiation: SkAnySubclass<GrBackendTextureData, 176ul>::operator->() Unexecuted instantiation: SkAnySubclass<GrBackendRenderTargetData, 176ul>::operator->() |
66 | 0 | const Base* operator->() const { return this->get(); } Unexecuted instantiation: SkAnySubclass<GrBackendFormatData, 80ul>::operator->() const Unexecuted instantiation: SkAnySubclass<GrBackendTextureData, 176ul>::operator->() const Unexecuted instantiation: SkAnySubclass<GrBackendRenderTargetData, 176ul>::operator->() const Unexecuted instantiation: SkAnySubclass<skgpu::MutableTextureStateData, 16ul>::operator->() const Unexecuted instantiation: SkAnySubclass<GrBackendSemaphoreData, 24ul>::operator->() const |
67 | | |
68 | | private: |
69 | | alignas(8) std::byte fData[Size]; |
70 | | bool fValid = false; |
71 | | }; |
72 | | |
73 | | #endif // SkAnySubclass_DEFINED |