blob: 9776ec91f9a0a4da70aa08606de22f1eb0f17b04 [file] [log] [blame]
Finn Williams510f6182020-02-21 11:14:08 +00001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
Finn Williams510f6182020-02-21 11:14:08 +00003// SPDX-License-Identifier: MIT
4//
5#pragma once
6
Jim Flynnbbfe6032020-07-20 16:57:44 +01007#include "ITimelineDecoder.hpp"
Finn Williams0c8cb992020-05-07 10:38:15 +01008
Matthew Bentham6ae43c42022-01-10 13:34:12 +00009#include <mutex>
10#include <utility>
Finn Williams510f6182020-02-21 11:14:08 +000011#include <vector>
Finn Williams8a2b4682020-02-26 10:25:26 +000012
Jim Flynnbbfe6032020-07-20 16:57:44 +010013namespace arm
Finn Williams510f6182020-02-21 11:14:08 +000014{
Jim Flynnbbfe6032020-07-20 16:57:44 +010015
16namespace pipe
Finn Williams8a2b4682020-02-26 10:25:26 +000017{
Jim Flynnbbfe6032020-07-20 16:57:44 +010018
Finn Williams510f6182020-02-21 11:14:08 +000019class TimelineDecoder : public ITimelineDecoder
20{
21
22public:
23
24 struct Model
25 {
26 std::vector<Entity> m_Entities;
27 std::vector<EventClass> m_EventClasses;
28 std::vector<Event> m_Events;
29 std::vector<Label> m_Labels;
30 std::vector<Relationship> m_Relationships;
31 };
32
33 using OnNewEntityCallback = void (*)(Model &, const Entity);
34 using OnNewEventClassCallback = void (*)(Model &, const EventClass);
35 using OnNewEventCallback = void (*)(Model &, const Event);
36 using OnNewLabelCallback = void (*)(Model &, const Label);
37 using OnNewRelationshipCallback = void (*)(Model &, const Relationship);
38
Keith Davis97da5e22020-03-05 16:25:28 +000039 virtual TimelineStatus CreateEntity(const Entity &) override;
40 virtual TimelineStatus CreateEventClass(const EventClass &) override;
41 virtual TimelineStatus CreateEvent(const Event &) override;
42 virtual TimelineStatus CreateLabel(const Label &) override;
43 virtual TimelineStatus CreateRelationship(const Relationship &) override;
Finn Williams510f6182020-02-21 11:14:08 +000044
Matthew Bentham6ae43c42022-01-10 13:34:12 +000045 template<class F>
46 decltype(auto) ApplyToModel(F&& f){
47 std::lock_guard<std::mutex> lock(m_ModelMutex);
48 return f(m_Model);
49 }
Finn Williams510f6182020-02-21 11:14:08 +000050
Keith Davis97da5e22020-03-05 16:25:28 +000051 TimelineStatus SetEntityCallback(const OnNewEntityCallback);
52 TimelineStatus SetEventClassCallback(const OnNewEventClassCallback);
53 TimelineStatus SetEventCallback(const OnNewEventCallback);
54 TimelineStatus SetLabelCallback(const OnNewLabelCallback);
55 TimelineStatus SetRelationshipCallback(const OnNewRelationshipCallback);
Finn Williams510f6182020-02-21 11:14:08 +000056
Finn Williamse6a2ccd2020-02-27 16:21:41 +000057 void SetDefaultCallbacks();
58
Finn Williams510f6182020-02-21 11:14:08 +000059 void print();
60
61private:
62 Model m_Model;
Matthew Bentham6ae43c42022-01-10 13:34:12 +000063 std::mutex m_ModelMutex;
Finn Williams510f6182020-02-21 11:14:08 +000064
65 OnNewEntityCallback m_OnNewEntityCallback;
66 OnNewEventClassCallback m_OnNewEventClassCallback;
67 OnNewEventCallback m_OnNewEventCallback;
68 OnNewLabelCallback m_OnNewLabelCallback;
69 OnNewRelationshipCallback m_OnNewRelationshipCallback;
70
71 void printLabels();
72 void printEntities();
73 void printEventClasses();
74 void printRelationships();
75 void printEvents();
76};
Finn Williams8a2b4682020-02-26 10:25:26 +000077
Jim Flynnbbfe6032020-07-20 16:57:44 +010078} // namespace pipe
Matthew Bentham6ae43c42022-01-10 13:34:12 +000079} // namespace arm