123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- // 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
|