summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/convert/example/getting_serious.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/convert/example/getting_serious.cpp')
-rw-r--r--src/boost/libs/convert/example/getting_serious.cpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/boost/libs/convert/example/getting_serious.cpp b/src/boost/libs/convert/example/getting_serious.cpp
new file mode 100644
index 000000000..1e0b7597d
--- /dev/null
+++ b/src/boost/libs/convert/example/getting_serious.cpp
@@ -0,0 +1,155 @@
+// Copyright (c) 2009-2016 Vladimir Batov.
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. See http://www.boost.org/LICENSE_1_0.txt.
+
+#ifdef BOOST_MSVC
+# pragma warning(disable : 4127) // conditional expression is constant.
+# pragma warning(disable : 4189) // local variable is initialized but not referenced.
+#endif
+
+#include <boost/convert.hpp>
+#include <boost/convert/stream.hpp>
+#include <boost/convert/lexical_cast.hpp>
+
+using std::string;
+using boost::convert;
+using boost::lexical_cast;
+using boost::optional;
+
+static void process_failure() {}
+static void log(...) {}
+static int fallback_function() { return -1; }
+
+//[getting_serious_default_converter
+struct boost::cnv::by_default : boost::cnv::cstream {};
+//]
+static
+void
+example1()
+{
+ boost::cnv::cstream cnv;
+ std::string const str = "123";
+ std::string const str1 = "123";
+ std::string const str2 = "123";
+ std::string const str3 = "123";
+ int const fallback_value = -1;
+
+ {
+ //[getting_serious_example1
+ int i2 = convert<int>("not an int", cnv).value_or(-1); // after the call i2==-1
+
+ if (i2 == -1) process_failure();
+ //]
+ }
+ {
+ //[getting_serious_example2
+ try
+ {
+ int i1 = lexical_cast<int>(str); // Throws if the conversion fails.
+ int i2 = convert<int>(str, cnv).value(); // Throws if the conversion fails.
+ }
+ catch (...)
+ {
+ process_failure();
+ }
+ //]
+ }
+ {
+ //[getting_serious_example3
+ optional<int> r1 = convert<int>(str1, cnv); // Does not throw on conversion failure.
+ optional<int> r2 = convert<int>(str2, cnv); // Does not throw on conversion failure.
+ // ...
+ try // Delayed processing of potential exceptions.
+ {
+ int i1 = r1.value(); // Will throw if conversion failed.
+ int i2 = r2.value(); // Will throw if conversion failed.
+ }
+ catch (boost::bad_optional_access const&)
+ {
+ // Handle failed conversion.
+ }
+
+ // Exceptions are avoided altogether.
+ int i1 = r1 ? r1.value() : fallback_value;
+ int i2 = r2.value_or(fallback_value);
+ int i3 = convert<int>(str3, cnv).value_or(fallback_value);
+ int i4 = convert<int>(str3, cnv).value_or_eval(fallback_function);
+ //]
+ }
+}
+
+//[getting_serious_example5
+struct fallback_func
+{
+ int operator()() const { log("Failed to convert"); return 42; }
+};
+//]
+
+static
+void
+example4()
+{
+ boost::cnv::cstream cnv;
+ std::string const str = "123";
+ int const fallback_value = -1;
+ //[getting_serious_example4
+ boost::optional<int> res = boost::convert<int>(str, cnv);
+
+ if (!res) log("str conversion failed!");
+
+ int i1 = res.value_or(fallback_value);
+
+ // ...proceed
+ //]
+ //[getting_serious_example6
+ // Fallback function is called when failed
+ int i2 = convert<int>(str, cnv).value_or_eval(fallback_func());
+ int i3 = convert<int>(str, cnv, fallback_func()); // Same as above. Alternative API.
+ //]
+}
+
+static
+void
+example7()
+{
+ boost::cnv::cstream cnv;
+ std::string const str = "123";
+ int const fallback_value = -1;
+ //[getting_serious_example7
+ // Error-processing behavior are specified unambiguously and uniformly.
+ // a) i1: Returns the provided fallback value;
+ // b) i2: Calls the provided failure-processing function;
+ // c) i3: Throws an exception.
+
+ int i1 = convert<int>(str, cnv, fallback_value);
+ int i2 = convert<int>(str, cnv, fallback_func());
+
+ try
+ {
+ // Throwing behavior specified explicitly rather than implied.
+ int i3 = convert<int>(str, cnv, boost::throw_on_failure);
+ }
+ catch (boost::bad_optional_access const&)
+ {
+ // Handle failed conversion.
+ }
+ //]
+ //[getting_serious_example8
+ int m1 = convert<int>(str, cnv).value_or(fallback_value);
+ int m2 = convert<int>(str, cnv).value_or_eval(fallback_func());
+ int m3 = convert<int>(str, cnv).value();
+ //]
+ //[getting_serious_example9
+ int n1 = convert<int>(str).value_or(fallback_value);
+ int n2 = convert<int>(str).value_or_eval(fallback_func());
+ int n3 = convert<int>(str).value();
+ //]
+}
+
+int
+main(int, char const* [])
+{
+ example1();
+ example4();
+ example7();
+}