dxFeed Graal CXX API v8.1.0
Loading...
Searching...
No Matches
EntityManager.hpp
1// Copyright (c) 2026 Devexperts LLC.
2// SPDX-License-Identifier: MPL-2.0
3
4#pragma once
5
6#include "../Conf.hpp"
7
9
10#include "../Common.hpp"
11#include "../Id.hpp"
12#include "../NonCopyable.hpp"
13
14#include <memory>
15#include <mutex>
16#include <optional>
17#include <unordered_map>
18
20
21template <typename EntityType_, typename EntityIdType_ = EntityType_>
22struct EntityManager : private NonCopyable<EntityManager<EntityType_, EntityIdType_>> {
23 using EntityType = EntityType_;
24 using EntityIdType = EntityIdType_;
25
26#if DXFCPP_DEBUG == 1
27 static std::string getDebugName() {
28 return typeid(EntityManager<EntityType_, EntityIdType_>).name();
29 }
30#endif
31
32 std::unordered_map<Id<EntityIdType>, std::shared_ptr<EntityType>> entitiesById_;
33 std::unordered_map<std::shared_ptr<EntityType>, Id<EntityIdType>> idsByEntities_;
34 std::size_t lastId_{0};
35 std::mutex mutex_;
36
37 EntityManager() : entitiesById_{}, idsByEntities_{}, mutex_{} {
38 if constexpr (Debugger::isDebug) {
39 Debugger::debug(getDebugName() + "()");
40 }
41 }
42
43 public:
44 Id<EntityIdType> registerEntity(std::shared_ptr<EntityType> entity) {
45 if constexpr (Debugger::isDebug) {
46 Debugger::debug(getDebugName() + "::registerEntity(" + entity->toString() + ")");
47 }
48
49 std::lock_guard lockGuard{mutex_};
50
51 if (auto it = idsByEntities_.find(entity); it != idsByEntities_.end()) {
52 return it->second;
53 }
54
55 auto id = Id<EntityIdType>::getNext();
56
57 entitiesById_[id] = entity;
58 idsByEntities_.emplace(std::make_pair(entity, id));
59 lastId_ = id.getValue();
60
61 return id;
62 }
63
64 std::size_t getLastId() {
65 std::lock_guard lockGuard{mutex_};
66
67 return lastId_;
68 }
69
70 bool unregisterEntity(std::shared_ptr<EntityType> entity) {
71 if constexpr (Debugger::isDebug) {
72 Debugger::debug(getDebugName() + "::unregisterEntity(" + entity->toString() + ")");
73 }
74
75 std::lock_guard lockGuard{mutex_};
76
77 if (auto it = idsByEntities_.find(entity); it != idsByEntities_.end()) {
78 entitiesById_.erase(it->second);
79 idsByEntities_.erase(entity);
80
81 return true;
82 }
83
84 return false;
85 }
86
87 bool unregisterEntity(Id<EntityIdType> id) {
88 if constexpr (Debugger::isDebug) {
89 Debugger::debug(getDebugName() + "::unregisterEntity(id = " + std::to_string(id.getValue()) + ")");
90 }
91
92 std::lock_guard lockGuard{mutex_};
93
94 if (auto it = entitiesById_.find(id); it != entitiesById_.end()) {
95 idsByEntities_.erase(it->second);
96 entitiesById_.erase(id);
97
98 return true;
99 }
100
101 return false;
102 }
103
104 template <typename H> bool unregisterEntity(H *handle) {
105 return unregisterEntity(Id<EntityIdType>::template from<H>(handle));
106 }
107
108 template <typename H> bool unregisterEntity(const H *handle) {
109 return unregisterEntity(Id<EntityIdType>::template from<H>(handle));
110 }
111
112 std::shared_ptr<EntityType> getEntity(Id<EntityIdType> id) {
113 if constexpr (Debugger::isDebug) {
114 Debugger::debug(getDebugName() + "::getEntity(id = " + std::to_string(id.getValue()) + ")");
115 }
116
117 std::lock_guard lockGuard{mutex_};
118
119 if (auto it = entitiesById_.find(id); it != entitiesById_.end()) {
120 return it->second;
121 }
122
123 return {};
124 }
125
126 template <typename H> std::shared_ptr<EntityType> getEntity(H *handle) {
127 return getEntity(Id<EntityIdType>::template from<H>(handle));
128 }
129
130 template <typename H> std::shared_ptr<EntityType> getEntity(const H *handle) {
131 return getEntity(Id<EntityIdType>::template from<H>(handle));
132 }
133
134 bool contains(Id<EntityIdType> id) {
135 std::lock_guard lockGuard{mutex_};
136
137 return entitiesById_.contains(id);
138 }
139
140 template <typename H> bool contains(H *handle) {
141 return contains(Id<EntityIdType>::template from<H>(handle));
142 }
143
144 template <typename H> bool contains(const H *handle) {
145 return contains(Id<EntityIdType>::template from<H>(handle));
146 }
147
148 std::optional<Id<EntityIdType>> getId(std::shared_ptr<EntityType> entity) {
149 if constexpr (Debugger::isDebug) {
150 Debugger::debug(getDebugName() + "::getId(" + entity->toString() + ")");
151 }
152
153 std::lock_guard lockGuard{mutex_};
154
155 if (auto it = idsByEntities_.find(entity); it != idsByEntities_.end()) {
156 return it->second;
157 }
158
159 return {};
160 }
161
162 bool contains(std::shared_ptr<EntityType> entity) {
163 std::lock_guard lockGuard{mutex_};
164
165 return idsByEntities_.contains(entity);
166 }
167};
168
169/**
170 * Thread-safe registry that associates callback identifiers with entities without owning them.
171 *
172 * A callback obtains a temporary shared pointer with getEntity(), so an entity cannot be destroyed while that
173 * callback is using it. Unlike EntityManager, this registry does not keep an otherwise unused entity alive.
174 * Expired entries are removed lazily during lookups and explicitly by entity destructors.
175 *
176 * @tparam EntityType_ The registered entity type.
177 * @tparam EntityIdType_ The type used to distinguish the identifier domain.
178 */
179template <typename EntityType_, typename EntityIdType_ = EntityType_>
180class WeakEntityManager : private NonCopyable<WeakEntityManager<EntityType_, EntityIdType_>> {
181 public:
182 /// The registered entity type.
183 using EntityType = EntityType_;
184
185 /// The type whose identifier domain is used by the registry.
186 using EntityIdType = EntityIdType_;
187
188 private:
189 /// A non-owning registration together with the address used for reverse lookup.
190 struct Entry {
191 std::weak_ptr<EntityType> entity;
192 EntityType *address;
193 };
194
195 std::unordered_map<Id<EntityIdType>, Entry> entitiesById_{};
197 std::size_t lastId_{0};
198 std::mutex mutex_{};
199
200 void eraseEntry(typename std::unordered_map<Id<EntityIdType>, Entry>::iterator entry) {
201 if (const auto reverse = idsByEntities_.find(entry->second.address);
202 reverse != idsByEntities_.end() && reverse->second == entry->first) {
203 idsByEntities_.erase(reverse);
204 }
205
206 entitiesById_.erase(entry);
207 }
208
209 public:
210 /** Constructs an empty weak entity registry. */
211 WeakEntityManager() = default;
212
213 /**
214 * Registers an entity and returns its callback identifier.
215 *
216 * Registering the same live entity more than once returns its existing identifier.
217 *
218 * @param entity The entity to register.
219 * @return The identifier associated with the entity.
220 */
221 Id<EntityIdType> registerEntity(const std::shared_ptr<EntityType> &entity) {
222 std::lock_guard lockGuard{mutex_};
223 auto *const address = entity.get();
224
225 if (const auto reverse = idsByEntities_.find(address); reverse != idsByEntities_.end()) {
226 if (const auto entry = entitiesById_.find(reverse->second);
227 entry != entitiesById_.end() && !entry->second.entity.expired()) {
228 return reverse->second;
229 }
230
231 idsByEntities_.erase(reverse);
232 }
233
234 const auto id = Id<EntityIdType>::getNext();
235 entitiesById_.emplace(id, Entry{entity, address});
236 idsByEntities_.emplace(address, id);
237 lastId_ = id.getValue();
238
239 return id;
240 }
241
242 /** @return The numeric value of the most recently assigned identifier. */
244 std::lock_guard lockGuard{mutex_};
245 return lastId_;
246 }
247
248 /**
249 * Unregisters an entity.
250 *
251 * @param entity The entity to unregister.
252 * @return `true` if a registration was removed.
253 */
254 bool unregisterEntity(const std::shared_ptr<EntityType> &entity) {
255 std::lock_guard lockGuard{mutex_};
256 const auto reverse = idsByEntities_.find(entity.get());
257
258 if (reverse == idsByEntities_.end()) {
259 return false;
260 }
261
262 entitiesById_.erase(reverse->second);
263 idsByEntities_.erase(reverse);
264 return true;
265 }
266
267 /**
268 * Unregisters an entity by identifier.
269 *
270 * @param id The registration identifier.
271 * @return `true` if a registration was removed.
272 */
273 bool unregisterEntity(Id<EntityIdType> id) {
274 std::lock_guard lockGuard{mutex_};
275 const auto entry = entitiesById_.find(id);
276
277 if (entry == entitiesById_.end()) {
278 return false;
279 }
280
281 eraseEntry(entry);
282 return true;
283 }
284
285 /**
286 * Unregisters an entity using an opaque callback handle.
287 *
288 * @tparam H The callback handle type.
289 * @param handle The handle containing the registration identifier.
290 * @return `true` if a registration was removed.
291 */
292 template <typename H> bool unregisterEntity(H *handle) {
293 return unregisterEntity(Id<EntityIdType>::template from<H>(handle));
294 }
295
296 /**
297 * Unregisters an entity using a constant opaque callback handle.
298 *
299 * @tparam H The callback handle type.
300 * @param handle The handle containing the registration identifier.
301 * @return `true` if a registration was removed.
302 */
303 template <typename H> bool unregisterEntity(const H *handle) {
304 return unregisterEntity(Id<EntityIdType>::template from<H>(handle));
305 }
306
307 /**
308 * Locks and returns the entity registered for an identifier.
309 *
310 * The returned shared pointer keeps the entity alive until the caller finishes using it.
311 *
312 * @param id The registration identifier.
313 * @return The registered entity, or an empty pointer if it has expired or is not registered.
314 */
315 std::shared_ptr<EntityType> getEntity(Id<EntityIdType> id) {
316 std::lock_guard lockGuard{mutex_};
317 const auto entry = entitiesById_.find(id);
318
319 if (entry == entitiesById_.end()) {
320 return {};
321 }
322
323 auto entity = entry->second.entity.lock();
324
325 if (!entity) {
326 eraseEntry(entry);
327 }
328
329 return entity;
330 }
331
332 /**
333 * Locks and returns the entity identified by an opaque callback handle.
334 *
335 * @tparam H The callback handle type.
336 * @param handle The handle containing the registration identifier.
337 * @return The registered entity, or an empty pointer if it has expired or is not registered.
338 */
339 template <typename H> std::shared_ptr<EntityType> getEntity(H *handle) {
340 return getEntity(Id<EntityIdType>::template from<H>(handle));
341 }
342
343 /**
344 * Locks and returns the entity identified by a constant opaque callback handle.
345 *
346 * @tparam H The callback handle type.
347 * @param handle The handle containing the registration identifier.
348 * @return The registered entity, or an empty pointer if it has expired or is not registered.
349 */
350 template <typename H> std::shared_ptr<EntityType> getEntity(const H *handle) {
351 return getEntity(Id<EntityIdType>::template from<H>(handle));
352 }
353
354 /** @return `true` if the identifier currently refers to a live entity. */
355 bool contains(Id<EntityIdType> id) {
356 return static_cast<bool>(getEntity(id));
357 }
358
359 /** @return The identifier of a live registered entity, if present. */
360 std::optional<Id<EntityIdType>> getId(const std::shared_ptr<EntityType> &entity) {
361 std::lock_guard lockGuard{mutex_};
362 const auto reverse = idsByEntities_.find(entity.get());
363
364 if (reverse == idsByEntities_.end()) {
365 return {};
366 }
367
368 const auto entry = entitiesById_.find(reverse->second);
369
370 if (entry == entitiesById_.end() || entry->second.entity.expired()) {
371 if (entry != entitiesById_.end()) {
372 eraseEntry(entry);
373 } else {
374 idsByEntities_.erase(reverse);
375 }
376
377 return {};
378 }
379
380 return reverse->second;
381 }
382
383 /** @return `true` if the entity is currently registered and alive. */
384 bool contains(const std::shared_ptr<EntityType> &entity) {
385 return getId(entity).has_value();
386 }
387};
388
390
#define DXFCPP_MACRO_CONCAT_INNER(a, b)
Definition Common.hpp:135
#define DXFCPP_MACRO_CONCAT(a, b)
Definition Common.hpp:134
#define DXFCPP_MACRO_UNIQUE_NAME(base)
Definition Common.hpp:136
#define DXFCXX_DISABLE_MSC_WARNINGS_POP()
Definition Conf.hpp:31
#define DXFCXX_DISABLE_CLANG_WARNINGS_PUSH(warnings)
Definition Conf.hpp:65
#define DXFCPP_END_NAMESPACE
Definition Conf.hpp:97
#define DXFCPP_BEGIN_NAMESPACE
Definition Conf.hpp:94
#define DXFCXX_DISABLE_GCC_WARNINGS_PUSH(warnings)
Definition Conf.hpp:47
#define DXFCXX_DISABLE_CLANG_WARNINGS_POP()
Definition Conf.hpp:67
#define DXFCXX_DISABLE_GCC_WARNINGS_POP()
Definition Conf.hpp:49
#define DXFCXX_DISABLE_MSC_WARNINGS_PUSH(warnings)
Definition Conf.hpp:30
#define DXFCPP_TRACE_ISOLATES
Definition Debug.hpp:19
#define DXFCPP_DEBUG
Definition Debug.hpp:15
#define DXFCPP_TRACE_LISTS
Definition Debug.hpp:22
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_builder_with_name(dxfc_dxendpoint_builder_t builderHandle, const char *name)
Changes the name used to distinguish multiple endpoints in the same process (GraalVM Isolate) in logs...
Definition DXEndpoint.cpp:721
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_builder_with_properties(dxfc_dxendpoint_builder_t builder, const dxfc_dxendpoint_property_t **properties, size_t size)
Sets all supported properties from the provided properties object.
Definition DXEndpoint.cpp:754
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_password(dxfc_dxendpoint_t endpoint, const char *password)
Changes password for this endpoint.
Definition DXEndpoint.cpp:1002
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_get_publisher(dxfc_dxendpoint_t endpoint, DXFC_OUT dxfc_dxpublisher_t *publisher)
Definition DXEndpoint.cpp:1192
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_builder_supports_property(dxfc_dxendpoint_builder_t builder, const char *key, DXFC_OUT int *supports)
Checks if a property is supported.
Definition DXEndpoint.cpp:781
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_add_state_change_listener(dxfc_dxendpoint_t endpoint, dxfc_dxendpoint_state_change_listener listener)
Adds a listener notified about changes in state property.
Definition DXEndpoint.cpp:1138
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_disconnect(dxfc_dxendpoint_t endpoint)
Terminates all remote network connections.
Definition DXEndpoint.cpp:1053
#define DXFCPP_EXPORT
Definition api.h:35
void * dxfc_dxendpoint_builder_t
The dxFeed endpoint's builder handle.
Definition api.h:207
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_close_and_await_termination(dxfc_dxendpoint_t endpoint)
Closes this endpoint and wait until all pending data processing tasks are completed.
Definition DXEndpoint.cpp:951
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_await_not_connected(dxfc_dxendpoint_t endpoint)
Waits while this endpoint state becomes NOT_CONNECTED or CLOSED.
Definition DXEndpoint.cpp:1104
dxfc_dxendpoint_state_t
Represents the current state of endpoint.
Definition api.h:149
@ DXFC_DXENDPOINT_STATE_CLOSED
Endpoint was closed.
Definition api.h:169
@ DXFC_DXENDPOINT_STATE_NOT_CONNECTED
Endpoint was created by is not connected to remote endpoints.
Definition api.h:153
@ DXFC_DXENDPOINT_STATE_CONNECTING
The connect function was called to establish connection to remove endpoint, but the connection is not...
Definition api.h:159
@ DXFC_DXENDPOINT_STATE_CONNECTED
The connection to the remote endpoint is established.
Definition api.h:164
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_get_instance(void *user_data, DXFC_OUT dxfc_dxendpoint_t *endpoint)
Returns a default application-wide singleton instance of dxFeed endpoint with a FEED role.
Definition DXEndpoint.cpp:840
#define DXFC_OUT
Definition api.h:17
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_get_state(dxfc_dxendpoint_t endpoint, DXFC_OUT dxfc_dxendpoint_state_t *state)
Returns the state of this endpoint.
Definition DXEndpoint.cpp:1121
void * dxfc_dxendpoint_t
The dxFeed endpoint handle.
Definition api.h:198
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_builder_with_property(dxfc_dxendpoint_builder_t builder, const char *key, const char *value)
Sets the specified property.
Definition DXEndpoint.cpp:737
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_builder_free(dxfc_dxendpoint_builder_t builder)
Removes a builder from the registry.
Definition DXEndpoint.cpp:828
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_connect(dxfc_dxendpoint_t endpoint, const char *address)
Connects to the specified remote address.
Definition DXEndpoint.cpp:1019
dxfc_error_code_t
List of error codes.
Definition api.h:49
@ DXFC_EC_ERROR
The error returned if the current operation cannot be completed.
Definition api.h:60
@ DXFC_EC_SUCCESS
OK.
Definition api.h:53
@ DXFC_EC_G_ERR
dxFeed Graal Native API error.
Definition api.h:57
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_remove_state_change_listener(dxfc_dxendpoint_t endpoint, dxfc_dxendpoint_state_change_listener listener)
Removes a listener notified about changes in state property.
Definition DXEndpoint.cpp:1164
DXFCPP_EXPORT dxfc_error_code_t dxfc_system_set_property(const char *key, const char *value)
Sets the system property indicated by the specified key.
Definition System.cpp:74
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_builder_build(dxfc_dxendpoint_builder_t builder, void *user_data, DXFC_OUT dxfc_dxendpoint_t *endpoint)
Builds the new dxFeed endpoint instance.
Definition DXEndpoint.cpp:798
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_get_feed(dxfc_dxendpoint_t endpoint, DXFC_OUT dxfc_dxfeed_t *feed)
Definition DXEndpoint.cpp:1187
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_await_processed(dxfc_dxendpoint_t endpoint)
Waits until this endpoint stops processing data (becomes quiescent).
Definition DXEndpoint.cpp:1087
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_close(dxfc_dxendpoint_t endpoint)
Closes this endpoint.
Definition DXEndpoint.cpp:934
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_new_builder(DXFC_OUT dxfc_dxendpoint_builder_t *builder)
Creates a new dxFeed endpoint's builder instance.
Definition DXEndpoint.cpp:688
void(* dxfc_dxendpoint_state_change_listener)(dxfc_dxendpoint_state_t old_state, dxfc_dxendpoint_state_t new_state, void *user_data)
The endpoint current state change listener.
Definition api.h:178
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_reconnect(dxfc_dxendpoint_t endpoint)
Terminates all established network connections and initiates connecting again with the same address.
Definition DXEndpoint.cpp:1036
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_get_role(dxfc_dxendpoint_t endpoint, DXFC_OUT dxfc_dxendpoint_role_t *role)
Returns the role of this endpoint.
Definition DXEndpoint.cpp:968
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_user(dxfc_dxendpoint_t endpoint, const char *user)
Changes username for this endpoint.
Definition DXEndpoint.cpp:985
DXFCPP_EXPORT dxfc_error_code_t dxfc_system_get_property(const char *key, DXFC_OUT char *buffer, size_t buffer_size)
Gets the system property indicated by the specified key.
dxfc_dxendpoint_role_t
Represents the role of an endpoint that was specified during its creation.
Definition api.h:89
@ DXFC_DXENDPOINT_ROLE_PUBLISHER
PUBLISHER endpoint connects to the remote publisher hub (also known as multiplexor) or creates a publ...
Definition api.h:127
@ DXFC_DXENDPOINT_ROLE_STREAM_FEED
STREAM_FEED endpoint is similar to DXFC_DXENDPOINT_ROLE_FEED and also connects to the remote data fee...
Definition api.h:116
@ DXFC_DXENDPOINT_ROLE_FEED
FEED endpoint connects to the remote data feed provider and is optimized for real-time or delayed dat...
Definition api.h:99
@ DXFC_DXENDPOINT_ROLE_STREAM_PUBLISHER
STREAM_PUBLISHER endpoint is similar to DXFC_DXENDPOINT_ROLE_PUBLISHER and also connects to the remot...
Definition api.h:136
@ DXFC_DXENDPOINT_ROLE_LOCAL_HUB
LOCAL_HUB endpoint is a local hub without the ability to establish network connections.
Definition api.h:143
@ DXFC_DXENDPOINT_ROLE_ON_DEMAND_FEED
ON_DEMAND_FEED endpoint is similar to DXFC_DXENDPOINT_ROLE_FEED, but it is designed to be used with d...
Definition api.h:107
void * dxfc_dxpublisher_t
The dxFeed publisher handle.
Definition api.h:217
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_create(void *user_data, DXFC_OUT dxfc_dxendpoint_t *endpoint)
Creates an endpoint with FEED role.
Definition DXEndpoint.cpp:887
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_get_instance2(dxfc_dxendpoint_role_t role, void *user_data, DXFC_OUT dxfc_dxendpoint_t *endpoint)
Returns a default application-wide singleton instance of DXEndpoint for a specific role.
Definition DXEndpoint.cpp:863
void * dxfc_dxfeed_t
The dxFeed handle.
Definition api.h:212
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_builder_with_role(dxfc_dxendpoint_builder_t builder, dxfc_dxendpoint_role_t role)
Sets role for the created dxFeed endpoint.
Definition DXEndpoint.cpp:704
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_create2(dxfc_dxendpoint_role_t role, void *user_data, DXFC_OUT dxfc_dxendpoint_t *endpoint)
Creates an endpoint with a specified role.
Definition DXEndpoint.cpp:910
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_free(dxfc_dxendpoint_t endpoint)
Removes the dxFeed endpoint from the registry.
Definition DXEndpoint.cpp:1197
DXFCPP_EXPORT dxfc_error_code_t dxfc_dxendpoint_disconnect_and_clear(dxfc_dxendpoint_t endpoint)
Terminates all remote network connections and clears stored data.
Definition DXEndpoint.cpp:1070
Builder class for DXEndpoint that supports additional configuration properties.
Definition DXEndpoint.hpp:866
std::shared_ptr< DXEndpoint > build()
Builds DXEndpoint instance.
Definition DXEndpoint.cpp:348
std::shared_ptr< Builder > withName(const StringLike &name)
Changes the name used to distinguish multiple endpoints in the same process (GraalVM Isolate) in logs...
Definition DXEndpoint.cpp:391
std::shared_ptr< Builder > withExecutor(const std::shared_ptr< Executor > &executor)
Sets the executor that is used for notifications (events, state changes, etc.) of the endpoint to bui...
Definition DXEndpoint.hpp:995
bool supportsProperty(const StringLike &key) const
Checks if a property is supported.
Definition DXEndpoint.cpp:338
std::shared_ptr< Builder > withProperties(Properties &&properties)
Sets all supported properties from the provided properties object.
Definition DXEndpoint.hpp:957
~Builder() noexcept override
Releases the GraalVM handle.
Definition DXEndpoint.cpp:380
std::shared_ptr< Builder > withRole(Role role)
Sets role for the created DXEndpoint.
Definition DXEndpoint.cpp:300
std::shared_ptr< Builder > withProperty(const StringLike &key, const StringLike &value)
Sets the specified property.
Definition DXEndpoint.cpp:313
Subscription for a set of symbols and event types.
Definition DXFeedSubscription.hpp:45
Extends DXFeedSubscription to conveniently subscribe to time-series of events for a set of symbols an...
Definition DXFeedSubscription.hpp:787
The enumeration type that provides additional information about the dxFeed Graal C++-API event type.
Definition EventTypeEnum.hpp:29
Source identifier for IndexedEvent.
Definition IndexedEventSource.hpp:29
static JavaObjectHandleRegistry & getInstance() noexcept
Returns the process-wide handle registry.
Definition JavaObjectHandle.cpp:68
void releaseAll() noexcept
Releases all currently registered handles while the Graal isolate is still available.
Definition JavaObjectHandle.cpp:125
void reset(void *handle=nullptr) noexcept
Replaces the owned handle, releasing the previous one.
Definition JavaObjectHandle.cpp:163
JavaObjectHandleState(void *handle, Deleter deleter) noexcept
Creates an ownership state for a native handle.
Definition JavaObjectHandle.cpp:150
void * get() const noexcept
Returns the currently owned native handle.
Definition JavaObjectHandle.hpp:115
void moveFrom(JavaObjectHandleState &other) noexcept
Transfers ownership from another state and releases the handle previously owned by this state.
Definition JavaObjectHandle.cpp:159
~JavaObjectHandleState() noexcept
Releases the owned handle, if any, and unregisters the state.
Definition JavaObjectHandle.cpp:155
Thread-safe registry that associates callback identifiers with entities without owning them.
Definition EntityManager.hpp:180
bool unregisterEntity(const H *handle)
Unregisters an entity using a constant opaque callback handle.
Definition EntityManager.hpp:303
std::optional< Id< EntityIdType > > getId(const std::shared_ptr< EntityType > &entity)
Definition EntityManager.hpp:360
bool unregisterEntity(H *handle)
Unregisters an entity using an opaque callback handle.
Definition EntityManager.hpp:292
bool unregisterEntity(const std::shared_ptr< EntityType > &entity)
Unregisters an entity.
Definition EntityManager.hpp:254
bool unregisterEntity(Id< EntityIdType > id)
Unregisters an entity by identifier.
Definition EntityManager.hpp:273
std::shared_ptr< EntityType > getEntity(H *handle)
Locks and returns the entity identified by an opaque callback handle.
Definition EntityManager.hpp:339
Id< EntityIdType > registerEntity(const std::shared_ptr< EntityType > &entity)
Registers an entity and returns its callback identifier.
Definition EntityManager.hpp:221
bool contains(const std::shared_ptr< EntityType > &entity)
Definition EntityManager.hpp:384
WeakEntityManager()=default
Constructs an empty weak entity registry.
std::shared_ptr< EntityType > getEntity(const H *handle)
Locks and returns the entity identified by a constant opaque callback handle.
Definition EntityManager.hpp:350
std::size_t getLastId()
Definition EntityManager.hpp:243
bool contains(Id< EntityIdType > id)
Definition EntityManager.hpp:355
std::shared_ptr< EntityType > getEntity(Id< EntityIdType > id)
Locks and returns the entity registered for an identifier.
Definition EntityManager.hpp:315
Manages network connections to feed or publisher.
Definition DXEndpoint.hpp:179
bool isClosed() const
Definition DXEndpoint.cpp:540
SimpleHandler< void(DXEndpoint::State, DXEndpoint::State)> & onStateChange() noexcept
Returns the onStateChange handler that can be used to add or remove listeners.
Definition DXEndpoint.cpp:552
static const std::string DXFEED_PASSWORD_PROPERTY
"dxfeed.password"
Definition DXEndpoint.hpp:246
static std::shared_ptr< DXEndpoint > create(Role role)
Creates an endpoint with a specified role.
Definition DXEndpoint.cpp:527
std::shared_ptr< DXFeed > getFeed() const
Definition DXEndpoint.cpp:227
std::shared_ptr< DXEndpoint > password(const StringLike &password)
Changes password for this endpoint.
Definition DXEndpoint.cpp:154
State
Represents the current state of endpoint.
Definition DXEndpoint.hpp:444
@ CLOSED
Endpoint was closed.
Definition DXEndpoint.hpp:464
@ CONNECTING
The connect method was called to establish connection to remove endpoint, but the connection is not e...
Definition DXEndpoint.hpp:454
@ CONNECTED
The connection to the remote endpoint is established.
Definition DXEndpoint.hpp:459
@ NOT_CONNECTED
Endpoint was created by is not connected to remote endpoints.
Definition DXEndpoint.hpp:448
std::shared_ptr< DXEndpoint > user(const StringLike &user)
Changes username for this endpoint.
Definition DXEndpoint.cpp:147
void reconnect() const
Terminates all established network connections and initiates connecting again with the same address.
Definition DXEndpoint.cpp:173
static std::shared_ptr< DXEndpoint > create()
Creates an endpoint with FEED role.
Definition DXEndpoint.cpp:518
void removeStateChangeListener(std::size_t listenerId) noexcept
Removes a listener notified about changes in state property.
Definition DXEndpoint.cpp:548
const std::string & getName() const &noexcept
Definition DXEndpoint.cpp:544
Role
Represents the role of an endpoint that was specified during its creation.
Definition DXEndpoint.hpp:373
@ PUBLISHER
PUBLISHER endpoint connects to the remote publisher hub (also known as multiplexor) or creates a publ...
Definition DXEndpoint.hpp:418
@ STREAM_FEED
STREAM_FEED endpoint is similar to DXEndpoint::FEED and also connects to the remote data feed provide...
Definition DXEndpoint.hpp:406
@ LOCAL_HUB
LOCAL_HUB endpoint is a local hub without the ability to establish network connections.
Definition DXEndpoint.hpp:434
@ ON_DEMAND_FEED
ON_DEMAND_FEED endpoint is similar to DXEndpoint::FEED, but it is designed to be used with OnDemandSe...
Definition DXEndpoint.hpp:397
@ STREAM_PUBLISHER
STREAM_PUBLISHER endpoint is similar to DXEndpoint::PUBLISHER and also connects to the remote publish...
Definition DXEndpoint.hpp:427
@ FEED
FEED endpoint connects to the remote data feed provider and is optimized for real-time or delayed dat...
Definition DXEndpoint.hpp:384
std::string toString() const override
Returns a string representation of the current object.
Definition DXEndpoint.cpp:401
void awaitProcessed() const
Waits until this endpoint stops processing data (becomes quiescent).
Definition DXEndpoint.cpp:209
std::shared_ptr< DXPublisher > getPublisher() const
Definition DXEndpoint.cpp:236
static const std::string DXFEED_WILDCARD_ENABLE_PROPERTY
"dxfeed.wildcard.enable"
Definition DXEndpoint.hpp:274
std::size_t addStateChangeListener(std::function< void(State, State)> listener) noexcept
Adds a listener notified about changes in state property.
Definition DXEndpoint.hpp:619
static const std::string DXENDPOINT_EVENT_TIME_PROPERTY
"dxendpoint.eventTime"
Definition DXEndpoint.hpp:319
static const std::string DXPUBLISHER_THREAD_POOL_SIZE_PROPERTY
"dxpublisher.threadPoolSize"
Definition DXEndpoint.hpp:302
State getState() const
Returns the state of this endpoint.
Definition DXEndpoint.cpp:143
static const std::string DXENDPOINT_STORE_EVERYTHING_PROPERTY
"dxendpoint.storeEverything"
Definition DXEndpoint.hpp:332
void awaitNotConnected() const
Waits while this endpoint state becomes NOT_CONNECTED or CLOSED.
Definition DXEndpoint.cpp:200
static std::shared_ptr< DXEndpoint > getInstance(Role role)
Returns a default application-wide singleton instance of DXEndpoint for a specific role.
Definition DXEndpoint.cpp:500
static const std::string DXFEED_AGGREGATION_PERIOD_PROPERTY
"dxfeed.aggregationPeriod"
Definition DXEndpoint.hpp:265
void close() const
Closes this endpoint.
Definition DXEndpoint.cpp:556
static const std::string DXFEED_THREAD_POOL_SIZE_PROPERTY
"dxfeed.threadPoolSize"
Definition DXEndpoint.hpp:255
void disconnect() const
Terminates all remote network connections.
Definition DXEndpoint.cpp:182
void closeAndAwaitTermination() const
Closes this endpoint and wait until all pending data processing tasks are completed.
Definition DXEndpoint.cpp:218
static std::shared_ptr< DXEndpoint > getInstance()
Returns a default application-wide singleton instance of DXEndpoint with a FEED role.
Definition DXEndpoint.cpp:491
static const std::string DXPUBLISHER_ADDRESS_PROPERTY
"dxpublisher.address"
Definition DXEndpoint.hpp:293
static const std::string DXFEED_USER_PROPERTY
"dxfeed.user"
Definition DXEndpoint.hpp:236
static const std::string NAME_PROPERTY
"name"
Definition DXEndpoint.hpp:196
static const std::string DXSCHEME_ENABLED_PROPERTY_PREFIX
"dxscheme.enabled."
Definition DXEndpoint.hpp:366
static const std::string DXPUBLISHER_PROPERTIES_PROPERTY
"dxpublisher.properties"
Definition DXEndpoint.hpp:283
static const std::string DXSCHEME_NANO_TIME_PROPERTY
"dxscheme.nanoTime"
Definition DXEndpoint.hpp:352
static const std::string DXFEED_ADDRESS_PROPERTY
"dxfeed.address"
Definition DXEndpoint.hpp:226
std::shared_ptr< DXEndpoint > executor(const std::shared_ptr< Executor > &executor)
Changes the executor that is used for notifications (events, state changes, etc.) of this endpoint.
Definition DXEndpoint.hpp:655
void disconnectAndClear() const
Terminates all remote network connections and clears stored data.
Definition DXEndpoint.cpp:191
Role getRole() const noexcept
Returns the role of this endpoint.
Definition DXEndpoint.cpp:536
static const std::string DXFEED_PROPERTIES_PROPERTY
"dxfeed.properties"
Definition DXEndpoint.hpp:207
static std::shared_ptr< Builder > newBuilder()
Creates a new Builder instance.
Definition DXEndpoint.cpp:509
std::shared_ptr< DXEndpoint > connect(const StringLike &address)
Connects to the specified remote address.
Definition DXEndpoint.cpp:161
Main entry class for dxFeed API (read it first).
Definition DXFeed.hpp:141
void detachSubscriptionAndClear(const std::shared_ptr< DXFeedSubscription > &subscription) const
Detaches the given subscription from this feed and clears data delivered to this subscription by publ...
Definition DXFeed.cpp:68
Collection getLastEvents(Collection &&events)
Returns the last events for the specified list of event instances.
Definition DXFeed.hpp:294
std::shared_ptr< PromiseList< E > > getLastEventsPromises(std::initializer_list< SymbolWrapper > collection) const
Requests the last events for the specified event type and a collection of symbols.
Definition DXFeed.hpp:749
std::vector< std::shared_ptr< E > > getTimeSeriesIfSubscribed(const SymbolWrapper &symbol, std::chrono::milliseconds fromTime, std::chrono::milliseconds toTime) const
Returns time series of events for the specified event type, symbol and a range of time if there is a ...
Definition DXFeed.hpp:1017
std::shared_ptr< DXFeedSubscription > createSubscription(const EventTypeEnum &eventType) const
Creates a new subscription for a single event type that is attached to this feed.
Definition DXFeed.cpp:88
std::shared_ptr< DXFeedTimeSeriesSubscription > createTimeSeriesSubscription(std::initializer_list< EventTypeEnum > eventTypes) const
Creates new subscription for multiple event types that is attached to this feed.
Definition DXFeed.cpp:137
std::shared_ptr< DXFeedSubscription > createSubscription(EventTypeIt begin, EventTypeIt end) const
Creates new subscription for multiple event types that is attached to this feed.
Definition DXFeed.hpp:388
std::shared_ptr< PromiseList< E > > getLastEventsPromises(const SymbolsCollection &collection) const
Requests the last events for the specified event type and a collection of symbols.
Definition DXFeed.hpp:703
std::shared_ptr< E > getLastEventIfSubscribed(const SymbolWrapper &symbol)
Returns the last event for the specified event type and symbol if there is a subscription for it.
Definition DXFeed.hpp:328
std::shared_ptr< DXFeedSubscription > createSubscription(std::initializer_list< EventTypeEnum > eventTypes) const
Creates new subscription for multiple event types that is attached to this feed.
Definition DXFeed.cpp:101
std::vector< std::shared_ptr< E > > getTimeSeriesIfSubscribed(const SymbolWrapper &symbol, std::chrono::milliseconds fromTime) const
Returns time series of events for the specified event type, symbol and a range of time (without an up...
Definition DXFeed.hpp:1048
std::shared_ptr< DXFeedTimeSeriesSubscription > createTimeSeriesSubscription(EventTypeIt begin, EventTypeIt end) const
Creates new subscription for multiple event types that is attached to this feed.
Definition DXFeed.hpp:500
static std::shared_ptr< DXFeed > getInstance()
Returns a default application-wide singleton instance of feed.
Definition DXFeed.cpp:19
std::shared_ptr< E > getLastEvent(std::shared_ptr< E > event)
Returns the last event for the specified event instance.
Definition DXFeed.hpp:270
std::shared_ptr< PromiseList< E > > getLastEventsPromises(SymbolIt begin, SymbolIt end) const
Requests the last events for the specified event type and a collection of symbols.
Definition DXFeed.hpp:656
std::shared_ptr< DXFeedSubscription > createSubscription(const EventTypesCollection &eventTypes) const
Creates new subscription for multiple event types that is attached to this feed.
Definition DXFeed.hpp:438
std::shared_ptr< Promise< std::shared_ptr< E > > > getLastEventPromise(const SymbolWrapper &symbol) const
Requests the last event for the specified event type and symbol.
Definition DXFeed.hpp:608
std::shared_ptr< DXFeedTimeSeriesSubscription > createTimeSeriesSubscription(const EventTypesCollection &eventTypes) const
Creates new subscription for multiple event types that is attached to this feed.
Definition DXFeed.hpp:567
std::string toString() const override
Returns a string representation of the current object.
Definition DXFeed.cpp:226
std::shared_ptr< Promise< std::vector< std::shared_ptr< E > > > > getIndexedEventsPromise(const SymbolWrapper &symbol, const IndexedEventSource &source) const
Requests a container of indexed events for the specified event type, symbol and source.
Definition DXFeed.hpp:802
void detachSubscription(const std::shared_ptr< DXFeedSubscription > &subscription) const
Detaches the given subscription from this feed.
Definition DXFeed.cpp:48
std::vector< std::shared_ptr< E > > getIndexedEventsIfSubscribed(const SymbolWrapper &symbol, const IndexedEventSource &source) const
Returns a vector of indexed events for the specified event type, symbol and source if there is a subs...
Definition DXFeed.hpp:858
void attachSubscription(const std::shared_ptr< DXFeedSubscription > &subscription) const
Attaches the given subscription to this feed.
Definition DXFeed.cpp:28
std::shared_ptr< DXFeedTimeSeriesSubscription > createTimeSeriesSubscription(const EventTypeEnum &eventType) const
Creates a new subscription for a single event type that is attached to this feed.
Definition DXFeed.cpp:116
Provides API for publishing of events to local or remote DXFeed.
Definition DXPublisher.hpp:60
Marks all event types that can be received via dxFeed API.
Definition EventType.hpp:37
std::string toString() const override
Returns a string representation of the current object.
Definition api.cpp:67
virtual std::int64_t getEventTime() const noexcept
Returns time when an event was created or zero when time is not available.
Definition api.cpp:54
virtual void assign(std::shared_ptr< EventType > event)
Replaces the contents of the event.
Definition api.cpp:63
virtual void setEventTime(std::int64_t eventTime) noexcept
Changes event creation time.
Definition api.cpp:58
The wrapper over CEntryPointErrorsEnum, the error code returned by GraalVM.
Definition GraalException.hpp:26
GraalException(CEntryPointErrorsEnum entryPointErrorsEnum)
Constructs an exception.
Definition GraalException.cpp:8
void handle(ArgTypes... args)
Calls the listeners and pass the args to them.
Definition Handler.hpp:122
std::size_t add(ListenerType &&listener)
Adds the listener to "main" group.
Definition Handler.hpp:156
std::size_t operator%=(ListenerType &&listener)
Adds the low priority listener (to the "low priority" group).
Definition Handler.hpp:208
std::size_t operator+=(ListenerType &&listener)
Adds the listener to "main" group.
Definition Handler.hpp:197
void operator()(ArgTypes... args)
Calls the listeners and pass the ars to them.
Definition Handler.hpp:146
Handler(std::size_t mainFuturesSize=MAIN_FUTURES_DEFAULT_SIZE) noexcept
Creates the new handler by specified size of circular buffer of futures.
Definition Handler.hpp:84
void operator-=(std::size_t id)
Removes a listener by the id.
Definition Handler.hpp:236
std::size_t addLowPriority(ListenerType &&listener)
Adds the low priority listener (to the "low priority" group) It will be called after the "main" liste...
Definition Handler.hpp:177
void remove(std::size_t id)
Removes a listener by the id.
Definition Handler.hpp:217
Thrown to indicate that a method has been passed an illegal or inappropriate argument.
Definition InvalidArgumentException.hpp:23
Represents up-to-date information about some condition or state of an external entity that updates in...
Definition LastingEvent.hpp:33
Provides on-demand historical tick data replay controls.
Definition OnDemandService.hpp:77
A helper class needed to construct smart pointers to objects and does not allow explicit construction...
Definition SharedEntity.hpp:89
static auto createShared(Args &&...args)
Creates a smart pointer to an object.
Definition SharedEntity.hpp:104
A runtime axception with stacktrace.
Definition RuntimeException.hpp:26
const std::string & getStackTrace() const &
Definition RuntimeException.cpp:83
RuntimeException(const StringLike &message, const StringLike &additionalStackTrace="")
Constructs a runtime exception.
Definition RuntimeException.cpp:67
A base abstract "shared entity" class. Has some helpers for dynamic polymorphism.
Definition SharedEntity.hpp:25
virtual std::string toString() const
Returns a string representation of the current object.
Definition SharedEntity.hpp:78
std::shared_ptr< T > sharedAs() const noexcept
Returns a pointer to the current object wrapped in a smart pointer to type T or std::shared_ptr<T>{nu...
Definition SharedEntity.hpp:69
std::shared_ptr< T > sharedAs() noexcept
Returns a pointer to the current object wrapped in a smart pointer to type T or std::shared_ptr<T>{nu...
Definition SharedEntity.hpp:58
bool is() const noexcept
Checks that the pointer to the current type could be converted to type T* In other words: whether typ...
Definition SharedEntity.hpp:39
std::size_t operator+=(ListenerType &&listener)
Adds the listener to "main" group.
Definition Handler.hpp:379
void remove(std::size_t id)
Removes a listener by the id.
Definition Handler.hpp:399
void handle(ArgTypes... args)
Calls the listeners and pass the args to them.
Definition Handler.hpp:317
void operator()(ArgTypes... args)
Calls the listeners and pass the ars to them.
Definition Handler.hpp:328
std::size_t addLowPriority(ListenerType &&listener)
Adds the low priority listener (to the "low priority" group) It will be called after the "main" liste...
Definition Handler.hpp:359
void operator-=(std::size_t id)
Removes a listener by the id.
Definition Handler.hpp:418
std::size_t operator%=(ListenerType &&listener)
Adds the low priority listener (to the "low priority" group).
Definition Handler.hpp:390
SimpleHandler() noexcept
Creates the new handler.
Definition Handler.hpp:289
std::size_t add(ListenerType &&listener)
Adds the listener to "main" group.
Definition Handler.hpp:338
Universal functional object that allows searching std::unordered_map for string-like keys.
Definition StringUtils.hpp:120
A simple wrapper around strings or something similar to strings to reduce the amount of code for meth...
Definition Common.hpp:728
A lightweight wrapper around strings or string-like inputs.
Definition StringUtils.hpp:28
Common string constants used across the library.
Definition StringUtils.hpp:137
static const std::string NUL
Textual representation of a null / missing string: "<null>".
Definition StringUtils.hpp:142
static const std::string EMPTY
Empty string constant: "".
Definition StringUtils.hpp:139
Whether T is std::shared_ptr<E>, where E is a descendant of LastingEvent (the elements of DXFeed::get...
Definition DXFeed.hpp:40
The simple key-value structure that represents an endpoint's property.
Definition api.h:184
const char * key
The property's key.
Definition api.h:186
const char * value
The property's value.
Definition api.h:188