Skip to content

Commit

Permalink
[DXFC-402] Implement adding multiple symbols and removing symbols
Browse files Browse the repository at this point in the history
  • Loading branch information
AnatolyKalin committed May 24, 2023
1 parent dfc1219 commit 78eca87
Show file tree
Hide file tree
Showing 21 changed files with 516 additions and 428 deletions.
7 changes: 7 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,15 @@ add_subdirectory(third_party/fmt-9.1.0)
set(dxFeedNativeAPIInternalSources
src/internal/CEntryPointErrors.cpp
src/internal/Isolate.cpp
src/internal/JavaObjectHandler.cpp
src/internal/EventClassList.cpp
src/internal/Common.cpp
)

set(dxFeedNativeAPIInternalUtilsSources
src/internal/utils/StringUtils.cpp
)

set(dxFeedNativeAPIInternalUtilsDebugSources
src/internal/utils/debug/Debug.cpp
)
Expand Down Expand Up @@ -122,6 +128,7 @@ set(dxFeedNativeAPIEventOptionSources

add_library(dxFeedGraalCxxApi
${dxFeedNativeAPIInternalSources}
${dxFeedNativeAPIInternalUtilsSources}
${dxFeedNativeAPIInternalUtilsDebugSources}
${dxFeedNativeAPIAPISources}
${dxFeedNativeAPISystemSources}
Expand Down
6 changes: 5 additions & 1 deletion include/dxfeed_graal_cpp_api/api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@

#pragma once

#include "dxfeed_graal_cpp_api/internal/managers/ErrorHandlingManager.hpp"
#include "internal/CEntryPointErrors.hpp"
#include "internal/Common.hpp"
#include "internal/Enum.hpp"
#include "internal/EventClassList.hpp"
#include "internal/JavaObjectHandler.hpp"
#include "internal/RawListWrapper.hpp"
#include "internal/context/ApiContext.hpp"
#include "internal/managers/DXEndpointManager.hpp"
#include "internal/managers/DXFeedSubscriptionManager.hpp"
#include "internal/managers/EntityManager.hpp"
#include "internal/managers/ErrorHandlingManager.hpp"
#include "internal/utils/StringUtils.hpp"
#include "internal/utils/debug/Debug.hpp"

#include "api/DXEndpoint.hpp"
Expand Down
6 changes: 3 additions & 3 deletions include/dxfeed_graal_cpp_api/api/DXEndpoint.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -463,12 +463,12 @@ struct DXEndpoint : SharedEntity {
static inline std::mutex MTX{};
static std::unordered_map<Role, std::shared_ptr<DXEndpoint>> INSTANCES;

handler_utils::JavaObjectHandler<DXEndpoint> handler_;
JavaObjectHandler<DXEndpoint> handler_;
Role role_ = Role::FEED;
std::string name_{};
std::shared_ptr<DXFeed> feed_{};
std::shared_ptr<DXPublisher> publisher_{};
handler_utils::JavaObjectHandler<DXEndpointStateChangeListener> stateChangeListenerHandler_;
JavaObjectHandler<DXEndpointStateChangeListener> stateChangeListenerHandler_;
Handler<void(State, State)> onStateChange_{};

static std::shared_ptr<DXEndpoint> create(void *endpointHandle, Role role,
Expand Down Expand Up @@ -808,7 +808,7 @@ struct DXEndpoint : SharedEntity {
friend DXEndpoint;

// mutable std::recursive_mutex mtx_{};
handler_utils::JavaObjectHandler<Builder> handler_;
JavaObjectHandler<Builder> handler_;
Role role_ = Role::FEED;
std::unordered_map<std::string, std::string> properties_;

Expand Down
2 changes: 1 addition & 1 deletion include/dxfeed_graal_cpp_api/api/DXFeed.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ struct DXFeed : SharedEntity {
friend struct DXEndpoint;

private:
handler_utils::JavaObjectHandler<DXFeed> handler_;
JavaObjectHandler<DXFeed> handler_;

std::unordered_set<std::shared_ptr<DXFeedSubscription>> subscriptions_{};

Expand Down
10 changes: 5 additions & 5 deletions include/dxfeed_graal_cpp_api/api/DXFeedSubscription.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ class DXFeedSubscription : public SharedEntity {
friend struct DXFeed;

mutable std::recursive_mutex mtx_{};
handler_utils::JavaObjectHandler<DXFeedSubscription> handler_;
handler_utils::JavaObjectHandler<DXFeedEventListener> eventListenerHandler_;
JavaObjectHandler<DXFeedSubscription> handler_;
JavaObjectHandler<DXFeedEventListener> eventListenerHandler_;
Handler<void(const std::vector<std::shared_ptr<EventType>> &)> onEvent_{1};

explicit DXFeedSubscription(const EventTypeEnum &eventType) noexcept;

static handler_utils::JavaObjectHandler<DXFeedSubscription>
createSubscriptionHandlerFromEventClassList(const std::unique_ptr<handler_utils::EventClassList> &list) noexcept;
static JavaObjectHandler<DXFeedSubscription>
createSubscriptionHandlerFromEventClassList(const std::unique_ptr<EventClassList> &list) noexcept;

void setEventListenerHandler(Id<DXFeedSubscription> id) noexcept;

Expand All @@ -36,7 +36,7 @@ class DXFeedSubscription : public SharedEntity {
Debugger::debug("DXFeedSubscription(eventTypes = " + namesToString(begin, end) + ")");
}

auto list = handler_utils::EventClassList::create(begin, end);
auto list = EventClassList::create(begin, end);

if (!list) {
return;
Expand Down
110 changes: 1 addition & 109 deletions include/dxfeed_graal_cpp_api/internal/Common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,6 @@

namespace dxfcpp {

struct String {
inline static const std::string EMPTY{};
};

std::string toString(bool b);

std::string toString(const char *chars);

std::string toString(std::thread::id theadId);

std::string toString(void* ptr);

char utf16to8(std::int16_t in);

std::int16_t utf8to16(char in);

std::string formatTimeStamp(std::int64_t timestamp);

std::string formatTimeStampWithMillis(std::int64_t timestamp);

template <typename T>
concept Integral = std::is_integral_v<T>;

Expand Down Expand Up @@ -114,77 +94,9 @@ inline auto now() {

namespace handler_utils {

template <typename T> struct JavaObjectHandler {
using Type = T;
static void deleter(void *handler) noexcept;
explicit JavaObjectHandler(void *handler = nullptr) noexcept : impl_{handler, &deleter} {}

JavaObjectHandler(JavaObjectHandler &&) = default;
JavaObjectHandler &operator=(JavaObjectHandler &&) = default;
virtual ~JavaObjectHandler() noexcept = default;

[[nodiscard]] std::string toString() const noexcept {
if (impl_)
return dxfcpp::toString(impl_.get());
else
return "nullptr";
}

[[nodiscard]] void *get() const noexcept { return impl_.get(); }

explicit operator bool() const noexcept { return static_cast<bool>(impl_); }

private:
std::unique_ptr<void, decltype(&deleter)> impl_;
};

struct EventClassList {
template <typename EventTypeIt>
static std::unique_ptr<EventClassList> create(EventTypeIt begin, EventTypeIt end) noexcept {
auto size = std::distance(begin, end);

if (size <= 0) {
return {};
}

auto list = create(size);

if (list->isEmpty()) {
return {};
}

std::size_t i = 0;

for (auto it = begin; it != end; it++, i++) {
list->set(i, it->getId());
}

return list;
}

void set(std::size_t index, std::uint32_t id) noexcept;

[[nodiscard]] bool isEmpty() const noexcept;

[[nodiscard]] std::size_t size() const noexcept;

void *getHandler() noexcept;

~EventClassList() noexcept;

private:
static std::unique_ptr<EventClassList> create(std::size_t size) noexcept;

EventClassList() noexcept;

struct Impl;

std::unique_ptr<Impl> impl_;
};

struct SymbolsList {
template <typename SymbolIt>
static std::unique_ptr<EventClassList> create(SymbolIt begin, SymbolIt end) noexcept {
static std::unique_ptr<SymbolsList> create(SymbolIt begin, SymbolIt end) noexcept {
auto size = std::distance(begin, end);

if (size <= 0) {
Expand Down Expand Up @@ -228,19 +140,7 @@ struct SymbolsList {

} // namespace handler_utils

template <typename It>
#if __cpp_concepts
requires requires { std::is_same_v<std::decay_t<decltype(It {} -> getName())>, std::string>; }
#endif
std::string namesToString(It begin, It end) {
std::string result{"["};

for (auto it = begin; it != end; it++) {
result += String::EMPTY + "'" + it->getName() + "'" + (std::next(it) == end ? "" : ", ");
}

return result + "]";
}

template <typename M, typename F, typename... Args> inline void callWithLock(M &mtx, F &&f, Args &&...args) noexcept {
std::once_flag once{};
Expand Down Expand Up @@ -366,14 +266,6 @@ static constexpr std::int32_t getSecondsFromTime(std::int64_t timeMillis) {
}
} // namespace time_util

namespace string_util {

std::string encodeChar(std::int16_t c);

inline std::string encodeChar(char c) { return encodeChar(static_cast<std::int16_t>(static_cast<unsigned char>(c))); }

} // namespace string_util

namespace math_util {

/**
Expand Down
56 changes: 56 additions & 0 deletions include/dxfeed_graal_cpp_api/internal/EventClassList.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright (c) 2023 Devexperts LLC.
// SPDX-License-Identifier: MPL-2.0

#pragma once

#include <memory>
#include <utility>
#include <cstdint>

namespace dxfcpp {

struct EventClassList {
template <typename EventTypeIt>
static std::unique_ptr<EventClassList> create(EventTypeIt begin, EventTypeIt end) noexcept {
auto size = std::distance(begin, end);

if (size <= 0) {
return {};
}

auto list = create(size);

if (list->isEmpty()) {
return {};
}

std::size_t i = 0;

for (auto it = begin; it != end; it++, i++) {
list->set(i, it->getId());
}

return list;
}

void set(std::size_t index, std::uint32_t id) noexcept;

[[nodiscard]] bool isEmpty() const noexcept;

[[nodiscard]] std::size_t size() const noexcept;

void *getHandler() noexcept;

~EventClassList() noexcept;

private:
static std::unique_ptr<EventClassList> create(std::size_t size) noexcept;

EventClassList() noexcept;

struct Impl;

std::unique_ptr<Impl> impl_;
};

}
37 changes: 37 additions & 0 deletions include/dxfeed_graal_cpp_api/internal/JavaObjectHandler.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright (c) 2023 Devexperts LLC.
// SPDX-License-Identifier: MPL-2.0

#pragma once

#include "utils/StringUtils.hpp"

#include <memory>
#include <string>

namespace dxfcpp {

template <typename T> struct JavaObjectHandler {
using Type = T;
static void deleter(void *handler) noexcept;
explicit JavaObjectHandler(void *handler = nullptr) noexcept : impl_{handler, &deleter} {}

JavaObjectHandler(JavaObjectHandler &&) = default;
JavaObjectHandler &operator=(JavaObjectHandler &&) = default;
virtual ~JavaObjectHandler() noexcept = default;

[[nodiscard]] std::string toString() const noexcept {
if (impl_)
return dxfcpp::toString(impl_.get());
else
return "nullptr";
}

[[nodiscard]] void *get() const noexcept { return impl_.get(); }

explicit operator bool() const noexcept { return static_cast<bool>(impl_); }

private:
std::unique_ptr<void, decltype(&deleter)> impl_;
};

} // namespace dxfcpp
Loading

0 comments on commit 78eca87

Please sign in to comment.