diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 12:57:26 -0700 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 12:57:26 -0700 |
commit | 1a78a62555be32868418fe52f8e330c9d0f95d5a (patch) | |
tree | d3765a80e7d3b9640ec2e930743630cd6b9fce2b /boost/units/detail/dimension_list.hpp | |
download | boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.gz boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.bz2 boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.zip |
Imported Upstream version 1.49.0upstream/1.49.0
Diffstat (limited to 'boost/units/detail/dimension_list.hpp')
-rw-r--r-- | boost/units/detail/dimension_list.hpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/boost/units/detail/dimension_list.hpp b/boost/units/detail/dimension_list.hpp new file mode 100644 index 0000000000..fc05547765 --- /dev/null +++ b/boost/units/detail/dimension_list.hpp @@ -0,0 +1,133 @@ +// 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_DIMENSION_LIST_HPP +#define BOOST_UNITS_DIMENSION_LIST_HPP + +#include <boost/mpl/next.hpp> +#include <boost/mpl/deref.hpp> +#include <boost/mpl/push_front_fwd.hpp> +#include <boost/mpl/pop_front_fwd.hpp> +#include <boost/mpl/size_fwd.hpp> +#include <boost/mpl/begin_end_fwd.hpp> +#include <boost/mpl/front_fwd.hpp> + +#include <boost/units/config.hpp> + +namespace boost { + +namespace units { + +struct dimensionless_type; + +namespace detail { + +struct dimension_list_tag { }; + +} // namespace detail + +template<class Item, class Next> +struct list +{ + typedef detail::dimension_list_tag tag; + typedef list type; + typedef Item item; + typedef Next next; + typedef typename mpl::next<typename Next::size>::type size; +}; + +} // namespace units + +namespace mpl { + +// INTERNAL ONLY +template<> +struct size_impl<units::detail::dimension_list_tag> +{ + template<class L> struct apply : public L::size { }; +}; + +// INTERNAL ONLY +template<> +struct begin_impl<units::detail::dimension_list_tag> +{ + template<class L> + struct apply + { + typedef L type; + }; +}; + +// INTERNAL ONLY +template<> +struct end_impl<units::detail::dimension_list_tag> +{ + template<class L> + struct apply + { + typedef units::dimensionless_type type; + }; +}; + +// INTERNAL ONLY +template<> +struct push_front_impl<units::detail::dimension_list_tag> +{ + template<class L, class T> + struct apply + { + typedef units::list<T, L> type; + }; +}; + +// INTERNAL ONLY +template<> +struct pop_front_impl<units::detail::dimension_list_tag> +{ + template<class L> + struct apply + { + typedef typename L::next type; + }; +}; + +// INTERNAL ONLY +template<> +struct front_impl<units::detail::dimension_list_tag> +{ + template<class L> + struct apply + { + typedef typename L::item type; + }; +}; + +// INTERNAL ONLY +template<class Item, class Next> +struct deref<units::list<Item, Next> > +{ + typedef Item type; +}; + +} // namespace mpl + +} // namespace boost + +#if BOOST_UNITS_HAS_BOOST_TYPEOF + +#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() + +BOOST_TYPEOF_REGISTER_TEMPLATE(boost::units::list, 2) + +#endif + +#include <boost/units/dimensionless_type.hpp> + +#endif // BOOST_UNITS_DIMENSION_LIST_HPP |