]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/units/example/radar_beam_height.cpp
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / boost / libs / units / example / radar_beam_height.cpp
CommitLineData
7c673cae
FG
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/**
12\file
13
14\brief radar_beam_height.cpp
15
16\details
17Demonstrate library usage for user test cases suggested by Michael Fawcett.
18
19Output:
20@verbatim
21
22//[radar_beam_height_output
23radar range : 300 nmi
24earth radius : 6.37101e+06 m
25beam height 1 : 18169.7 m
26beam height 2 : 9.81085 nmi
27beam height 3 : 18169.7 m
28beam height 4 : 9.81085 nmi
29beam height approx : 59488.4 ft
30beam height approx : 18132.1 m
31//]
32
33@endverbatim
34**/
35
36#include <iostream>
37
38#include <boost/units/conversion.hpp>
39#include <boost/units/io.hpp>
40#include <boost/units/pow.hpp>
41#include <boost/units/systems/si.hpp>
42#include <boost/units/systems/si/prefixes.hpp>
43
44using boost::units::length_dimension;
45using boost::units::pow;
46using boost::units::root;
47using boost::units::quantity;
48using boost::units::unit;
49
50//[radar_beam_height_class_snippet_1
51namespace nautical {
52
53struct length_base_unit :
54 boost::units::base_unit<length_base_unit, length_dimension, 1>
55{
56 static std::string name() { return "nautical mile"; }
57 static std::string symbol() { return "nmi"; }
58};
59
60typedef boost::units::make_system<length_base_unit>::type system;
61
62/// unit typedefs
63typedef unit<length_dimension,system> length;
64
65static const length mile,miles;
66
67} // namespace nautical
68
69// helper for conversions between nautical length and si length
70BOOST_UNITS_DEFINE_CONVERSION_FACTOR(nautical::length_base_unit,
71 boost::units::si::meter_base_unit,
72 double, 1.852e3);
73//]
74
75//[radar_beam_height_class_snippet_2
76namespace imperial {
77
78struct length_base_unit :
79 boost::units::base_unit<length_base_unit, length_dimension, 2>
80{
81 static std::string name() { return "foot"; }
82 static std::string symbol() { return "ft"; }
83};
84
85typedef boost::units::make_system<length_base_unit>::type system;
86
87/// unit typedefs
88typedef unit<length_dimension,system> length;
89
90static const length foot,feet;
91
92} // imperial
93
94// helper for conversions between imperial length and si length
95BOOST_UNITS_DEFINE_CONVERSION_FACTOR(imperial::length_base_unit,
96 boost::units::si::meter_base_unit,
97 double, 1.0/3.28083989501312);
98//]
99
100// radar beam height functions
101//[radar_beam_height_function_snippet_1
102template<class System,typename T>
11fdf7f2 103constexpr
7c673cae
FG
104quantity<unit<boost::units::length_dimension,System>,T>
105radar_beam_height(const quantity<unit<length_dimension,System>,T>& radar_range,
106 const quantity<unit<length_dimension,System>,T>& earth_radius,
107 T k = 4.0/3.0)
108{
109 return quantity<unit<length_dimension,System>,T>
110 (pow<2>(radar_range)/(2.0*k*earth_radius));
111}
112//]
113
114//[radar_beam_height_function_snippet_2
115template<class return_type,class System1,class System2,typename T>
11fdf7f2 116constexpr
7c673cae
FG
117return_type
118radar_beam_height(const quantity<unit<length_dimension,System1>,T>& radar_range,
119 const quantity<unit<length_dimension,System2>,T>& earth_radius,
120 T k = 4.0/3.0)
121{
122 // need to decide which system to use for calculation
11fdf7f2
TL
123 return pow<2>(static_cast<return_type>(radar_range))
124 / (2.0*k*static_cast<return_type>(earth_radius));
7c673cae
FG
125}
126//]
127
128//[radar_beam_height_function_snippet_3
11fdf7f2 129constexpr
7c673cae
FG
130quantity<imperial::length>
131radar_beam_height(const quantity<nautical::length>& range)
132{
133 return quantity<imperial::length>
134 (pow<2>(range/(1.23*nautical::miles/root<2>(imperial::feet))));
135}
136//]
137
138int main(void)
139{
140 using namespace boost::units;
141 using namespace boost::units::si;
142 using namespace nautical;
143
144 //[radar_beam_height_snippet_1
145 const quantity<nautical::length> radar_range(300.0*miles);
146 const quantity<si::length> earth_radius(6371.0087714*kilo*meters);
147
148 const quantity<si::length> beam_height_1(radar_beam_height(quantity<si::length>(radar_range),earth_radius));
149 const quantity<nautical::length> beam_height_2(radar_beam_height(radar_range,quantity<nautical::length>(earth_radius)));
150 const quantity<si::length> beam_height_3(radar_beam_height< quantity<si::length> >(radar_range,earth_radius));
151 const quantity<nautical::length> beam_height_4(radar_beam_height< quantity<nautical::length> >(radar_range,earth_radius));
152 //]
153
154 std::cout << "radar range : " << radar_range << std::endl
155 << "earth radius : " << earth_radius << std::endl
156 << "beam height 1 : " << beam_height_1 << std::endl
157 << "beam height 2 : " << beam_height_2 << std::endl
158 << "beam height 3 : " << beam_height_3 << std::endl
159 << "beam height 4 : " << beam_height_4 << std::endl
160 << "beam height approx : " << radar_beam_height(radar_range)
161 << std::endl
162 << "beam height approx : "
163 << quantity<si::length>(radar_beam_height(radar_range))
164 << std::endl << std::endl;
165
166 return 0;
167}