Skip to content

Commit

Permalink
Merge pull request #287 from bbbgan/master
Browse files Browse the repository at this point in the history
  • Loading branch information
qicosmos authored Jun 20, 2024
2 parents 2fb49a7 + 450f2be commit c879c65
Show file tree
Hide file tree
Showing 9 changed files with 167 additions and 78 deletions.
2 changes: 1 addition & 1 deletion iguana/detail/pb_type.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ inline bool operator<(const sfixed64_t& lhs, const sfixed64_t& rhs) {
return lhs.val < rhs.val;
}

template <class T>
template <typename Type, typename T = std::decay_t<Type>>
constexpr bool is_pb_type_v =
std::is_same_v<sint32_t, T> || std::is_same_v<sint64_t, T> ||
std::is_same_v<fixed32_t, T> || std::is_same_v<fixed64_t, T> ||
Expand Down
8 changes: 8 additions & 0 deletions iguana/dynamic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ struct base_impl : public base {
from_xml_adl((iguana_adl_t*)nullptr, *(static_cast<T*>(this)), str);
}

void to_yaml(std::string& str) override {
to_yaml_adl((iguana_adl_t*)nullptr, *(static_cast<T*>(this)), str);
}

void from_yaml(std::string_view str) override {
from_yaml_adl((iguana_adl_t*)nullptr, *(static_cast<T*>(this)), str);
}

iguana::detail::field_info get_field_info(std::string_view name) override {
static constexpr auto map = iguana::get_members<T>();
iguana::detail::field_info info{};
Expand Down
2 changes: 2 additions & 0 deletions iguana/reflection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,8 @@ struct base {
virtual void from_xml(std::string_view str) {}
virtual void to_json(std::string &str) {}
virtual void from_json(std::string_view str) {}
virtual void to_yaml(std::string &str) {}
virtual void from_yaml(std::string_view str) {}
virtual std::vector<std::string_view> get_fields_name() { return {}; }
virtual iguana::detail::field_info get_field_info(std::string_view name) {
return {};
Expand Down
4 changes: 2 additions & 2 deletions iguana/util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,8 @@ IGUANA_INLINE void write_string_with_escape(const Ch* it, SizeType length,

template <typename T, size_t N>
IGUANA_INLINE constexpr bool has_duplicate(const std::array<T, N>& arr) {
for (int i = 0; i < arr.size(); i++) {
for (int j = i + 1; j < arr.size(); j++) {
for (size_t i = 0; i < arr.size(); i++) {
for (size_t j = i + 1; j < arr.size(); j++) {
if (arr[i] == arr[j]) {
return true;
}
Expand Down
72 changes: 36 additions & 36 deletions iguana/xml_reader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,20 @@ namespace iguana {
namespace detail {

template <typename U, typename It, std::enable_if_t<optional_v<U>, int> = 0>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name);
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name);

template <typename U, typename It, std::enable_if_t<smart_ptr_v<U>, int> = 0>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name);
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name);

template <typename U, typename It, std::enable_if_t<refletable_v<U>, int> = 0>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name);
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name);

template <typename U, typename It, std::enable_if_t<attr_v<U>, int> = 0>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name);
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name);

template <typename U, typename It, std::enable_if_t<plain_v<U>, int> = 0>
IGUANA_INLINE void xml_parse_value(U &&value, It &&begin, It &&end) {
Expand Down Expand Up @@ -127,8 +127,8 @@ IGUANA_INLINE void parse_attr(U &&value, It &&it, It &&end) {
}

template <typename U, typename It, std::enable_if_t<plain_v<U>, int> = 0>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name) {
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name) {
skip_till<'>'>(it, end);
++it;
skip_sapces_and_newline(it, end);
Expand All @@ -139,16 +139,16 @@ IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
}

template <typename U, typename It, std::enable_if_t<is_pb_type_v<U>, int> = 0>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name) {
parse_item(value.val, it, end, name);
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name) {
xml_parse_item(value.val, it, end, name);
}

template <typename U, typename It,
std::enable_if_t<sequence_container_v<U>, int> = 0>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name) {
parse_item(value.emplace_back(), it, end, name);
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name) {
xml_parse_item(value.emplace_back(), it, end, name);
skip_sapces_and_newline(it, end);
while (it != end) {
match<'<'>(it, end);
Expand All @@ -166,27 +166,27 @@ IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
it = start - 1;
return;
}
parse_item(value.emplace_back(), it, end, name);
xml_parse_item(value.emplace_back(), it, end, name);
skip_sapces_and_newline(it, end);
}
}

