49 for (std::size_t i = 0; i < std::max((indent *
args.indent), 0UL); ++i) {
78 if constexpr (std::is_reference_v<typename f::type>) {
79 const auto& it = f::from_instance(obj);
81 out << std::format(
"0x{:X}", (std::size_t)&it);
88 }
else if constexpr (std::is_pointer_v<typename f::type>) {
89 const auto* it = f::from_instance(obj);
91 out << std::format(
"0x{:X}", (std::size_t)it);
95 if constexpr (not std::is_void_v<std::remove_pointer_t<typename f::type>>) {
104 const auto& it = f::from_instance(obj);
118 void print_obj_impl(O& out,
const R& obj, std::size_t indent, std::index_sequence<I...>) {
119 out << refl::type_name<R> <<
" {" <<
"\n";
121 for (std::size_t i = 0; i < indent; ++i) {
122 for (std::size_t j = 0; j <
args.indent; ++j) {
165 using item_type =
typename T::value_type;
166 out <<
"[" << std::endl;
167 for (
auto item = it.begin(); item != it.end(); ++item) {
168 for (std::size_t i = 0; i < std::max((indent *
args.indent), 0UL); ++i) {
172 if constexpr (std::is_reference_v<item_type>) {
173 const auto& value = *item;
175 out << std::format(
"0x{:X}", (std::size_t)&value);
182 }
else if constexpr (std::is_pointer_v<item_type>) {
183 const auto* value = *item;
185 out << std::format(
"0x{:X}", (std::size_t)value);
189 if constexpr (not std::is_void_v<std::remove_pointer_t<item_type>>) {
190 if (value !=
nullptr) {
200 const auto& value = *item;
208 out <<
"," << std::endl;
210 for (std::size_t i = 0; i < std::max((indent *
args.indent), 0UL); ++i) {
218 using item_type_1 =
typename T::first_type;
219 using item_type_2 =
typename T::second_type;
222 if constexpr (std::is_reference_v<item_type_1>) {
223 const auto& value = it.first;
225 out << std::format(
"0x{:X}", (std::size_t)&value);
232 }
else if constexpr (std::is_pointer_v<item_type_1>) {
233 const auto* value = it.first;
235 out << std::format(
"0x{:X}", (std::size_t)value);
239 if constexpr (not std::is_void_v<std::remove_pointer_t<item_type_1>>) {
240 if (value !=
nullptr) {
250 const auto& value = it.first;
259 if constexpr (std::is_reference_v<item_type_2>) {
260 const auto& value = it.second;
262 out << std::format(
"0x{:X}", (std::size_t)&value);
269 }
else if constexpr (std::is_pointer_v<item_type_2>) {
270 const auto* value = it.second;
272 out << std::format(
"0x{:X}", (std::size_t)value);
276 if constexpr (not std::is_void_v<std::remove_pointer_t<item_type_2>>) {
277 if (value !=
nullptr) {
285 const auto& value = it.second;
297 void print_any(O& out,
const T& it, std::size_t indent) {
298 if constexpr (packtl::is_type<std::vector, T>::value) {
300 }
else if constexpr (packtl::is_type<std::list, T>::value) {
302 }
else if constexpr (packtl::is_type<std::deque, T>::value) {
304 }
else if constexpr (packtl::is_type<std::queue, T>::value) {
306 }
else if constexpr (packtl::is_type<std::stack, T>::value) {
308 }
else if constexpr (packtl::is_type<std::map, T>::value) {
310 }
else if constexpr (packtl::is_type<std::unordered_map, T>::value) {
312 }
else if constexpr (packtl::is_type<std::set, T>::value) {
314 }
else if constexpr (packtl::is_type<std::unordered_set, T>::value) {
316 }
else if constexpr (packtl::is_type<std::pair, T>::value) {
318 }
else if constexpr (std::is_same_v<T, std::atomic_flag>) {
319 out << (it.test() ?
"SET" :
"CLEAR");
320 }
else if constexpr (packtl::is_type<std::unique_ptr, T>::value) {
321 const auto* value = it.get();
323 out << std::format(
"0x{:X}", (std::size_t)value);
326 }
else if constexpr (packtl::is_type<std::shared_ptr, T>::value) {
327 const auto* value = it.get();
329 out << std::format(
"0x{:X}", (std::size_t)value);
332 }
else if constexpr (packtl::is_type<std::weak_ptr, T>::value) {
333 const auto* value = it.get();
335 out << std::format(
"0x{:X}", (std::size_t)value);
339 if (visited_.contains((std::size_t)&it)) {
340 out <<
"<circular reference>";
343 visited_.emplace((std::size_t)&it);
345 }
else if constexpr (std::is_convertible_v<T, std::string>) {
346 out << std::format(
"{:?}", it);
347 }
else if constexpr (std::same_as<T, char>) {
348 out << std::format(
"0x{:X} '{}'", (
int)it, it);
349 }
else if constexpr (std::formattable<T, char>) {
350 out << std::format(
"{}", it);
402 [&]<std::size_t... I>(std::index_sequence<I...>) {
403 (self().template handle_field<R, refl::field<R, I>>(obj), ...);
404 }(std::make_index_sequence<refl::field_count<R>>());
406 [&]<std::size_t... I>(std::index_sequence<I...>) {
407 (visit_obj_method<R, I>(obj), ...);
408 }(std::make_index_sequence<refl::method_count<R>>());
413 if constexpr (std::is_reference_v<typename Field::type>) {
414 const auto& it = Field::from_instance(obj);
415 self().handle_reference(it);
416 }
else if constexpr (std::is_pointer_v<typename Field::type>) {
417 const auto* it = Field::from_instance(obj);
418 self().handle_pointer(it);
420 const auto& it = Field::from_instance(obj);
421 self().handle_value(it);
427 using item_type =
typename T::value_type;
428 for (
auto item = iterable.begin(); item != iterable.end(); ++item) {
429 if constexpr (std::is_reference_v<item_type>) {
430 const auto& it = *item;
431 self().handle_reference(it);
432 }
else if constexpr (std::is_pointer_v<item_type>) {
433 const auto* it = *item;
434 self().handle_pointer(it);
436 const auto& it = *item;
437 self().handle_value(it);
458 if constexpr (packtl::is_type<std::vector, T>::value) {
459 self().handle_iterable(it);
460 }
else if constexpr (packtl::is_type<std::list, T>::value) {
461 self().handle_iterable(it);
462 }
else if constexpr (packtl::is_type<std::deque, T>::value) {
463 self().handle_iterable(it);
464 }
else if constexpr (packtl::is_type<std::queue, T>::value) {
465 self().handle_iterable(it);
466 }
else if constexpr (packtl::is_type<std::stack, T>::value) {
467 self().handle_iterable(it);
468 }
else if constexpr (packtl::is_type<std::map, T>::value) {
469 self().handle_iterable(it);
470 }
else if constexpr (packtl::is_type<std::unordered_map, T>::value) {
471 self().handle_iterable(it);
472 }
else if constexpr (packtl::is_type<std::set, T>::value) {
473 self().handle_iterable(it);
474 }
else if constexpr (packtl::is_type<std::unordered_set, T>::value) {
475 self().handle_iterable(it);
476 }
else if constexpr (packtl::is_type<std::pair, T>::value) {
477 self().visit_std_pair(it);
499 self().handle_obj(it);