profiler_operation_registry.hpp 2.12 KB
Newer Older
1
2
3
4
// SPDX-License-Identifier: MIT
// Copyright (c) 2018-2022, Advanced Micro Devices, Inc. All rights reserved.

#include <functional>
5
#include <iterator>
6
7
8
#include <map>
#include <optional>
#include <string_view>
9
#include <utility>
10
11
12

class ProfilerOperationRegistry final
{
13
14
    ProfilerOperationRegistry()  = default;
    ~ProfilerOperationRegistry() = default;
15
16
17
18
19

    public:
    using Operation = std::function<int(int, char*[])>;

    private:
20
21
22
    struct Entry final
    {
        explicit Entry(std::string_view description, Operation operation) noexcept
23
            : description_(description), operation_(std::move(operation))
24
25
26
27
28
29
30
31
        {
        }

        std::string_view description_;
        Operation operation_;
    };

    std::map<std::string_view, Entry> entries_;
32
33
34
35
36
37
38
39
40
41

    public:
    static ProfilerOperationRegistry& GetInstance()
    {
        static ProfilerOperationRegistry registry;
        return registry;
    }

    std::optional<Operation> Get(std::string_view name) const
    {
42
43
        const auto found = entries_.find(name);
        if(found == end(entries_))
44
45
46
47
        {
            return std::nullopt;
        }

48
        return (found->second).operation_;
49
50
    }

51
    bool Add(std::string_view name, std::string_view description, Operation operation)
52
    {
53
54
55
56
57
        return entries_
            .emplace(std::piecewise_construct,
                     std::forward_as_tuple(name),
                     std::forward_as_tuple(description, std::move(operation)))
            .second;
58
59
    }

60
61
62
63
64
65
66
67
68
69
    friend std::ostream& operator<<(std::ostream& stream, const ProfilerOperationRegistry& registry)
    {
        stream << "{\n";
        for(auto& [name, entry] : registry.entries_)
        {
            stream << "\t" << name << ": " << entry.description_ << "\n";
        }
        stream << "}";

        return stream;
70
    }
71
72
};

Po-Yen, Chen's avatar
Po-Yen, Chen committed
73
74
75
76
77
#define PP_CONCAT(x, y) PP_CONCAT_IMPL(x, y)
#define PP_CONCAT_IMPL(x, y) x##y

#define REGISTER_PROFILER_OPERATION(name, description, operation)              \
    static const bool PP_CONCAT(operation_registration_result_, __COUNTER__) = \
78
        ::ProfilerOperationRegistry::GetInstance().Add(name, description, operation)