profiler_operation_registry.hpp 2.14 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 <iostream>
6
#include <iterator>
7
8
9
#include <map>
#include <optional>
#include <string_view>
10
#include <utility>
11
12
13

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

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

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

        std::string_view description_;
        Operation operation_;
    };

    std::map<std::string_view, Entry> entries_;
33

Po-Yen, Chen's avatar
Po-Yen, Chen committed
34
35
36
37
38
39
40
41
42
43
44
45
    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;
    }

46
47
48
49
50
51
52
53
54
    public:
    static ProfilerOperationRegistry& GetInstance()
    {
        static ProfilerOperationRegistry registry;
        return registry;
    }

    std::optional<Operation> Get(std::string_view name) const
    {
55
56
        const auto found = entries_.find(name);
        if(found == end(entries_))
57
58
59
60
        {
            return std::nullopt;
        }

61
        return (found->second).operation_;
62
63
    }

64
    bool Add(std::string_view name, std::string_view description, Operation operation)
65
    {
66
67
68
69
70
        return entries_
            .emplace(std::piecewise_construct,
                     std::forward_as_tuple(name),
                     std::forward_as_tuple(description, std::move(operation)))
            .second;
71
    }
72
73
};

Po-Yen, Chen's avatar
Po-Yen, Chen committed
74
75
76
77
78
#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__) = \
79
        ::ProfilerOperationRegistry::GetInstance().Add(name, description, operation)