summaryrefslogtreecommitdiff
path: root/boost/units/make_system.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/units/make_system.hpp')
-rw-r--r--boost/units/make_system.hpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/boost/units/make_system.hpp b/boost/units/make_system.hpp
new file mode 100644
index 0000000..1918268
--- /dev/null
+++ b/boost/units/make_system.hpp
@@ -0,0 +1,145 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2003-2008 Matthias Christian Schabel
+// Copyright (C) 2008 Steven Watanabe
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_MAKE_SYSTEM_HPP
+#define BOOST_UNITS_MAKE_SYSTEM_HPP
+
+/// \file
+/// \brief Metafunction returning a homogeneous system that can
+/// represent any combination of the base units.
+/// \details
+/// Metafunction make_system returning a homogeneous system that can
+/// represent any combination of the base units. There must
+/// be no way to represent any of the base units in terms
+/// of the others. make_system<foot_base_unit, meter_base_unit>::type
+/// is not allowed, for example.
+
+#include <boost/units/config.hpp>
+#include <boost/units/dimensionless_type.hpp>
+#include <boost/units/homogeneous_system.hpp>
+#include <boost/units/detail/dimension_list.hpp>
+#include <boost/units/detail/sort.hpp>
+
+namespace boost {
+
+namespace units {
+
+#ifdef BOOST_UNITS_DOXYGEN
+
+namespace detail {
+
+struct unspecified {};
+
+}
+
+/// Metafunction returning a homogeneous system that can
+/// represent any combination of the base units. There must
+/// be no way to represent any of the base units in terms
+/// of the others. make_system<foot_base_unit, meter_base_unit>::type
+/// is not allowed, for example.
+template<class BaseUnit0, class BaseUnit1, class BaseUnit2, ..., class BaseUnitN>
+struct make_system
+{
+ typedef homogeneous_system<detail::unspecified> type;
+};
+
+#else
+
+struct na {};
+
+template<
+ class U0 = na,
+ class U1 = na,
+ class U2 = na,
+ class U3 = na,
+ class U4 = na,
+ class U5 = na,
+ class U6 = na,
+ class U7 = na,
+ class U8 = na,
+ class U9 = na
+>
+struct make_system;
+
+template<>
+struct make_system<>
+{
+ typedef homogeneous_system<dimensionless_type> type;
+};
+
+// Codewarrior 9.2 doesn't like using the defaults. Need
+// to specify na explicitly.
+template<class T0>
+struct make_system<T0, na, na, na, na, na, na, na, na, na>
+{
+ typedef homogeneous_system<list<T0, dimensionless_type> > type;
+};
+
+template<class T0, class T1>
+struct make_system<T0, T1, na, na, na, na, na, na, na, na>
+{
+ typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, dimensionless_type> > >::type> type;
+};
+
+template<class T0, class T1, class T2>
+struct make_system<T0, T1, T2, na, na, na, na, na, na, na>
+{
+ typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, dimensionless_type> > > >::type> type;
+};
+
+template<class T0, class T1, class T2, class T3>
+struct make_system<T0, T1, T2, T3, na, na, na, na, na, na>
+{
+ typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, dimensionless_type> > > > >::type> type;
+};
+
+template<class T0, class T1, class T2, class T3, class T4>
+struct make_system<T0, T1, T2, T3, T4, na, na, na, na, na>
+{
+ typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, dimensionless_type> > > > > >::type> type;
+};
+
+template<class T0, class T1, class T2, class T3, class T4, class T5>
+struct make_system<T0, T1, T2, T3, T4, T5, na, na, na, na>
+{
+ typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, dimensionless_type> > > > > > >::type> type;
+};
+
+template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
+struct make_system<T0, T1, T2, T3, T4, T5, T6, na, na, na>
+{
+ 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;
+};
+
+template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7>
+struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, na, na>
+{
+ 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;
+};
+
+template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
+struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, T8, na>
+{
+ 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;
+};
+
+template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
+struct make_system
+{
+ 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;
+};
+
+#endif
+
+} // namespace units
+
+} // namespace boost
+
+#endif