meta_data_buffer.hpp 1.88 KB
Newer Older
Chao Liu's avatar
Chao Liu committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// SPDX-License-Identifier: MIT
// Copyright (c) 2018-2023, Advanced Micro Devices, Inc. All rights reserved.

#pragma once

namespace ck {

template <index_t MaxSize>
struct MetaDataBuffer
{
    __host__ __device__ constexpr MetaDataBuffer() : buffer_{}, size_{0} {}

    template <typename X, typename... Xs>
    __host__ __device__ constexpr MetaDataBuffer(const X& x, const Xs&... xs) : buffer_{}, size_{0}
    {
        Push(x, xs...);
    }

    template <typename T>
    __host__ __device__ constexpr void Push(const T& data)
    {
        if constexpr(!is_empty_v<T>)
        {
            constexpr index_t size = sizeof(T);

            auto tmp = bit_cast<Array<std::byte, size>>(data);

            for(int i = 0; i < size; i++)
            {
                buffer_(size_) = tmp[i];

                size_++;
            }
        }
    }

    template <typename X, typename... Xs>
    __host__ __device__ constexpr void Push(const X& x, const Xs&... xs)
    {
        Push(x);
        Push(xs...);
    }

    template <typename T>
    __host__ __device__ constexpr T Pop(index_t& pos) const
    {
        T data;

        if constexpr(!is_empty_v<T>)
        {
            constexpr index_t size = sizeof(T);

            Array<std::byte, size> tmp;

            for(int i = 0; i < size; i++)
            {
                tmp(i) = buffer_[pos];

                pos++;
            }

            data = bit_cast<T>(tmp);
        }

        return data;
    }

    template <typename T>
    __host__ __device__ constexpr T Get(index_t pos) const
    {
        constexpr index_t size = sizeof(T);

        Array<std::byte, size> tmp;

        for(int i = 0; i < size; i++)
        {
            tmp(i) = buffer_[pos];

            pos++;
        }

        auto data = bit_cast<T>(tmp);

        return data;
    }

    //
    Array<std::byte, MaxSize> buffer_;
    index_t size_ = 0;
};

} // namespace ck