Use PublicCast from utempl instead custom implementation
This commit is contained in:
parent
cfd566d52a
commit
efba236215
3 changed files with 9 additions and 40 deletions
|
@ -176,13 +176,13 @@ target_include_directories(larra_xmpp PUBLIC
|
|||
if(TARGET Boost::pfr)
|
||||
target_link_libraries(larra_xmpp PUBLIC
|
||||
Boost::asio Boost::serialization utempl::utempl pugixml::pugixml
|
||||
OpenSSL::SSL nameof::nameof
|
||||
OpenSSL::SSL nameof::nameof fmt::fmt
|
||||
OpenSSL::Crypto spdlog xmlplusplus ${LIBXML2_LIBRARIES})
|
||||
else()
|
||||
find_package(Boost 1.85.0 COMPONENTS serialization REQUIRED)
|
||||
target_link_libraries(larra_xmpp PUBLIC
|
||||
utempl::utempl ${Boost_LIBRARIES} pugixml::pugixml OpenSSL::SSL
|
||||
nameof::nameof
|
||||
nameof::nameof fmt::fmt
|
||||
OpenSSL::Crypto spdlog xmlplusplus ${LIBXML2_LIBRARIES})
|
||||
endif()
|
||||
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
#pragma once
|
||||
#include <cstddef>
|
||||
#include <type_traits>
|
||||
|
||||
namespace larra::xmpp::impl {
|
||||
|
||||
template <typename T, std::size_t I = 0>
|
||||
struct PublicCastTag {
|
||||
friend constexpr auto MagicGetPrivateMember(PublicCastTag);
|
||||
};
|
||||
|
||||
template <auto ptr, std::size_t I = 0>
|
||||
struct PublicCast {};
|
||||
|
||||
template <typename T, typename R, R T::*ptr, std::size_t I>
|
||||
struct PublicCast<ptr, I> {
|
||||
friend constexpr auto MagicGetPrivateMember(PublicCastTag<T, I>) {
|
||||
return ptr;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, typename R, typename... Args, R (T::*ptr)(Args...), std::size_t I>
|
||||
struct PublicCast<ptr, I> {
|
||||
friend constexpr auto MagicGetPrivateMember(PublicCastTag<T, I>) {
|
||||
return ptr;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, std::size_t I = 0>
|
||||
constexpr auto GetPrivateMember(const T&) {
|
||||
return MagicGetPrivateMember(PublicCastTag<std::decay_t<T>, I>{});
|
||||
};
|
||||
|
||||
} // namespace larra::xmpp::impl
|
|
@ -1,20 +1,23 @@
|
|||
#include <libxml/parser.h>
|
||||
|
||||
#include <larra/impl/public_cast.hpp>
|
||||
#include <larra/utils.hpp>
|
||||
#include <larra/xml_stream.hpp>
|
||||
#include <ranges>
|
||||
#include <span>
|
||||
#include <utempl/public_cast.hpp>
|
||||
|
||||
namespace larra::xmpp::impl {
|
||||
namespace utempl {
|
||||
|
||||
template struct PublicCast<&xmlpp::SaxParser::sax_handler_>;
|
||||
|
||||
}
|
||||
|
||||
namespace larra::xmpp::impl {
|
||||
|
||||
auto Parser::ParseChunk(std::string_view str) -> const xmlError* {
|
||||
xmlResetLastError();
|
||||
|
||||
if(!context_) {
|
||||
this->context_ = xmlCreatePushParserCtxt((this->*GetPrivateMember(static_cast<xmlpp::SaxParser&>(*this))).get(),
|
||||
this->context_ = xmlCreatePushParserCtxt((this->*utempl::GetPrivateMember<"sax_handler_">(static_cast<xmlpp::SaxParser&>(*this))).get(),
|
||||
nullptr, // user_data
|
||||
nullptr, // chunk
|
||||
0, // size
|
||||
|
|
Loading…
Reference in a new issue