Chris@16
|
1 // Boost.Units - A C++ library for zero-overhead dimensional analysis and
|
Chris@16
|
2 // unit/quantity manipulation and conversion
|
Chris@16
|
3 //
|
Chris@16
|
4 // Copyright (C) 2003-2008 Matthias Christian Schabel
|
Chris@16
|
5 // Copyright (C) 2008 Steven Watanabe
|
Chris@16
|
6 //
|
Chris@16
|
7 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
8 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
9 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_UNITS_HOMOGENEOUS_SYSTEM_HPP_INCLUDED
|
Chris@16
|
12 #define BOOST_UNITS_HOMOGENEOUS_SYSTEM_HPP_INCLUDED
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/mpl/bool.hpp>
|
Chris@16
|
15
|
Chris@16
|
16 #include <boost/units/config.hpp>
|
Chris@16
|
17 #include <boost/units/static_rational.hpp>
|
Chris@16
|
18
|
Chris@16
|
19 #ifdef BOOST_UNITS_CHECK_HOMOGENEOUS_UNITS
|
Chris@16
|
20
|
Chris@16
|
21 #include <boost/type_traits/is_same.hpp>
|
Chris@16
|
22 #include <boost/mpl/not.hpp>
|
Chris@16
|
23
|
Chris@16
|
24 #include <boost/units/detail/linear_algebra.hpp>
|
Chris@16
|
25
|
Chris@16
|
26 #endif
|
Chris@16
|
27
|
Chris@16
|
28 namespace boost {
|
Chris@16
|
29
|
Chris@16
|
30 namespace units {
|
Chris@16
|
31
|
Chris@16
|
32 /// A system that can uniquely represent any unit
|
Chris@16
|
33 /// which can be composed from a linearly independent set
|
Chris@16
|
34 /// of base units. It is safe to rebind a unit with
|
Chris@16
|
35 /// such a system to different dimensions.
|
Chris@16
|
36 ///
|
Chris@16
|
37 /// Do not construct this template directly. Use
|
Chris@16
|
38 /// make_system instead.
|
Chris@16
|
39 template<class L>
|
Chris@16
|
40 struct homogeneous_system {
|
Chris@16
|
41 /// INTERNAL ONLY
|
Chris@16
|
42 typedef L type;
|
Chris@16
|
43 };
|
Chris@16
|
44
|
Chris@16
|
45 template<class T, class E>
|
Chris@16
|
46 struct static_power;
|
Chris@16
|
47
|
Chris@16
|
48 template<class T, class R>
|
Chris@16
|
49 struct static_root;
|
Chris@16
|
50
|
Chris@16
|
51 /// INTERNAL ONLY
|
Chris@16
|
52 template<class L, long N, long D>
|
Chris@16
|
53 struct static_power<homogeneous_system<L>, static_rational<N,D> >
|
Chris@16
|
54 {
|
Chris@16
|
55 typedef homogeneous_system<L> type;
|
Chris@16
|
56 };
|
Chris@16
|
57
|
Chris@16
|
58 /// INTERNAL ONLY
|
Chris@16
|
59 template<class L, long N, long D>
|
Chris@16
|
60 struct static_root<homogeneous_system<L>, static_rational<N,D> >
|
Chris@16
|
61 {
|
Chris@16
|
62 typedef homogeneous_system<L> type;
|
Chris@16
|
63 };
|
Chris@16
|
64
|
Chris@16
|
65 namespace detail {
|
Chris@16
|
66
|
Chris@16
|
67 template<class System, class Dimensions>
|
Chris@16
|
68 struct check_system;
|
Chris@16
|
69
|
Chris@16
|
70 #ifdef BOOST_UNITS_CHECK_HOMOGENEOUS_UNITS
|
Chris@16
|
71
|
Chris@16
|
72 template<class L, class Dimensions>
|
Chris@16
|
73 struct check_system<homogeneous_system<L>, Dimensions> :
|
Chris@16
|
74 boost::mpl::not_<
|
Chris@16
|
75 boost::is_same<
|
Chris@16
|
76 typename calculate_base_unit_exponents<
|
Chris@16
|
77 L,
|
Chris@16
|
78 Dimensions
|
Chris@16
|
79 >::type,
|
Chris@16
|
80 inconsistent
|
Chris@16
|
81 >
|
Chris@16
|
82 > {};
|
Chris@16
|
83
|
Chris@16
|
84 #else
|
Chris@16
|
85
|
Chris@16
|
86 template<class L, class Dimensions>
|
Chris@16
|
87 struct check_system<homogeneous_system<L>, Dimensions> : mpl::true_ {};
|
Chris@16
|
88
|
Chris@16
|
89 #endif
|
Chris@16
|
90
|
Chris@16
|
91 } // namespace detail
|
Chris@16
|
92
|
Chris@16
|
93 } // namespace units
|
Chris@16
|
94
|
Chris@16
|
95 } // namespace boost
|
Chris@16
|
96
|
Chris@16
|
97 #if BOOST_UNITS_HAS_BOOST_TYPEOF
|
Chris@16
|
98
|
Chris@16
|
99 #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
|
Chris@16
|
100
|
Chris@16
|
101 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::units::homogeneous_system, (class))
|
Chris@16
|
102
|
Chris@16
|
103 #endif
|
Chris@16
|
104
|
Chris@16
|
105 #endif
|