template <typename U, typename It,
std::enable_if_t<map_container_v<U>, int> = 0>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name) {
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name) {
throw std::bad_function_call();
}

template <typename U, typename It, std::enable_if_t<variant_v<U>, int> = 0>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name) {
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name) {
throw std::bad_function_call();
}

template <typename U, typename It, std::enable_if_t<optional_v<U>, int>>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name) {
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name) {
using value_type = typename std::remove_reference_t<U>::value_type;
skip_till<'>'>(it, end);
if (*(it - 1) == '/')
Expand All @@ -211,28 +211,28 @@ IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
match_close_tag(it, end, name);
}
else {
parse_item(value.emplace(), it, end, name);
xml_parse_item(value.emplace(), it, end, name);
}
}

template <typename U, typename It, std::enable_if_t<smart_ptr_v<U>, int>>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name) {
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name) {
if constexpr (unique_ptr_v<U>) {
value = std::make_unique<typename std::remove_cvref_t<U>::element_type>();
}
else {
value = std::make_shared<typename std::remove_cvref_t<U>::element_type>();
}

parse_item(*value, it, end, name);
xml_parse_item(*value, it, end, name);
}

template <typename U, typename It, std::enable_if_t<attr_v<U>, int>>
IGUANA_INLINE void parse_item(U &value, It &&it, It &&end,
std::string_view name) {
IGUANA_INLINE void xml_parse_item(U &value, It &&it, It &&end,
std::string_view name) {
parse_attr(value.attr(), it, end);
parse_item(value.value(), it, end, name);
xml_parse_item(value.value(), it, end, name);
}

// /> or skip <?>、 <!> and <tag></tag> until the </name>
Expand Down Expand Up @@ -393,8 +393,8 @@ IGUANA_INLINE void check_required(std::string_view key_set) {
}

template <typename T, typename It, std::enable_if_t<refletable_v<T>, int>>
IGUANA_INLINE void parse_item(T &value, It &&it, It &&end,
std::string_view name) {
IGUANA_INLINE void xml_parse_item(T &value, It &&it, It &&end,
std::string_view name) {
using U = std::decay_t<T>;
constexpr auto cdata_idx = get_type_index<is_cdata_t, U>();
skip_till<'>'>(it, end);
Expand Down Expand Up @@ -425,7 +425,7 @@ IGUANA_INLINE void parse_item(T &value, It &&it, It &&end,
if (parse_done || key != st_key)
IGUANA_UNLIKELY { return; }
if constexpr (!cdata_v<item_type>) {
parse_item(value.*member_ptr, it, end, key);
xml_parse_item(value.*member_ptr, it, end, key);
if constexpr (iguana::has_iguana_required_arr_v<U>) {
key_set.append(key).append(", ");
}
Expand Down Expand Up @@ -459,7 +459,7 @@ IGUANA_INLINE void parse_item(T &value, It &&it, It &&end,
"type must be memberptr");
using V = std::remove_reference_t<decltype(value.*member_ptr)>;
if constexpr (!cdata_v<V>) {
parse_item(value.*member_ptr, it, end, key);
xml_parse_item(value.*member_ptr, it, end, key);
if constexpr (iguana::has_iguana_required_arr_v<U>) {
key_set.append(key).append(", ");
}
Expand Down Expand Up @@ -497,7 +497,7 @@ IGUANA_INLINE void from_xml(U &value, It &&it, It &&end) {
std::string_view key =
std::string_view{&*start, static_cast<size_t>(std::distance(start, it))};
detail::parse_attr(value.attr(), it, end);
detail::parse_item(value.value(), it, end, key);
detail::xml_parse_item(value.value(), it, end, key);
}

template <typename It, typename U, std::enable_if_t<refletable_v<U>, int> = 0>
Expand All @@ -507,7 +507,7 @@ IGUANA_INLINE void from_xml(U &value, It &&it, It &&end) {
skip_till_greater_or_space(it, end);
std::string_view key =
std::string_view{&*start, static_cast<size_t>(std::distance(start, it))};
detail::parse_item(value, it, end, key);
detail::xml_parse_item(value, it, end, key);
}

template <typename U, typename View,
Expand Down
Loading

0 comments on commit c879c65

Please sign in to comment.