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) 2007-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_DETAIL_DIMENSIONLESS_UNIT_HPP
|
Chris@16
|
12 #define BOOST_UNITS_DETAIL_DIMENSIONLESS_UNIT_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/mpl/bool.hpp>
|
Chris@16
|
15 #include <boost/units/units_fwd.hpp>
|
Chris@16
|
16
|
Chris@16
|
17 namespace boost {
|
Chris@16
|
18 namespace units {
|
Chris@16
|
19
|
Chris@16
|
20 template<class T>
|
Chris@16
|
21 struct heterogeneous_system;
|
Chris@16
|
22
|
Chris@16
|
23 template<class T>
|
Chris@16
|
24 struct homogeneous_system;
|
Chris@16
|
25
|
Chris@16
|
26 template<class T1, class T2, class Scale>
|
Chris@16
|
27 struct heterogeneous_system_impl;
|
Chris@16
|
28
|
Chris@16
|
29 typedef boost::units::heterogeneous_system<
|
Chris@16
|
30 boost::units::heterogeneous_system_impl<
|
Chris@16
|
31 boost::units::dimensionless_type,
|
Chris@16
|
32 boost::units::dimensionless_type,
|
Chris@16
|
33 boost::units::dimensionless_type
|
Chris@16
|
34 >
|
Chris@16
|
35 > heterogeneous_dimensionless_system;
|
Chris@16
|
36
|
Chris@16
|
37 namespace detail {
|
Chris@16
|
38
|
Chris@16
|
39 template<class System>
|
Chris@16
|
40 struct void_if_dimensionless {
|
Chris@16
|
41 typedef int type;
|
Chris@16
|
42 };
|
Chris@16
|
43
|
Chris@16
|
44 template<class T>
|
Chris@16
|
45 struct void_if_dimensionless<boost::units::homogeneous_system<T> > {
|
Chris@16
|
46 typedef void type;
|
Chris@16
|
47 };
|
Chris@16
|
48
|
Chris@16
|
49 template<>
|
Chris@16
|
50 struct void_if_dimensionless<heterogeneous_dimensionless_system> {
|
Chris@16
|
51 typedef void type;
|
Chris@16
|
52 };
|
Chris@16
|
53
|
Chris@16
|
54 template<class System, class Test = void>
|
Chris@16
|
55 struct void_if_heterogeneous {
|
Chris@16
|
56 typedef void type;
|
Chris@16
|
57 };
|
Chris@16
|
58
|
Chris@16
|
59 template<class System>
|
Chris@16
|
60 struct void_if_heterogeneous<System, typename void_if_dimensionless<System>::type> {
|
Chris@16
|
61 typedef int type;
|
Chris@16
|
62 };
|
Chris@16
|
63
|
Chris@16
|
64 template<class System, class Enable=void>
|
Chris@16
|
65 struct is_dimensionless_system : mpl::false_ {};
|
Chris@16
|
66
|
Chris@16
|
67 template<class System>
|
Chris@16
|
68 struct is_dimensionless_system<System, typename void_if_dimensionless<System>::type> : mpl::true_ {};
|
Chris@16
|
69
|
Chris@16
|
70 #define BOOST_UNITS_DIMENSIONLESS_UNIT(T)\
|
Chris@16
|
71 boost::units::unit<\
|
Chris@16
|
72 boost::units::dimensionless_type,\
|
Chris@16
|
73 T,\
|
Chris@16
|
74 typename ::boost::units::detail::void_if_dimensionless<T>::type\
|
Chris@16
|
75 >
|
Chris@16
|
76
|
Chris@16
|
77 #define BOOST_UNITS_HETEROGENEOUS_DIMENSIONLESS_UNIT(T)\
|
Chris@16
|
78 boost::units::unit<\
|
Chris@16
|
79 boost::units::dimensionless_type,\
|
Chris@16
|
80 T,\
|
Chris@16
|
81 typename ::boost::units::detail::void_if_heterogeneous<T>::type\
|
Chris@16
|
82 >
|
Chris@16
|
83
|
Chris@16
|
84 }
|
Chris@16
|
85 }
|
Chris@16
|
86 }
|
Chris@16
|
87
|
Chris@16
|
88 #endif
|