@@ -19,7 +19,7 @@ namespace kumi
1919 // ! @tparam Id a compile time string that is used to retrieve the field.
2020 // ! @tparam T the type of the value that is wrapped.
2121 // ================================================================================================
22- template <concepts::identifier Id, typename T> struct field
22+ template <typename Id, typename T> struct field
2323 {
2424 using type = T;
2525 using identifier_type = Id;
@@ -28,7 +28,7 @@ namespace kumi
2828 T value;
2929
3030 // / Name associated to the field
31- static constexpr auto name () { return Id::to_str ( ); }
31+ static constexpr auto name () { return _::make_str (Id{} ); }
3232
3333 KUMI_ABI constexpr T& operator ()(identifier_type) & noexcept { return value; }
3434
@@ -54,12 +54,12 @@ namespace kumi
5454 template <typename CharT, typename Traits>
5555 friend std::basic_ostream<CharT, Traits>& operator <<(std::basic_ostream<CharT, Traits>& os, field const & w) noexcept
5656 {
57- return os << Id{} << " : " << _::make_streamable (w.value );
57+ return os << _::make_str (std:: remove_cvref_t <Id>{}) << " : " << _::make_streamable (w.value );
5858 }
5959 };
6060
6161 // EBO
62- template <concepts::identifier Id, typename T>
62+ template <typename Id, typename T>
6363 requires (std::is_empty_v<T>)
6464 struct field <Id, T> : T
6565 {
@@ -68,7 +68,7 @@ namespace kumi
6868 using inner_type = std::type_identity<T>;
6969
7070 // / Name associated to the field
71- static constexpr auto name () { return Id::to_str ( ); }
71+ static constexpr auto name () { return _::make_str (Id{} ); }
7272
7373 KUMI_ABI constexpr T& operator ()(identifier_type) & noexcept { return *this ; }
7474
@@ -94,10 +94,19 @@ namespace kumi
9494 template <typename CharT, typename Traits>
9595 friend std::basic_ostream<CharT, Traits>& operator <<(std::basic_ostream<CharT, Traits>& os, field const & w) noexcept
9696 {
97- return os << Id{} << " : " << _::make_streamable (w (_::key_of_t <decltype (w)>{}));
97+ return os << _::make_str (std:: remove_cvref_t <Id>{}) << " : " << _::make_streamable (w (_::key_of_t <decltype (w)>{}));
9898 }
9999 };
100100
101+ // / Specialisation to clearly indicate an error
102+ template <typename Id, typename T>
103+ requires (!_::valid_display_name<Id>)
104+ struct field <Id, T>
105+ {
106+ field (T&&) = delete ;
107+ static_assert (_::valid_display_name<Id>, " User defined to_str(...) function is not constexpr" );
108+ };
109+
101110 // ================================================================================================
102111 // ! @ingroup utility
103112 // ! @brief Extracts the name from a kumi::field or returns the parameter.
@@ -106,9 +115,9 @@ namespace kumi
106115 // ! @tparam T The name to extract name from.
107116 // ! @return The name of the field or kumi::unknown.
108117 // ================================================================================================
109- template <typename T> [[nodiscard]] KUMI_ABI constexpr auto name_of (as<T> ) noexcept
118+ template <typename T> [[nodiscard]] KUMI_ABI consteval auto name_of () noexcept
110119 {
111- if constexpr (concepts ::field<T>) return _::key_of_t <T>{};
120+ if constexpr (_ ::field<T>) return _::key_of_t <T>{};
112121 else return kumi::unknown{};
113122 };
114123
@@ -123,7 +132,7 @@ namespace kumi
123132 // ================================================================================================
124133 template <typename T> [[nodiscard]] KUMI_ABI constexpr decltype (auto ) field_value_of(T&& t) noexcept
125134 {
126- if constexpr (concepts ::field<T>) return (KUMI_FWD (t)(_::key_of_t <T>{}));
135+ if constexpr (_ ::field<T>) return (KUMI_FWD (t)(_::key_of_t <T>{}));
127136 else return KUMI_FWD (t);
128137 };
129138
@@ -137,7 +146,7 @@ namespace kumi
137146 // ! @return A `field` that correctly keeps the qualified input type.
138147 // ! @related kumi::field
139148 // ================================================================================================
140- template <concepts ::identifier auto Name, typename T>
149+ template <_ ::identifier auto Name, typename T>
141150 [[nodiscard]] KUMI_ABI constexpr decltype (auto ) capture_field(T&& t) noexcept
142151 {
143152 return field<decltype (Name), T>{KUMI_FWD (t)};
@@ -157,25 +166,25 @@ namespace kumi
157166 // ================================================================================================
158167 template <typename U, typename T> [[nodiscard]] KUMI_ABI constexpr decltype (auto ) field_cast(T&& t) noexcept
159168 {
160- if constexpr (concepts ::field<U>)
169+ if constexpr (_ ::field<U>)
161170 return field<_::key_of_t <T>, _::type_of_t <U>>{static_cast <_::type_of_t <U>>(KUMI_FWD (t)(_::key_of_t <T>{}))};
162- else if constexpr (!concepts ::field<T>) return static_cast <_::type_of_t <U>>(KUMI_FWD (t));
171+ else if constexpr (!_ ::field<T>) return static_cast <_::type_of_t <U>>(KUMI_FWD (t));
163172 else return field<_::key_of_t <T>, U>{static_cast <U>(KUMI_FWD (t)(_::key_of_t <T>{}))};
164173 }
165174
166175 namespace result
167176 {
168177 template <typename T> struct name_of
169178 {
170- using type = decltype (kumi::name_of(as <T>{} ));
179+ using type = decltype (kumi::name_of<T>( ));
171180 };
172181
173182 template <typename T> struct field_value_of
174183 {
175184 using type = decltype (kumi::field_value_of(std::declval<T>()));
176185 };
177186
178- template <concepts ::identifier auto Name, typename T> struct capture_field
187+ template <_ ::identifier auto Name, typename T> struct capture_field
179188 {
180189 using type = decltype (kumi::capture_field<Name>(std::declval<T>()));
181190 };
@@ -189,7 +198,7 @@ namespace kumi
189198
190199 template <typename T> using field_value_of_t = typename field_value_of<T>::type;
191200
192- template <concepts ::identifier auto Name, typename T> using capture_field_t = typename capture_field<Name, T>::type;
201+ template <_ ::identifier auto Name, typename T> using capture_field_t = typename capture_field<Name, T>::type;
193202
194203 template <typename U, typename T> using field_cast_t = typename field_cast<U, T>::type;
195204 }
0 commit comments