Skip to content

Commit

Permalink
optimize performance
Browse files Browse the repository at this point in the history
  • Loading branch information
qicosmos committed Sep 5, 2024
1 parent dc2746d commit e609c48
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 44 deletions.
9 changes: 2 additions & 7 deletions iguana/common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,16 +213,11 @@ template <typename T>
inline auto get_pb_members_tuple(T&& t) {
using U = ylt::reflection::remove_cvref_t<T>;
if constexpr (ylt_refletable_v<U>) {
static auto& offset_arr =
ylt::reflection::internal::get_member_offset_arr(ylt::reflection::internal::wrapper<U>::value);
static auto& offset_arr = ylt::reflection::internal::get_member_offset_arr(
ylt::reflection::internal::wrapper<U>::value);
using Tuple = decltype(ylt::reflection::object_to_tuple(std::declval<U>()));
return build_pb_fields<Tuple, T>(
offset_arr, std::make_index_sequence<std::tuple_size_v<Tuple>>{});
// return ylt::reflection::visit_members(std::forward<T>(t), [&](auto&...
// args) {
// return build_pb_fields<U>(std::tuple(&args...),
// std::make_index_sequence<sizeof...(args)>{});
// });
}
else if constexpr (is_custom_reflection_v<U>) {
return get_members_impl((U*)nullptr);
Expand Down
15 changes: 6 additions & 9 deletions iguana/json_reader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -606,15 +606,12 @@ IGUANA_INLINE void from_json(T &value, It &&it, It &&end) {
if (member_it != frozen_map.end())
IGUANA_LIKELY {
std::visit(
[&](auto member_ptr) IGUANA__INLINE_LAMBDA {
using V = std::decay_t<decltype(member_ptr)>;
if constexpr (std::is_member_pointer_v<V>) {
using namespace detail;
from_json_impl(value.*member_ptr, it, end);
}
else {
static_assert(!sizeof(V), "type not supported");
}
[&](auto offset) IGUANA__INLINE_LAMBDA {
using namespace detail;
using value_type = typename decltype(offset)::type;
auto member_ptr =
(value_type *)((char *)(&value) + offset.value);
from_json_impl(*member_ptr, it, end);
},
member_it->second);
}
Expand Down
10 changes: 6 additions & 4 deletions iguana/xml_reader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -452,10 +452,12 @@ IGUANA_INLINE void xml_parse_item(T &value, It &&it, It &&end,
if (member_it != frozen_map.end())
IGUANA_LIKELY {
std::visit(
[&](auto field) IGUANA__INLINE_LAMBDA {
using V = std::remove_reference_t<decltype(value.*field)>;
if constexpr (!cdata_v<V>) {
xml_parse_item(value.*field, it, end, key);
[&](auto offset) IGUANA__INLINE_LAMBDA {
using value_type = typename decltype(offset)::type;
if constexpr (!cdata_v<value_type>) {
auto member_ptr =
(value_type *)((char *)(&value) + offset.value);
xml_parse_item(*member_ptr, it, end, key);
if constexpr (iguana::has_iguana_required_arr_v<U>) {
key_set.append(key).append(", ");
}
Expand Down
14 changes: 5 additions & 9 deletions iguana/yaml_reader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -551,15 +551,11 @@ IGUANA_INLINE void from_yaml(T &value, It &&it, It &&end, size_t min_spaces) {
if (member_it != frozen_map.end())
IGUANA_LIKELY {
std::visit(
[&](auto field_ptr) IGUANA__INLINE_LAMBDA {
using V = decltype(field_ptr);
if constexpr (std::is_member_pointer_v<V>) {
detail::yaml_parse_item(value.*field_ptr, it, end,
spaces + 1);
}
else {
static_assert(!sizeof(V), "type not supported");
}
[&](auto offset) IGUANA__INLINE_LAMBDA {
using value_type = typename decltype(offset)::type;
auto member_ptr =
(value_type *)((char *)(&value) + offset.value);
detail::yaml_parse_item(*member_ptr, it, end, spaces + 1);
},
member_it->second);
}
Expand Down
22 changes: 10 additions & 12 deletions iguana/ylt/reflection/member_value.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,16 @@ inline constexpr frozen::string filter_str(const frozen::string& str) {
return str;
}

template <typename value_type>
struct offset_t {
using type = value_type;
size_t value;
};

template <typename T, typename Tuple, size_t... Is>
inline auto get_variant_type() {
return std::variant<
ylt::reflection::remove_cvref_t<std::tuple_element_t<Is, Tuple>>
T::*...>{};
}

template <typename T, typename value_type>
inline auto get_member_ptr(size_t offset) {
using P = value_type T::*;
return *(P*)(&offset);
return std::variant<offset_t<
ylt::reflection::remove_cvref_t<std::tuple_element_t<Is, Tuple>>>...>{};
}

template <typename T, size_t... Is>
Expand All @@ -80,9 +79,8 @@ inline constexpr auto get_variant_map_impl(std::index_sequence<Is...>) {
return frozen::unordered_map<frozen::string, ValueType, sizeof...(Is)>{
{filter_str(arr[Is]),
ValueType{std::in_place_index<Is>,
get_member_ptr<U, ylt::reflection::remove_cvref_t<
std::tuple_element_t<Is, Tuple>>>(
offset_arr[Is])}}...};
offset_t<ylt::reflection::remove_cvref_t<
std::tuple_element_t<Is, Tuple>>>{offset_arr[Is]}}}...};
}

} // namespace internal
Expand Down
8 changes: 5 additions & 3 deletions test/test_cpp20.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,12 +187,14 @@ TEST_CASE("test simple") {
static_assert(iguana::ylt_refletable_v<point_t>, "e");
iguana::to_json(pt, str);
std::cout << str << "\n";
auto map = ylt::reflection::get_variant_map(pt);
static auto map = ylt::reflection::get_variant_map<point_t>();
for (auto& [key, var] : map) {
std::cout << key.data() << "\n";
std::visit(
[](auto ptr) {
std::cout << *ptr << "\n";
[&](auto offset) {
using value_type = typename decltype(offset)::type;
auto member_ptr = (value_type*)((char*)(&pt) + offset.value);
std::cout << *member_ptr << "\n";
},
var);
}
Expand Down

0 comments on commit e609c48

Please sign in to comment.