diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-07-29 14:18:30 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-07-29 14:18:30 +0200 |
commit | 700cde2d499742160deb361f42b7e861ae1db8ed (patch) | |
tree | ba796243a94578f9c2105080fa19040a341c4482 /c++/unit_print.hpp | |
parent | fb7dd1c9185da30aed8645c084be0722e061a867 (diff) |
Renaming to new standard
Diffstat (limited to 'c++/unit_print.hpp')
-rw-r--r-- | c++/unit_print.hpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/c++/unit_print.hpp b/c++/unit_print.hpp new file mode 100644 index 0000000..4d9187b --- /dev/null +++ b/c++/unit_print.hpp @@ -0,0 +1,55 @@ +#include "./unit.h" + +#include <iostream> + + +namespace std { +template<typename UnitT, int64_t UnitE> +inline ostream& operator<<(ostream& o, const kel::unit_base<UnitT,UnitE>& ele){ + o<<UnitT::short_name; + if constexpr ( UnitE != 1 ){ + o<<'^'<<'('<<UnitE<<')'; + } + return o; +} +} + +namespace kel { +template<typename... T> +struct unit_print_impl { + static_assert(is_always_false<T...>, "Template type not supported"); +}; + +template<typename UnitT, int64_t UnitE, typename... UnitTL, int64_t... UnitEL> +struct unit_print_impl<unit_base<UnitT,UnitE>,unit_base<UnitTL,UnitEL>...> { + static std::ostream& print(std::ostream& o){ + + unit_base<UnitT,UnitE> element; + + std::ostream& o_ret = o << element; + + if constexpr (sizeof...(UnitTL) > 0){ + std::ostream& o_ret_next = o_ret << ' ' << '*' << ' '; + return unit_print_impl<unit_base<UnitTL,UnitEL>...>::print(o_ret_next); + } + + return o_ret<<']'; + } +}; +} + +namespace std { + +template<typename StorageT, typename... T> +inline ostream& operator<<(ostream& o, const kel::unit<StorageT,T...>& unit); + +template<typename StorageT, typename... UnitT, int64_t... UnitE> +inline ostream& operator<<(ostream& o, const kel::unit<StorageT,kel::unit_base<UnitT,UnitE>...>& unit){ + o << unit.data(); + if constexpr (sizeof...(UnitT) > 0) { + auto& o_ret = o << ' '<<'['; + return kel::unit_print_impl<kel::unit_base<UnitT,UnitE>...>::print(o_ret); + } + return o; +} +} |