summaryrefslogtreecommitdiff
path: root/c++/unit.tmpl.h
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2023-08-25 10:10:51 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2023-08-25 10:10:51 +0200
commit488653602d0636a1fa5ef6e64cabb9b903dce42a (patch)
treeb5d4bbffdf21017777f4c4d994b7b41a02e8fa5d /c++/unit.tmpl.h
parente3c73b2c8b33b43d53de6d2106b93a4343609e80 (diff)
Renamed src folder to c++
Diffstat (limited to 'c++/unit.tmpl.h')
-rw-r--r--c++/unit.tmpl.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/c++/unit.tmpl.h b/c++/unit.tmpl.h
new file mode 100644
index 0000000..d89e0c1
--- /dev/null
+++ b/c++/unit.tmpl.h
@@ -0,0 +1,53 @@
+#include <utility>
+
+namespace kelun {
+
+template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
+unit<StorageT,unit_component<UnitTypes, Exponents>...>::unit(const value_type& value_):
+ value{value_}{}
+
+template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
+unit<StorageT,unit_component<UnitTypes, Exponents>...>::unit(value_type&& value_):value{std::move(value_)}{}
+
+template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
+unit<StorageT,unit_component<UnitTypes, Exponents>...>& unit<StorageT,unit_component<UnitTypes, Exponents>...>::operator=(const typename unit<StorageT,unit_component<UnitTypes, Exponents>...>::value_type& value_){
+ value = value_;
+ return *this;
+}
+
+template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
+unit<StorageT,unit_component<UnitTypes, Exponents>...>& unit<StorageT,unit_component<UnitTypes, Exponents>...>::operator=(typename unit<StorageT,unit_component<UnitTypes, Exponents>...>::value_type&& value_){
+ value = std::move(value_);
+ return *this;
+}
+
+template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
+unit<StorageT,unit_component<UnitTypes, Exponents>...> unit<StorageT,unit_component<UnitTypes, Exponents>...>::operator+(const unit<StorageT,unit_component<UnitTypes, Exponents>...>& rhs){
+ return value + rhs.value;
+}
+
+template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
+unit<StorageT,unit_component<UnitTypes, Exponents>...> unit<StorageT,unit_component<UnitTypes, Exponents>...>::operator-(const unit<StorageT,unit_component<UnitTypes, Exponents>...>& rhs){
+ return value - rhs.value;
+}
+
+template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
+template<typename... Trhs>
+typename unit_multiplication<unit<StorageT,unit_component<UnitTypes,Exponents>...>, unit<StorageT, Trhs...>>::type
+unit<StorageT,unit_component<UnitTypes, Exponents>...>::operator*(const unit<StorageT,Trhs...>& rhs){
+ return value * rhs.data();
+}
+
+template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
+template<typename... Trhs>
+typename unit_multiplication<unit<StorageT,unit_component<UnitTypes,Exponents>...>, typename unit_invert<StorageT,Trhs...>::type>::type
+unit<StorageT,unit_component<UnitTypes,Exponents>...>::operator/(const unit<StorageT, Trhs...>& rhs){
+ typename unit_invert<StorageT, Trhs...>::type rhs_inverted{static_cast<StorageT>(1)/rhs.data()};
+ return value * rhs_inverted.data();
+}
+
+template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
+typename unit<StorageT,unit_component<UnitTypes, Exponents>...>::value_type unit<StorageT,unit_component<UnitTypes, Exponents>...>::data() const {
+ return value;
+}
+}