summaryrefslogtreecommitdiff
path: root/boost/units/homogeneous_system.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/units/homogeneous_system.hpp')
-rw-r--r--boost/units/homogeneous_system.hpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/boost/units/homogeneous_system.hpp b/boost/units/homogeneous_system.hpp
new file mode 100644
index 0000000..aa3b056
--- /dev/null
+++ b/boost/units/homogeneous_system.hpp
@@ -0,0 +1,105 @@
+// 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_HOMOGENEOUS_SYSTEM_HPP_INCLUDED
+#define BOOST_UNITS_HOMOGENEOUS_SYSTEM_HPP_INCLUDED
+
+#include <boost/mpl/bool.hpp>
+
+#include <boost/units/config.hpp>
+#include <boost/units/static_rational.hpp>
+
+#ifdef BOOST_UNITS_CHECK_HOMOGENEOUS_UNITS
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/not.hpp>
+
+#include <boost/units/detail/linear_algebra.hpp>
+
+#endif
+
+namespace boost {
+
+namespace units {
+
+/// A system that can uniquely represent any unit
+/// which can be composed from a linearly independent set
+/// of base units. It is safe to rebind a unit with
+/// such a system to different dimensions.
+///
+/// Do not construct this template directly. Use
+/// make_system instead.
+template<class L>
+struct homogeneous_system {
+ /// INTERNAL ONLY
+ typedef L type;
+};
+
+template<class T, class E>
+struct static_power;
+
+template<class T, class R>
+struct static_root;
+
+/// INTERNAL ONLY
+template<class L, long N, long D>
+struct static_power<homogeneous_system<L>, static_rational<N,D> >
+{
+ typedef homogeneous_system<L> type;
+};
+
+/// INTERNAL ONLY
+template<class L, long N, long D>
+struct static_root<homogeneous_system<L>, static_rational<N,D> >
+{
+ typedef homogeneous_system<L> type;
+};
+
+namespace detail {
+
+template<class System, class Dimensions>
+struct check_system;
+
+#ifdef BOOST_UNITS_CHECK_HOMOGENEOUS_UNITS
+
+template<class L, class Dimensions>
+struct check_system<homogeneous_system<L>, Dimensions> :
+ boost::mpl::not_<
+ boost::is_same<
+ typename calculate_base_unit_exponents<
+ L,
+ Dimensions
+ >::type,
+ inconsistent
+ >
+ > {};
+
+#else
+
+template<class L, class Dimensions>
+struct check_system<homogeneous_system<L>, Dimensions> : mpl::true_ {};
+
+#endif
+
+} // namespace detail
+
+} // namespace units
+
+} // namespace boost
+
+#if BOOST_UNITS_HAS_BOOST_TYPEOF
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::units::homogeneous_system, (class))
+
+#endif
+
+#endif