ORIGINAL
Loading...
Searching...
No Matches
printable.h
Go to the documentation of this file.
1#ifndef PRINTABLE_H
2#define PRINTABLE_H
3#pragma once
4
5#include <memory>
6#include "format"
7#include "types.h"
8#include "sstream"
9
27namespace original {
28
39class printable {
40 mutable std::string cache_string_;
41
42public:
43 virtual ~printable() = 0;
44
56 [[nodiscard]] virtual std::string className() const;
57
68 [[nodiscard]] virtual std::string toString(bool enter) const;
69
74 explicit operator std::string() const;
75
82 explicit operator const char*() const;
83
91 [[nodiscard]] const char* toCString(bool enter) const;
92
93 // ----------------- Static Format Utilities -----------------
94
113 template<typename TYPE>
114 static std::string formatString(const TYPE& t);
115
122 template<Printable TYPE>
123 static std::string formatString(const TYPE& t);
124
131 template<EnumType TYPE>
132 static std::string formatString(const TYPE& t);
133
145 template <typename TYPE>
146 static std::string formatString(TYPE* const& ptr);
147
157 template<typename TYPE>
158 static const char* formatCString(const TYPE& t);
159
171 template<typename TYPE>
172 static std::string formatEnum(const TYPE& t);
173
174 friend std::ostream& operator<<(std::ostream& os, const printable& p);
175};
176
188std::ostream& operator<<(std::ostream& os, const printable& p);
189
190} // namespace original
191
203 template<typename T>
205 struct std::formatter<T> { // NOLINT
206
212 static constexpr auto parse(format_parse_context& ctx);
213
220 static auto format(const T& p, format_context& ctx);
221};
222
223// ----------------- Definitions of printable.h -----------------
224
225inline original::printable::~printable() = default;
226
227inline auto original::printable::className() const -> std::string
228{
229 return "printable";
230}
231
232inline auto original::printable::toString(const bool enter) const -> std::string
233{
234 std::stringstream ss;
235 ss << this->className() << "(" << formatString(this) << ")";
236 if (enter) ss << "\n";
237 return ss.str();
238}
239
240inline original::printable::operator std::string() const {
241 return this->toString(false);
242}
243
244inline original::printable::operator const char*() const {
245 return this->toCString(false);
246}
247
248inline auto original::printable::toCString(const bool enter) const -> const char*
249{
250 this->cache_string_ = this->toString(enter);
251 return this->cache_string_.c_str();
252}
253
254template<typename TYPE>
255auto original::printable::formatString(const TYPE& t) -> std::string
256{
257 std::stringstream ss;
258 ss << typeid(t).name() << "(" << formatString(&t) << ")";
259 return ss.str();
260}
261
262template<original::Printable TYPE>
263std::string original::printable::formatString(const TYPE& t)
264{
265 std::stringstream ss;
266 ss << t;
267 return ss.str();
268}
269
270template <original::EnumType TYPE>
271std::string original::printable::formatString(const TYPE& t)
272{
273 return formatEnum(t);
274}
275
276template <typename TYPE>
277auto original::printable::formatCString(const TYPE& t) -> const char*
278{
279 static auto result =
280 std::make_unique<std::string>(formatString<TYPE>(t));
281 return result->c_str();
282}
283
284template <typename TYPE>
285auto original::printable::formatEnum(const TYPE& t) -> std::string
286{
287 const std::string enum_name = typeid(t).name();
288 const int enum_value = static_cast<std::underlying_type_t<TYPE>>(t);
289 return enum_name + "(" + std::to_string(enum_value) + ")";
290}
291
292template<>
293inline auto original::printable::formatString<std::nullptr_t>(const std::nullptr_t&) -> std::string
294{
295 return "nullptr";
296}
297
298template<>
299inline auto original::printable::formatString<std::string>(const std::string& t) -> std::string
300{
301 return "\"" + t + "\"";
302}
303
304template<>
305inline auto original::printable::formatString<char>(const char& t) -> std::string
306{
307 return "'" + std::string(1, t) + "'";
308}
309
310template<>
311inline auto original::printable::formatString<bool>(const bool& t) -> std::string
312{
313 return t ? "true" : "false";
314}
315
316template <typename TYPE>
317auto original::printable::formatString(TYPE* const& ptr) -> std::string
318{
319 if (!ptr)
320 return "nullptr";
321
322 std::stringstream ss;
323 ss << "@" << ptr;
324 return ss.str();
325}
326
327template<>
328inline auto original::printable::formatString<const char>(const char* const &ptr) -> std::string {
329 return formatString<std::string>(ptr);
330}
331
332inline std::ostream& original::operator<<(std::ostream& os, const printable& p){
333 os << p.toString(false);
334 return os;
335}
336
337template<typename T>
339constexpr auto std::formatter<T>::parse(std::format_parse_context &ctx) {
340 return ctx.begin();
341}
342
343template<typename T>
345auto std::formatter<T>::format(const T &p, std::format_context &ctx) {
346 return formatter<std::string>().format(static_cast<std::string>(p), ctx);
347}
348
349#endif // PRINTABLE_H
Base class providing polymorphic string conversion capabilities.
Definition printable.h:39
const char * toCString(bool enter) const
Direct C-string access with formatting control.
Definition printable.h:248
static std::string formatString(const TYPE &t)
Universal value-to-string conversion.
Definition printable.h:263
static std::string formatString(TYPE *const &ptr)
Pointer-specific formatting.
friend std::ostream & operator<<(std::ostream &os, const printable &p)
Stream insertion operator for printable objects.
virtual std::string toString(bool enter) const
Generates formatted string representation.
Definition printable.h:232
virtual std::string className() const
Gets the class name for type identification.
Definition printable.h:227
static const char * formatCString(const TYPE &t)
C-string cache for temporary usage.
static std::string formatEnum(const TYPE &t)
Enum formatting utility.
static std::string formatString(const TYPE &t)
Specialization for printable types.
Checks derivation or type identity using std::derived_from.
Definition types.h:393
Main namespace for the project Original.
Definition algorithms.h:21
std::ostream & operator<<(std::ostream &os, const printable &p)
Stream insertion operator for printable objects.
Definition printable.h:332
Core type system foundations and concept definitions.