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);
+    }
+}