Skip to content

Commit 34d753f

Browse files
committed
add cv/ref qualifiers to format_typename
1 parent 249f459 commit 34d753f

File tree

4 files changed

+85
-7
lines changed

4 files changed

+85
-7
lines changed

rpp/format.h

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,46 @@ struct Typename {
311311
}
312312
};
313313

314+
template<Reflectable T>
315+
struct Typename<const T> {
316+
template<Allocator A>
317+
[[nodiscard]] static String<A> name() noexcept {
318+
return format<A>("const %"_v, Typename<T>::template name<A>());
319+
}
320+
};
321+
322+
template<Reflectable T>
323+
struct Typename<volatile T> {
324+
template<Allocator A>
325+
[[nodiscard]] static String<A> name() noexcept {
326+
return format<A>("volatile %"_v, Typename<T>::template name<A>());
327+
}
328+
};
329+
330+
template<Reflectable T>
331+
struct Typename<const volatile T> {
332+
template<Allocator A>
333+
[[nodiscard]] static String<A> name() noexcept {
334+
return format<A>("const volatile %"_v, Typename<T>::template name<A>());
335+
}
336+
};
337+
338+
template<Reflectable T>
339+
struct Typename<T&> {
340+
template<Allocator A>
341+
[[nodiscard]] static String<A> name() noexcept {
342+
return format<A>("%&"_v, Typename<T>::template name<A>());
343+
}
344+
};
345+
346+
template<Reflectable T>
347+
struct Typename<T&&> {
348+
template<Allocator A>
349+
[[nodiscard]] static String<A> name() noexcept {
350+
return format<A>("%&&"_v, Typename<T>::template name<A>());
351+
}
352+
};
353+
314354
template<Reflectable T>
315355
struct Typename<T*> {
316356
template<Allocator A>
@@ -392,7 +432,7 @@ struct Typename<T<T0, T1>> {
392432

393433
template<Reflectable T, Allocator A = Mdefault>
394434
[[nodiscard]] String<A> format_typename() noexcept {
395-
return Format::Typename<Decay<T>>::template name<A>();
435+
return Format::Typename<T>::template name<A>();
396436
}
397437

398438
} // namespace rpp

rpp/reflect.h

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -351,16 +351,29 @@ constexpr void iterate_record(F&& f, const R& record) noexcept {
351351
}
352352

353353
template<typename T>
354-
struct Refl<const T> : Refl<T> {};
354+
struct Refl<const T> : Refl<T> {
355+
using is_const = const T;
356+
};
355357

356358
template<typename T>
357-
struct Refl<T&> : Refl<T> {};
359+
struct Refl<volatile T> : Refl<T> {
360+
using is_volatile = volatile T;
361+
};
358362

359363
template<typename T>
360-
struct Refl<const T&> : Refl<T> {};
364+
struct Refl<const volatile T> : Refl<T> {
365+
using is_const_volatile = const volatile T;
366+
};
361367

362368
template<typename T>
363-
struct Refl<T&&> : Refl<T> {};
369+
struct Refl<T&> : Refl<T> {
370+
using is_lvalue_reference = T&;
371+
};
372+
373+
template<typename T>
374+
struct Refl<T&&> : Refl<T> {
375+
using is_rvalue_reference = T&&;
376+
};
364377

365378
template<typename T>
366379
struct Refl<T*> {

test/format.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,19 @@ i32 main() {
114114
info("% %", format_typename<Array<Vec<i32>, 2>>(),
115115
Array<Vec<i32>, 2>{Vec<i32>{1, 2}, Vec<i32>{3, 4}});
116116

117+
info("%", format_typename<i32&>());
118+
info("%", format_typename<i32&&>());
119+
info("%", format_typename<const i32>());
120+
info("%", format_typename<const i32&>());
121+
info("%", format_typename<const i32&&>());
122+
info("%", format_typename<volatile i32>());
123+
info("%", format_typename<volatile i32&>());
124+
info("%", format_typename<volatile i32&&>());
125+
info("%", format_typename<const volatile i32>());
126+
info("%", format_typename<const volatile i32&>());
127+
info("%", format_typename<const volatile i32&&>());
128+
info("%", format_typename<Array<const Slice<volatile Tuple<>>&, 1>>());
129+
117130
{
118131
Rc<i32> r{5};
119132
Rc<i32> r2 = r.dup();

test/format.expect

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[Level::info] %
22
[Level::info] true
33
[Level::info] false
4-
[Level::info] i32[] [1, 2]
4+
[Level::info] i32[2] [1, 2]
55
[Level::info] Ints Ints{i : 10, u : 2}
66
[Level::info] Kind Kind::enum_
77
[Level::info] Hello
@@ -30,7 +30,7 @@
3030
[Level::info] [0, 0]
3131
[Level::info] Vec<i32> Vec[1, 2]
3232
[Level::info] Vec[]
33-
[Level::info] Slice<i32> Slice[1, 2]
33+
[Level::info] Slice<const i32> Slice[1, 2]
3434
[Level::info] Slice[]
3535
[Level::info] Stack<i32> Stack[1, 2]
3636
[Level::info] Stack[]
@@ -47,6 +47,18 @@
4747
[Level::info] Atomic{value_ : 3}
4848
[Level::info] Vecs{i : Vec[1, 2], u : Vec[3, 4]}
4949
[Level::info] Array<Vec<i32>, 2> [Vec[1, 2], Vec[3, 4]]
50+
[Level::info] i32&
51+
[Level::info] i32&&
52+
[Level::info] const i32
53+
[Level::info] const i32&
54+
[Level::info] const i32&&
55+
[Level::info] volatile i32
56+
[Level::info] volatile i32&
57+
[Level::info] volatile i32&&
58+
[Level::info] const volatile i32
59+
[Level::info] const volatile i32&
60+
[Level::info] const volatile i32&&
61+
[Level::info] Array<const Slice<volatile Tuple<>>&, 1>
5062
[Level::info] Rc[2]{5}
5163
[Level::info] Arc[2]{5}
5264
[Level::info] Vec2{1.000000, 2.000000}

0 commit comments

Comments
 (0)