Skip to content

Commit

Permalink
remove and improve
Browse files Browse the repository at this point in the history
  • Loading branch information
qicosmos committed Sep 5, 2024
1 parent e609c48 commit f08ec4f
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 1,267 deletions.
54 changes: 36 additions & 18 deletions iguana/common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,19 +128,25 @@ inline constexpr bool is_custom_reflection_v =

// owner_type: parant type, value_type: member value type, SubType: subtype from
// variant
template <typename MemberPtr, size_t FieldNo,
typename ElementType = typename member_traits<MemberPtr>::value_type>
template <typename Owner, typename Value, size_t FieldNo,
typename ElementType = Value>
struct pb_field_t {
using member_type = MemberPtr;
using owner_type = typename member_traits<MemberPtr>::owner_type;
using value_type = typename member_traits<MemberPtr>::value_type;
using owner_type = Owner;
using value_type = Value;
using sub_type = ElementType;

constexpr pb_field_t() = default;
auto& value(owner_type& value) const { return value.*member_ptr; }
auto const& value(owner_type const& value) const { return value.*member_ptr; }
auto& value(owner_type& value) const {
auto member_ptr = (value_type*)((char*)(&value) + offset);
return *member_ptr;
}
// auto const& value(owner_type const& value) const {
// auto member_ptr =
// (value_type *)((char *)(&value) + offset);
// return *member_ptr;
// }

MemberPtr member_ptr;
size_t offset;
std::string_view field_name;

inline static constexpr uint32_t field_no = FieldNo;
Expand Down Expand Up @@ -170,31 +176,28 @@ inline constexpr auto get_field_no(std::index_sequence<I...>) {
return arr;
}

template <size_t field_no, typename MemberPtr, size_t... I>
constexpr inline auto build_pb_variant_fields(MemberPtr field,
template <typename T, typename value_type, size_t field_no, size_t... I>
constexpr inline auto build_pb_variant_fields(size_t offset,
std::string_view name,
std::index_sequence<I...>) {
using value_type = typename member_traits<MemberPtr>::value_type;
return std::tuple(
pb_field_t<MemberPtr, field_no + I + 1,
std::variant_alternative_t<I, value_type>>{field, name}...);
pb_field_t<T, value_type, field_no + I + 1,
std::variant_alternative_t<I, value_type>>{offset, name}...);
}

template <typename T, size_t field_no, typename ValueType>
constexpr inline auto build_pb_fields_impl(size_t offset,
std::string_view name) {
using value_type = ylt::reflection::remove_cvref_t<ValueType>;
using U = std::remove_reference_t<T>;
using P = value_type U::*;
P member_ptr = *reinterpret_cast<P*>(&offset);

if constexpr (is_variant<value_type>::value) {
constexpr uint32_t variant_size = std::variant_size_v<value_type>;
return build_pb_variant_fields<field_no>(
std::move(member_ptr), name, std::make_index_sequence<variant_size>{});
return build_pb_variant_fields<U, value_type, field_no>(
offset, name, std::make_index_sequence<variant_size>{});
}
else {
return std::tuple(pb_field_t<P, field_no + 1>{member_ptr, name});
return std::tuple(pb_field_t<U, value_type, field_no + 1>{offset, name});
}
}

Expand Down Expand Up @@ -260,4 +263,19 @@ inline bool register_type() {
return true;
#endif
}

template <typename T, typename U>
IGUANA_INLINE constexpr size_t member_offset(T* t, U T::*member) {
return (char*)&(t->*member) - (char*)t;
}

template <auto ptr, size_t field_no>
IGUANA_INLINE auto build_pb_field(std::string_view name) {
using owner =
typename ylt::reflection::member_traits<decltype(ptr)>::owner_type;
using value_type =
typename ylt::reflection::member_traits<decltype(ptr)>::value_type;
size_t offset = member_offset((owner*)nullptr, ptr);
return iguana::detail::pb_field_t<owner, value_type, field_no>{offset, name};
}
} // namespace iguana
10 changes: 2 additions & 8 deletions iguana/dynamic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,6 @@
namespace iguana {
using base = detail::base;

template <typename T, typename U>
IGUANA_INLINE constexpr size_t member_offset(T* t, U T::*member) {
return (char*)&(t->*member) - (char*)t;
}

constexpr inline uint8_t ENABLE_JSON = 0x01;
constexpr inline uint8_t ENABLE_YAML = 0x02;
constexpr inline uint8_t ENABLE_XML = 0x04;
Expand Down Expand Up @@ -102,7 +97,7 @@ struct base_impl : public base {
std::visit(
[&](auto const& val) {
if (val.field_name == name) {
info.offset = member_offset((T*)this, val.member_ptr);
info.offset = val.offset;
using value_type =
typename std::remove_reference_t<decltype(val)>::value_type;
#if defined(__clang__) || defined(_MSC_VER) || \
Expand Down Expand Up @@ -151,8 +146,7 @@ struct base_impl : public base {
if (val.field_name == name) {
using value_type =
typename std::remove_reference_t<decltype(val)>::value_type;
auto const offset = member_offset((T*)this, val.member_ptr);
auto ptr = (char*)this + offset;
auto ptr = (char*)this + val.offset;
result = *((value_type*)ptr);
}
},
Expand Down
1 change: 0 additions & 1 deletion iguana/pb_util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

#include "common.hpp"
#include "detail/pb_type.hpp"
// #include "reflection.hpp"
#include "util.hpp"

namespace iguana {
Expand Down
Loading

0 comments on commit f08ec4f

Please sign in to comment.