profiler_operation_registry.hpp 1.94 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
9
10
11
12
13
14
15
16
17
#include <map>
#include <optional>
#include <string_view>

class ProfilerOperationRegistry final
{
    ProfilerOperationRegistry() = default;

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

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

        std::string_view description_;
        Operation operation_;
    };

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

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

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

46
        return (found->second).operation_;
47
48
    }

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

58
59
60
61
62
63
64
65
66
67
    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;
68
    }
69
70
};

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