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 e5ddf29 commit 9ee553d
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 7 deletions.
46 changes: 45 additions & 1 deletion include/dxfeed_graal_cpp_api/internal/Common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ struct EventClassList {
return {};
}

auto list = handler_utils::EventClassList::create(size);
auto list = create(size);

if (list->isEmpty()) {
return {};
Expand Down Expand Up @@ -182,6 +182,50 @@ struct EventClassList {
std::unique_ptr<Impl> impl_;
};

struct SymbolsList {
template <typename SymbolIt>
static std::unique_ptr<EventClassList> create(SymbolIt begin, SymbolIt 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);
}

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;

~SymbolsList() noexcept;

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

SymbolsList() noexcept;

struct Impl;

std::unique_ptr<Impl> impl_;
};

} // namespace handler_utils

template <typename It>
Expand Down
12 changes: 6 additions & 6 deletions src/internal/Common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ concept RawGraalList = requires(T list) {
};

template <RawGraalList List> struct RawGraalListTraits {
using SizeType = std::decay_t<decltype(List{}.size)>;
using ElementType = std::decay_t<std::remove_pointer_t<std::remove_pointer_t<decltype(List{}.elements)>>>;
using SizeType = typename std::decay_t<decltype(List{}.size)>;
using ElementType = typename std::decay_t<std::remove_pointer_t<std::remove_pointer_t<decltype(List{}.elements)>>>;
};

template <RawGraalList List, typename ValueType, auto ElementSetter> struct RawListWrapper {
template <RawGraalList List, auto ElementSetter> struct RawListWrapper {
#if DXFCPP_DEBUG == 1
static auto getDebugName() {
return fmt::format("RawListWrapper<{}, {}, {}>", typeid(List).name(), typeid(ValueType).name(),
return fmt::format("RawListWrapper<{}, {}>", typeid(List).name(),
typeid(ElementSetter).name());
}
#endif
Expand All @@ -59,7 +59,7 @@ template <RawGraalList List, typename ValueType, auto ElementSetter> struct RawL
}
}

void set(std::size_t index, ValueType value) const noexcept {
void set(std::size_t index, auto value) const noexcept {
if constexpr (Debugger::traceLists) {
Debugger::trace("{}::set({}, {})", getDebugName(), index, value);
}
Expand Down Expand Up @@ -184,7 +184,7 @@ template <RawGraalList List, typename ValueType, auto ElementSetter> struct RawL
};

struct EventClassList::Impl
: public RawListWrapper<dxfg_event_clazz_list_t, std::uint32_t,
: public RawListWrapper<dxfg_event_clazz_list_t,
[](dxfg_event_clazz_list_t &list, std::size_t index, std::uint32_t id) {
*list.elements[index] = static_cast<dxfg_event_clazz_t>(id);
}> {};
Expand Down

0 comments on commit 9ee553d

Please sign in to comment.