1// Boost.Units - A C++ library for zero-overhead dimensional analysis and
2// unit/quantity manipulation and conversion
3//
4// Copyright (C) 2003-2008 Matthias Christian Schabel
5// Copyright (C) 2008 Steven Watanabe
6//
7// Distributed under the Boost Software License, Version 1.0. (See
8// accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10
11#ifndef BOOST_UNITS_SCALED_BASE_UNIT_HPP_INCLUDED
12#define BOOST_UNITS_SCALED_BASE_UNIT_HPP_INCLUDED
13
14#include <string>
15
16#include <boost/mpl/bool.hpp>
17#include <boost/mpl/less.hpp>
18#include <boost/type_traits/is_same.hpp>
19
20#include <boost/units/config.hpp>
21#include <boost/units/dimension.hpp>
22#include <boost/units/static_rational.hpp>
23#include <boost/units/units_fwd.hpp>
24
25namespace boost {
26
27namespace units {
28
29template<class T>
30struct heterogeneous_system;
31
32template<class T, class D, class Scale>
33struct heterogeneous_system_impl;
34
35template<class T, class E>
36struct heterogeneous_system_dim;
37
38template<class T>
39struct base_unit_info;
40
41/// INTERNAL ONLY
42struct scaled_base_unit_tag {};
43
44template<class S, class Scale>
45struct scaled_base_unit
46{
47 /// INTERNAL ONLY
48 typedef void boost_units_is_base_unit_type;
49 typedef scaled_base_unit type;
50 typedef scaled_base_unit_tag tag;
51 typedef S system_type;
52 typedef Scale scale_type;
53 typedef typename S::dimension_type dimension_type;
54
55#ifdef BOOST_UNITS_DOXYGEN
56
57 typedef detail::unspecified unit_type;
58
59#else
60
61 typedef unit<
62 dimension_type,
63 heterogeneous_system<
64 heterogeneous_system_impl<
65 list<
66 heterogeneous_system_dim<scaled_base_unit,static_rational<1> >,
67 dimensionless_type
68 >,
69 dimension_type,
70 dimensionless_type
71 >
72 >
73 > unit_type;
74
75#endif
76
77 static std::string symbol()
78 {
79 return(Scale::symbol() + base_unit_info<S>::symbol());
80 }
81 static std::string name()
82 {
83 return(Scale::name() + base_unit_info<S>::name());
84 }
85};
86
87} // namespace units
88
89} // namespace boost
90
91#if BOOST_UNITS_HAS_BOOST_TYPEOF
92
93#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
94
95BOOST_TYPEOF_REGISTER_TEMPLATE(boost::units::scaled_base_unit, (class)(class))
96
97#endif
98
99namespace boost {
100
101#ifndef BOOST_UNITS_DOXYGEN
102
103namespace mpl {
104
105/// INTERNAL ONLY
106template<class Tag>
107struct less_impl<boost::units::scaled_base_unit_tag, Tag>
108{
109 template<class T0, class T1>
110 struct apply : mpl::bool_<
111 mpl::less<typename T0::system_type, T1>::value ||
112 (boost::is_same<typename T0::system_type, T1>::value && ((T0::scale_type::exponent::Numerator) < 0)) > {};
113};
114
115/// INTERNAL ONLY
116template<class Tag>
117struct less_impl<Tag, boost::units::scaled_base_unit_tag>
118{
119 template<class T0, class T1>
120 struct apply : mpl::bool_<
121 mpl::less<T0, typename T1::system_type>::value ||
122 (boost::is_same<T0, typename T1::system_type>::value && ((T1::scale_type::exponent::Numerator) > 0)) > {};
123};
124
125/// INTERNAL ONLY
126template<>
127struct less_impl<boost::units::scaled_base_unit_tag, boost::units::scaled_base_unit_tag>
128{
129 template<class T0, class T1>
130 struct apply : mpl::bool_<
131 mpl::less<typename T0::system_type, typename T1::system_type>::value ||
132 ((boost::is_same<typename T0::system_type, typename T1::system_type>::value) &&
133 ((T0::scale_type::base) < (T1::scale_type::base) ||
134 ((T0::scale_type::base) == (T1::scale_type::base) &&
135 mpl::less<typename T0::scale_type::exponent, typename T1::scale_type::exponent>::value))) > {};
136};
137
138} // namespace mpl
139
140#endif
141
142} // namespace boost
143
144#endif
145

source code of boost/boost/units/scaled_base_unit.hpp