Coverage Report

Created: 2024-05-20 07:14

/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