Squashed 'third_party/boostorg/units/' content from commit 57389b7
Change-Id: Id8ff79c1508f6103e20808f7a038f6a30d113b08
git-subtree-dir: third_party/boostorg/units
git-subtree-split: 57389b7374a6f7a4caf87cc44092bb8d0db65ec6
diff --git a/example/runtime_conversion_factor.cpp b/example/runtime_conversion_factor.cpp
new file mode 100644
index 0000000..f814c88
--- /dev/null
+++ b/example/runtime_conversion_factor.cpp
@@ -0,0 +1,72 @@
+// 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)
+
+#include <boost/units/base_dimension.hpp>
+#include <boost/units/base_unit.hpp>
+#include <boost/units/unit.hpp>
+#include <boost/units/quantity.hpp>
+
+//[runtime_conversion_factor_snippet_1
+
+using boost::units::base_dimension;
+using boost::units::base_unit;
+
+static const long currency_base = 1;
+
+struct currency_base_dimension : base_dimension<currency_base_dimension, 1> {};
+
+typedef currency_base_dimension::dimension_type currency_type;
+
+template<long N>
+struct currency_base_unit :
+ base_unit<currency_base_unit<N>, currency_type, currency_base + N> {};
+
+typedef currency_base_unit<0> us_dollar_base_unit;
+typedef currency_base_unit<1> euro_base_unit;
+
+typedef us_dollar_base_unit::unit_type us_dollar;
+typedef euro_base_unit::unit_type euro;
+
+// an array of all possible conversions
+double conversion_factors[2][2] = {
+ {1.0, 1.0},
+ {1.0, 1.0}
+};
+
+double get_conversion_factor(long from, long to) {
+ return(conversion_factors[from][to]);
+}
+
+void set_conversion_factor(long from, long to, double value) {
+ conversion_factors[from][to] = value;
+ conversion_factors[to][from] = 1.0 / value;
+}
+
+BOOST_UNITS_DEFINE_CONVERSION_FACTOR_TEMPLATE((long N1)(long N2),
+ currency_base_unit<N1>,
+ currency_base_unit<N2>,
+ double, get_conversion_factor(N1, N2));
+
+//]
+
+int main() {
+ boost::units::quantity<us_dollar> dollars = 2.00 * us_dollar();
+ boost::units::quantity<euro> euros(dollars);
+ set_conversion_factor(0, 1, 2.0);
+ dollars = static_cast<boost::units::quantity<us_dollar> >(euros);
+ set_conversion_factor(0, 1, .5);
+ euros = static_cast<boost::units::quantity<euro> >(dollars);
+ double value = euros.value(); // = .5
+ if(value != .5) {
+ return(1);
+ } else {
+ return(0);
+ }
+}