summaryrefslogtreecommitdiff
path: root/c++/unit.hpp
blob: a8e8320c3dc7c3c5c4a948b6d0f2f8be43959c7e (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
#pragma once

#include "unit_reduction.h"

namespace kel {
template<typename UnitType, int64_t Exponent>
struct unit_component {};

template<typename StorageT, typename... T>
class unit;

template<typename StorageT, typename... UnitTypes, int64_t... Exponents>
class unit<StorageT, unit_component<UnitTypes, Exponents>...> {
public:
	using value_type = StorageT;

	unit() = default;

	unit(const unit<StorageT,unit_component<UnitTypes, Exponents>...>&) = default;
	unit(unit<StorageT,unit_component<UnitTypes,Exponents>...>&&) = default;

	unit<StorageT,unit_component<UnitTypes,Exponents>...>& operator=(const unit<StorageT,unit_component<UnitTypes,Exponents>...>&) = default;
	unit<StorageT,unit_component<UnitTypes,Exponents>...>& operator=(unit<StorageT,unit_component<UnitTypes,Exponents>...>&&) = default;

	unit(const value_type&);
	unit(value_type&&);

	unit<StorageT,unit_component<UnitTypes,Exponents>...>& operator=(const value_type&);
	unit<StorageT,unit_component<UnitTypes,Exponents>...>& operator=(value_type&&);

	unit<StorageT,unit_component<UnitTypes,Exponents>...> operator+(const unit<StorageT,unit_component<UnitTypes,Exponents>...>& rhs);
	unit<StorageT,unit_component<UnitTypes,Exponents>...> operator-(const unit<StorageT,unit_component<UnitTypes,Exponents>...>& rhs);

	template<typename... Trhs>
	typename unit_multiplication<unit<StorageT,unit_component<UnitTypes,Exponents>...>, unit<StorageT,Trhs...>>::type operator*(const unit<StorageT, Trhs...>& rhs);
	
	template<typename... Trhs>
	typename unit_multiplication<unit<StorageT, unit_component<UnitTypes,Exponents>...>, typename unit_invert<StorageT,Trhs...>::type>::type operator/(const unit<StorageT, Trhs...>& rhs);

	value_type data() const;
private:
	value_type value;
};

template<typename S>
using scalar = unit<S>;
}

#include "unit.tmpl.h"