Chris@16
|
1 // Boost.Units - A C++ library for zero-overhead dimensional analysis and
|
Chris@16
|
2 // unit/quantity manipulation and conversion
|
Chris@16
|
3 //
|
Chris@16
|
4 // Copyright (C) 2003-2008 Matthias Christian Schabel
|
Chris@16
|
5 // Copyright (C) 2008 Steven Watanabe
|
Chris@16
|
6 //
|
Chris@16
|
7 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
8 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
9 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_UNITS_DIMENSION_LIST_HPP
|
Chris@16
|
12 #define BOOST_UNITS_DIMENSION_LIST_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/mpl/next.hpp>
|
Chris@16
|
15 #include <boost/mpl/deref.hpp>
|
Chris@16
|
16 #include <boost/mpl/push_front_fwd.hpp>
|
Chris@16
|
17 #include <boost/mpl/pop_front_fwd.hpp>
|
Chris@16
|
18 #include <boost/mpl/size_fwd.hpp>
|
Chris@16
|
19 #include <boost/mpl/begin_end_fwd.hpp>
|
Chris@16
|
20 #include <boost/mpl/front_fwd.hpp>
|
Chris@16
|
21
|
Chris@16
|
22 #include <boost/units/config.hpp>
|
Chris@16
|
23
|
Chris@16
|
24 namespace boost {
|
Chris@16
|
25
|
Chris@16
|
26 namespace units {
|
Chris@16
|
27
|
Chris@16
|
28 struct dimensionless_type;
|
Chris@16
|
29
|
Chris@16
|
30 namespace detail {
|
Chris@16
|
31
|
Chris@16
|
32 struct dimension_list_tag { };
|
Chris@16
|
33
|
Chris@16
|
34 } // namespace detail
|
Chris@16
|
35
|
Chris@16
|
36 template<class Item, class Next>
|
Chris@16
|
37 struct list
|
Chris@16
|
38 {
|
Chris@16
|
39 typedef detail::dimension_list_tag tag;
|
Chris@16
|
40 typedef list type;
|
Chris@16
|
41 typedef Item item;
|
Chris@16
|
42 typedef Next next;
|
Chris@16
|
43 typedef typename mpl::next<typename Next::size>::type size;
|
Chris@16
|
44 };
|
Chris@16
|
45
|
Chris@16
|
46 } // namespace units
|
Chris@16
|
47
|
Chris@16
|
48 namespace mpl {
|
Chris@16
|
49
|
Chris@16
|
50 // INTERNAL ONLY
|
Chris@16
|
51 template<>
|
Chris@16
|
52 struct size_impl<units::detail::dimension_list_tag>
|
Chris@16
|
53 {
|
Chris@16
|
54 template<class L> struct apply : public L::size { };
|
Chris@16
|
55 };
|
Chris@16
|
56
|
Chris@16
|
57 // INTERNAL ONLY
|
Chris@16
|
58 template<>
|
Chris@16
|
59 struct begin_impl<units::detail::dimension_list_tag>
|
Chris@16
|
60 {
|
Chris@16
|
61 template<class L>
|
Chris@16
|
62 struct apply
|
Chris@16
|
63 {
|
Chris@16
|
64 typedef L type;
|
Chris@16
|
65 };
|
Chris@16
|
66 };
|
Chris@16
|
67
|
Chris@16
|
68 // INTERNAL ONLY
|
Chris@16
|
69 template<>
|
Chris@16
|
70 struct end_impl<units::detail::dimension_list_tag>
|
Chris@16
|
71 {
|
Chris@16
|
72 template<class L>
|
Chris@16
|
73 struct apply
|
Chris@16
|
74 {
|
Chris@16
|
75 typedef units::dimensionless_type type;
|
Chris@16
|
76 };
|
Chris@16
|
77 };
|
Chris@16
|
78
|
Chris@16
|
79 // INTERNAL ONLY
|
Chris@16
|
80 template<>
|
Chris@16
|
81 struct push_front_impl<units::detail::dimension_list_tag>
|
Chris@16
|
82 {
|
Chris@16
|
83 template<class L, class T>
|
Chris@16
|
84 struct apply
|
Chris@16
|
85 {
|
Chris@16
|
86 typedef units::list<T, L> type;
|
Chris@16
|
87 };
|
Chris@16
|
88 };
|
Chris@16
|
89
|
Chris@16
|
90 // INTERNAL ONLY
|
Chris@16
|
91 template<>
|
Chris@16
|
92 struct pop_front_impl<units::detail::dimension_list_tag>
|
Chris@16
|
93 {
|
Chris@16
|
94 template<class L>
|
Chris@16
|
95 struct apply
|
Chris@16
|
96 {
|
Chris@16
|
97 typedef typename L::next type;
|
Chris@16
|
98 };
|
Chris@16
|
99 };
|
Chris@16
|
100
|
Chris@16
|
101 // INTERNAL ONLY
|
Chris@16
|
102 template<>
|
Chris@16
|
103 struct front_impl<units::detail::dimension_list_tag>
|
Chris@16
|
104 {
|
Chris@16
|
105 template<class L>
|
Chris@16
|
106 struct apply
|
Chris@16
|
107 {
|
Chris@16
|
108 typedef typename L::item type;
|
Chris@16
|
109 };
|
Chris@16
|
110 };
|
Chris@16
|
111
|
Chris@16
|
112 // INTERNAL ONLY
|
Chris@16
|
113 template<class Item, class Next>
|
Chris@16
|
114 struct deref<units::list<Item, Next> >
|
Chris@16
|
115 {
|
Chris@16
|
116 typedef Item type;
|
Chris@16
|
117 };
|
Chris@16
|
118
|
Chris@16
|
119 } // namespace mpl
|
Chris@16
|
120
|
Chris@16
|
121 } // namespace boost
|
Chris@16
|
122
|
Chris@16
|
123 #if BOOST_UNITS_HAS_BOOST_TYPEOF
|
Chris@16
|
124
|
Chris@16
|
125 #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
|
Chris@16
|
126
|
Chris@16
|
127 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::units::list, 2)
|
Chris@16
|
128
|
Chris@16
|
129 #endif
|
Chris@16
|
130
|
Chris@16
|
131 #include <boost/units/dimensionless_type.hpp>
|
Chris@16
|
132
|
Chris@16
|
133 #endif // BOOST_UNITS_DIMENSION_LIST_HPP
|