1254721Semaste//===-- SBBroadcaster.cpp ---------------------------------------*- C++ -*-===//
2254721Semaste//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6254721Semaste//
7254721Semaste//===----------------------------------------------------------------------===//
8254721Semaste
9353358Sdim#include "SBReproducerPrivate.h"
10344779Sdim#include "lldb/Utility/Broadcaster.h"
11254721Semaste
12254721Semaste#include "lldb/API/SBBroadcaster.h"
13314564Sdim#include "lldb/API/SBEvent.h"
14254721Semaste#include "lldb/API/SBListener.h"
15254721Semaste
16254721Semasteusing namespace lldb;
17254721Semasteusing namespace lldb_private;
18254721Semaste
19353358SdimSBBroadcaster::SBBroadcaster() : m_opaque_sp(), m_opaque_ptr(nullptr) {
20353358Sdim  LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBBroadcaster);
21353358Sdim}
22254721Semaste
23314564SdimSBBroadcaster::SBBroadcaster(const char *name)
24353358Sdim    : m_opaque_sp(new Broadcaster(nullptr, name)), m_opaque_ptr(nullptr) {
25353358Sdim  LLDB_RECORD_CONSTRUCTOR(SBBroadcaster, (const char *), name);
26353358Sdim
27314564Sdim  m_opaque_ptr = m_opaque_sp.get();
28254721Semaste}
29254721Semaste
30314564SdimSBBroadcaster::SBBroadcaster(lldb_private::Broadcaster *broadcaster, bool owns)
31353358Sdim    : m_opaque_sp(owns ? broadcaster : nullptr), m_opaque_ptr(broadcaster) {}
32254721Semaste
33314564SdimSBBroadcaster::SBBroadcaster(const SBBroadcaster &rhs)
34353358Sdim    : m_opaque_sp(rhs.m_opaque_sp), m_opaque_ptr(rhs.m_opaque_ptr) {
35353358Sdim  LLDB_RECORD_CONSTRUCTOR(SBBroadcaster, (const lldb::SBBroadcaster &), rhs);
36353358Sdim}
37254721Semaste
38314564Sdimconst SBBroadcaster &SBBroadcaster::operator=(const SBBroadcaster &rhs) {
39353358Sdim  LLDB_RECORD_METHOD(const lldb::SBBroadcaster &,
40353358Sdim                     SBBroadcaster, operator=,(const lldb::SBBroadcaster &),
41353358Sdim                     rhs);
42353358Sdim
43314564Sdim  if (this != &rhs) {
44314564Sdim    m_opaque_sp = rhs.m_opaque_sp;
45314564Sdim    m_opaque_ptr = rhs.m_opaque_ptr;
46314564Sdim  }
47353358Sdim  return LLDB_RECORD_RESULT(*this);
48254721Semaste}
49254721Semaste
50353358SdimSBBroadcaster::~SBBroadcaster() { reset(nullptr, false); }
51254721Semaste
52314564Sdimvoid SBBroadcaster::BroadcastEventByType(uint32_t event_type, bool unique) {
53353358Sdim  LLDB_RECORD_METHOD(void, SBBroadcaster, BroadcastEventByType,
54353358Sdim                     (uint32_t, bool), event_type, unique);
55254721Semaste
56353358Sdim  if (m_opaque_ptr == nullptr)
57314564Sdim    return;
58254721Semaste
59314564Sdim  if (unique)
60314564Sdim    m_opaque_ptr->BroadcastEventIfUnique(event_type);
61314564Sdim  else
62314564Sdim    m_opaque_ptr->BroadcastEvent(event_type);
63254721Semaste}
64254721Semaste
65314564Sdimvoid SBBroadcaster::BroadcastEvent(const SBEvent &event, bool unique) {
66353358Sdim  LLDB_RECORD_METHOD(void, SBBroadcaster, BroadcastEvent,
67353358Sdim                     (const lldb::SBEvent &, bool), event, unique);
68254721Semaste
69353358Sdim  if (m_opaque_ptr == nullptr)
70314564Sdim    return;
71254721Semaste
72314564Sdim  EventSP event_sp = event.GetSP();
73314564Sdim  if (unique)
74314564Sdim    m_opaque_ptr->BroadcastEventIfUnique(event_sp);
75314564Sdim  else
76314564Sdim    m_opaque_ptr->BroadcastEvent(event_sp);
77254721Semaste}
78254721Semaste
79314564Sdimvoid SBBroadcaster::AddInitialEventsToListener(const SBListener &listener,
80314564Sdim                                               uint32_t requested_events) {
81353358Sdim  LLDB_RECORD_METHOD(void, SBBroadcaster, AddInitialEventsToListener,
82353358Sdim                     (const lldb::SBListener &, uint32_t), listener,
83353358Sdim                     requested_events);
84353358Sdim
85314564Sdim  if (m_opaque_ptr)
86314564Sdim    m_opaque_ptr->AddInitialEventsToListener(listener.m_opaque_sp,
87314564Sdim                                             requested_events);
88254721Semaste}
89254721Semaste
90314564Sdimuint32_t SBBroadcaster::AddListener(const SBListener &listener,
91314564Sdim                                    uint32_t event_mask) {
92353358Sdim  LLDB_RECORD_METHOD(uint32_t, SBBroadcaster, AddListener,
93353358Sdim                     (const lldb::SBListener &, uint32_t), listener,
94353358Sdim                     event_mask);
95353358Sdim
96314564Sdim  if (m_opaque_ptr)
97314564Sdim    return m_opaque_ptr->AddListener(listener.m_opaque_sp, event_mask);
98314564Sdim  return 0;
99254721Semaste}
100254721Semaste
101314564Sdimconst char *SBBroadcaster::GetName() const {
102353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBBroadcaster, GetName);
103353358Sdim
104314564Sdim  if (m_opaque_ptr)
105314564Sdim    return m_opaque_ptr->GetBroadcasterName().GetCString();
106353358Sdim  return nullptr;
107254721Semaste}
108254721Semaste
109314564Sdimbool SBBroadcaster::EventTypeHasListeners(uint32_t event_type) {
110353358Sdim  LLDB_RECORD_METHOD(bool, SBBroadcaster, EventTypeHasListeners, (uint32_t),
111353358Sdim                     event_type);
112353358Sdim
113314564Sdim  if (m_opaque_ptr)
114314564Sdim    return m_opaque_ptr->EventTypeHasListeners(event_type);
115314564Sdim  return false;
116254721Semaste}
117254721Semaste
118314564Sdimbool SBBroadcaster::RemoveListener(const SBListener &listener,
119314564Sdim                                   uint32_t event_mask) {
120353358Sdim  LLDB_RECORD_METHOD(bool, SBBroadcaster, RemoveListener,
121353358Sdim                     (const lldb::SBListener &, uint32_t), listener,
122353358Sdim                     event_mask);
123353358Sdim
124314564Sdim  if (m_opaque_ptr)
125314564Sdim    return m_opaque_ptr->RemoveListener(listener.m_opaque_sp, event_mask);
126314564Sdim  return false;
127254721Semaste}
128254721Semaste
129314564SdimBroadcaster *SBBroadcaster::get() const { return m_opaque_ptr; }
130254721Semaste
131314564Sdimvoid SBBroadcaster::reset(Broadcaster *broadcaster, bool owns) {
132314564Sdim  if (owns)
133314564Sdim    m_opaque_sp.reset(broadcaster);
134314564Sdim  else
135314564Sdim    m_opaque_sp.reset();
136314564Sdim  m_opaque_ptr = broadcaster;
137254721Semaste}
138254721Semaste
139353358Sdimbool SBBroadcaster::IsValid() const {
140353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBroadcaster, IsValid);
141353358Sdim  return this->operator bool();
142353358Sdim}
143353358SdimSBBroadcaster::operator bool() const {
144353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBroadcaster, operator bool);
145254721Semaste
146353358Sdim  return m_opaque_ptr != nullptr;
147353358Sdim}
148353358Sdim
149314564Sdimvoid SBBroadcaster::Clear() {
150353358Sdim  LLDB_RECORD_METHOD_NO_ARGS(void, SBBroadcaster, Clear);
151353358Sdim
152314564Sdim  m_opaque_sp.reset();
153353358Sdim  m_opaque_ptr = nullptr;
154254721Semaste}
155254721Semaste
156314564Sdimbool SBBroadcaster::operator==(const SBBroadcaster &rhs) const {
157353358Sdim  LLDB_RECORD_METHOD_CONST(
158353358Sdim      bool, SBBroadcaster, operator==,(const lldb::SBBroadcaster &), rhs);
159353358Sdim
160314564Sdim  return m_opaque_ptr == rhs.m_opaque_ptr;
161254721Semaste}
162254721Semaste
163314564Sdimbool SBBroadcaster::operator!=(const SBBroadcaster &rhs) const {
164353358Sdim  LLDB_RECORD_METHOD_CONST(
165353358Sdim      bool, SBBroadcaster, operator!=,(const lldb::SBBroadcaster &), rhs);
166353358Sdim
167314564Sdim  return m_opaque_ptr != rhs.m_opaque_ptr;
168254721Semaste}
169254721Semaste
170314564Sdimbool SBBroadcaster::operator<(const SBBroadcaster &rhs) const {
171353358Sdim  LLDB_RECORD_METHOD_CONST(
172353358Sdim      bool, SBBroadcaster, operator<,(const lldb::SBBroadcaster &), rhs);
173353358Sdim
174314564Sdim  return m_opaque_ptr < rhs.m_opaque_ptr;
175254721Semaste}
176353358Sdim
177353358Sdimnamespace lldb_private {
178353358Sdimnamespace repro {
179353358Sdim
180353358Sdimtemplate <>
181353358Sdimvoid RegisterMethods<SBBroadcaster>(Registry &R) {
182353358Sdim  LLDB_REGISTER_CONSTRUCTOR(SBBroadcaster, ());
183353358Sdim  LLDB_REGISTER_CONSTRUCTOR(SBBroadcaster, (const char *));
184353358Sdim  LLDB_REGISTER_CONSTRUCTOR(SBBroadcaster, (const lldb::SBBroadcaster &));
185353358Sdim  LLDB_REGISTER_METHOD(
186353358Sdim      const lldb::SBBroadcaster &,
187353358Sdim      SBBroadcaster, operator=,(const lldb::SBBroadcaster &));
188353358Sdim  LLDB_REGISTER_METHOD(void, SBBroadcaster, BroadcastEventByType,
189353358Sdim                       (uint32_t, bool));
190353358Sdim  LLDB_REGISTER_METHOD(void, SBBroadcaster, BroadcastEvent,
191353358Sdim                       (const lldb::SBEvent &, bool));
192353358Sdim  LLDB_REGISTER_METHOD(void, SBBroadcaster, AddInitialEventsToListener,
193353358Sdim                       (const lldb::SBListener &, uint32_t));
194353358Sdim  LLDB_REGISTER_METHOD(uint32_t, SBBroadcaster, AddListener,
195353358Sdim                       (const lldb::SBListener &, uint32_t));
196353358Sdim  LLDB_REGISTER_METHOD_CONST(const char *, SBBroadcaster, GetName, ());
197353358Sdim  LLDB_REGISTER_METHOD(bool, SBBroadcaster, EventTypeHasListeners,
198353358Sdim                       (uint32_t));
199353358Sdim  LLDB_REGISTER_METHOD(bool, SBBroadcaster, RemoveListener,
200353358Sdim                       (const lldb::SBListener &, uint32_t));
201353358Sdim  LLDB_REGISTER_METHOD_CONST(bool, SBBroadcaster, IsValid, ());
202353358Sdim  LLDB_REGISTER_METHOD_CONST(bool, SBBroadcaster, operator bool, ());
203353358Sdim  LLDB_REGISTER_METHOD(void, SBBroadcaster, Clear, ());
204353358Sdim  LLDB_REGISTER_METHOD_CONST(
205353358Sdim      bool, SBBroadcaster, operator==,(const lldb::SBBroadcaster &));
206353358Sdim  LLDB_REGISTER_METHOD_CONST(
207353358Sdim      bool, SBBroadcaster, operator!=,(const lldb::SBBroadcaster &));
208353358Sdim  LLDB_REGISTER_METHOD_CONST(
209353358Sdim      bool, SBBroadcaster, operator<,(const lldb::SBBroadcaster &));
210353358Sdim}
211353358Sdim
212353358Sdim}
213353358Sdim}
214