summaryrefslogtreecommitdiff
path: root/c++/unit.tmpl.hpp
blob: 5eec43d94f234b08b3c6ffdafd074591469ce0d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <utility>

namespace kel {

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;
}
}