You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
133 lines
2.6 KiB
133 lines
2.6 KiB
// 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
|
|
|