123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- // 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_DETAIL_PUSH_FRONT_OR_ADD_HPP
- #define BOOST_UNITS_DETAIL_PUSH_FRONT_OR_ADD_HPP
- #include <boost/mpl/plus.hpp>
- #include <boost/mpl/front.hpp>
- #include <boost/mpl/push_front.hpp>
- #include <boost/mpl/pop_front.hpp>
- #include <boost/type_traits/is_same.hpp>
- #include <boost/units/units_fwd.hpp>
- #include <boost/units/detail/push_front_if.hpp>
- namespace boost {
- namespace units {
- template<class Item, class Next>
- struct list;
- namespace detail {
- template<class T>
- struct is_empty_dim;
- /// add an instantiation of dim to Sequence.
- template<bool>
- struct push_front_or_add_impl;
- template<>
- struct push_front_or_add_impl<true>
- {
- template<typename Sequence, typename T>
- struct apply
- {
- typedef typename mpl::plus<T, typename Sequence::item>::type item;
- typedef typename push_front_if<!is_empty_dim<item>::value>::template apply<
- typename Sequence::next,
- item
- > type;
- };
- };
- template<>
- struct push_front_or_add_impl<false>
- {
- template<typename Sequence, typename T>
- struct apply
- {
- typedef list<T, Sequence> type;
- };
- };
- template<typename Sequence, typename T>
- struct push_front_or_add
- {
- typedef typename push_front_or_add_impl<boost::is_same<typename T::tag_type, typename Sequence::item::tag_type>::value>::template apply<
- Sequence,
- T
- >::type type;
- };
- template<typename T>
- struct push_front_or_add<dimensionless_type, T>
- {
- typedef list<T, dimensionless_type> type;
- };
- } // namespace detail
- } // namespace units
- } // namespace boost
- #endif
|