1// Boost.Units - A C++ library for zero-overhead dimensional analysis and
2// unit/quantity manipulation and conversion
3//
4// Copyright (C) 2003-2008 Matthias Christian Schabel
5// Copyright (C) 2008 Steven Watanabe
6//
7// Distributed under the Boost Software License, Version 1.0. (See
8// accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10
11#ifndef BOOST_UNITS_MAKE_SYSTEM_HPP
12#define BOOST_UNITS_MAKE_SYSTEM_HPP
13
14/// \file
15/// \brief Metafunction returning a homogeneous system that can
16/// represent any combination of the base units.
17/// \details
18/// Metafunction make_system returning a homogeneous system that can
19/// represent any combination of the base units. There must
20/// be no way to represent any of the base units in terms
21/// of the others. make_system<foot_base_unit, meter_base_unit>::type
22/// is not allowed, for example.
23
24#include <boost/units/config.hpp>
25#include <boost/units/dimensionless_type.hpp>
26#include <boost/units/homogeneous_system.hpp>
27#include <boost/units/detail/dimension_list.hpp>
28#include <boost/units/detail/sort.hpp>
29
30namespace boost {
31
32namespace units {
33
34#ifdef BOOST_UNITS_DOXYGEN
35
36namespace detail {
37
38struct unspecified {};
39
40}
41
42/// Metafunction returning a homogeneous system that can
43/// represent any combination of the base units. There must
44/// be no way to represent any of the base units in terms
45/// of the others. make_system<foot_base_unit, meter_base_unit>::type
46/// is not allowed, for example.
47template<class BaseUnit0, class BaseUnit1, class BaseUnit2, ..., class BaseUnitN>
48struct make_system
49{
50 typedef homogeneous_system<detail::unspecified> type;
51};
52
53#else
54
55struct na {};
56
57template<
58 class U0 = na,
59 class U1 = na,
60 class U2 = na,
61 class U3 = na,
62 class U4 = na,
63 class U5 = na,
64 class U6 = na,
65 class U7 = na,
66 class U8 = na,
67 class U9 = na
68>
69struct make_system;
70
71template<>
72struct make_system<>
73{
74 typedef homogeneous_system<dimensionless_type> type;
75};
76
77// Codewarrior 9.2 doesn't like using the defaults. Need
78// to specify na explicitly.
79template<class T0>
80struct make_system<T0, na, na, na, na, na, na, na, na, na>
81{
82 typedef homogeneous_system<list<T0, dimensionless_type> > type;
83};
84
85template<class T0, class T1>
86struct make_system<T0, T1, na, na, na, na, na, na, na, na>
87{
88 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, dimensionless_type> > >::type> type;
89};
90
91template<class T0, class T1, class T2>
92struct make_system<T0, T1, T2, na, na, na, na, na, na, na>
93{
94 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, dimensionless_type> > > >::type> type;
95};
96
97template<class T0, class T1, class T2, class T3>
98struct make_system<T0, T1, T2, T3, na, na, na, na, na, na>
99{
100 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, dimensionless_type> > > > >::type> type;
101};
102
103template<class T0, class T1, class T2, class T3, class T4>
104struct make_system<T0, T1, T2, T3, T4, na, na, na, na, na>
105{
106 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, dimensionless_type> > > > > >::type> type;
107};
108
109template<class T0, class T1, class T2, class T3, class T4, class T5>
110struct make_system<T0, T1, T2, T3, T4, T5, na, na, na, na>
111{
112 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, dimensionless_type> > > > > > >::type> type;
113};
114
115template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
116struct make_system<T0, T1, T2, T3, T4, T5, T6, na, na, na>
117{
118 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, dimensionless_type> > > > > > > >::type> type;
119};
120
121template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7>
122struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, na, na>
123{
124 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, list<T7, dimensionless_type> > > > > > > > >::type> type;
125};
126
127template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
128struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, T8, na>
129{
130 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, list<T7, list<T8, dimensionless_type> > > > > > > > > >::type> type;
131};
132
133template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
134struct make_system
135{
136 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, list<T7, list<T8, list<T9, dimensionless_type> > > > > > > > > > >::type> type;
137};
138
139#endif
140
141} // namespace units
142
143} // namespace boost
144
145#endif
146

source code of boost/boost/units/make_system.hpp