diff options
Diffstat (limited to 'src/boost/libs/convert/example/getting_started.cpp')
-rw-r--r-- | src/boost/libs/convert/example/getting_started.cpp | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/src/boost/libs/convert/example/getting_started.cpp b/src/boost/libs/convert/example/getting_started.cpp new file mode 100644 index 000000000..5fa9c5314 --- /dev/null +++ b/src/boost/libs/convert/example/getting_started.cpp @@ -0,0 +1,268 @@ +// 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 _MSC_VER +# pragma warning(disable : 4127) // conditional expression is constant. +# pragma warning(disable : 4189) // local variable is initialized but not referenced. +# pragma warning(disable : 4100) // unreferenced formal parameter. +# pragma warning(disable : 4714) // marked as __forceinline not inlined. +#endif + +namespace { namespace local +{ +#if defined(_MSC_VER) + static bool const is_msc = true; +#else + static bool const is_msc = false; +#endif +}} + +#include <boost/bind.hpp> +#include <boost/detail/lightweight_test.hpp> + +static +void +log(char const*) +{ + // Dummy function to demonstrate how problems might be logged. +} + +//[getting_started_headers1 +#include <boost/convert.hpp> +#include <boost/convert/lexical_cast.hpp> +//] + +//[getting_started_using +using std::string; +using boost::lexical_cast; +using boost::convert; +//] +//[getting_started_default_converter +// Definition of the default converter (optional) +struct boost::cnv::by_default : boost::cnv::lexical_cast {}; +//] + +static +void +getting_started_example1() +{ + //[getting_started_example1 + try + { + boost::cnv::lexical_cast cnv; // boost::lexical_cast-based converter + + int i1 = lexical_cast<int>("123"); // boost::lexical_cast standard deployment + int i2 = convert<int>("123").value(); // boost::convert with the default converter + int i3 = convert<int>("123", cnv).value(); // boost::convert with an explicit converter + string s1 = lexical_cast<string>(123); // boost::lexical_cast standard deployment + string s2 = convert<string>(123).value(); // boost::convert with the default converter + string s3 = convert<string>(123, cnv).value(); // boost::convert with an explicit converter + + BOOST_TEST(i1 == 123); + BOOST_TEST(i2 == 123); + BOOST_TEST(i3 == 123); + BOOST_TEST(s1 == "123"); + BOOST_TEST(s2 == "123"); + BOOST_TEST(s3 == "123"); + } + catch (std::exception const& ex) + { + // Please be aware that the conversion requests above can fail. + // Use try'n'catch blocks to handle any exceptions thrown. + // Ignore this at your peril! + std::cerr << "Exception " << ex.what() << std::endl; + } + //] [/getting_started_example1] +} + +static +void +getting_started_example2() +{ + //[getting_started_example2 + // Does not throw. Returns fallback value (-1) when failed. + int i = convert<int>("uhm", boost::cnv::lexical_cast()).value_or(-1); + + BOOST_TEST(i == -1); // Conversion failed. 'i' assigned the fallback value. + //] +} + +//[getting_started_headers3 +#include <boost/convert/strtol.hpp> +#include <boost/convert/spirit.hpp> +//] + +static +void +getting_started_example3() +{ + //[getting_started_example3 + boost::cnv::lexical_cast cnv1; + boost::cnv::strtol cnv2; + boost::cnv::spirit cnv3; + + int i1 = convert<int>("123", cnv1).value(); + int i2 = convert<int>("123", cnv2).value(); // Two times faster than lexical_cast. + int i3 = convert<int>("123", cnv3).value(); // Four times faster than lexical_cast. + //] +} + +//[getting_started_headers4 +#include <boost/convert/stream.hpp> +//] + +static +void +getting_started_example4() +{ + //[getting_started_example4 + boost::cnv::cstream cnv; + + try + { + int i1 = lexical_cast<int>(" 123"); // Does not work. + BOOST_TEST(!"Never reached"); + } + catch (...) {} + + int i2 = convert<int>(" 123", cnv(std::skipws)).value(); // Success + string s1 = lexical_cast<string>(12.34567); + string s2 = convert<string>(12.34567, cnv(std::fixed)(std::setprecision(3))).value(); + string s3 = convert<string>(12.34567, cnv(std::scientific)(std::setprecision(3))).value(); + string expected = local::is_msc ? "1.235e+001" : "1.235e+01"; + + BOOST_TEST(i2 == 123); // boost::cnv::cstream. Successful conversion of " 123". + BOOST_TEST(s1 == "12.34567"); // boost::lexical_cast. Precision is not configurable. + BOOST_TEST(s2 == "12.346"); // boost::cnv::cstream. Precision was set to 3. Fixed. + BOOST_TEST(s3 == expected); // boost::cnv::cstream. Precision was set to 3. Scientific. + //] +} + +static +void +getting_started_example5() +{ + //[getting_started_example5 + boost::cnv::cstream cnv; + + int i1 = lexical_cast<int>("123"); // Throws when conversion fails. + int i2 = convert<int>("123", cnv).value(); // Throws when conversion fails. + int i3 = convert<int>("uhm", cnv).value_or(-1); // Returns -1 when conversion fails. + + BOOST_TEST(i1 == 123); + BOOST_TEST(i2 == 123); + BOOST_TEST(i3 == -1); + //] +} + +static +void +getting_started_example6() +{ + std::string const s1 = "123"; + std::string const s2 = "456"; + int const default_i1 = 11; + int const default_i2 = 12; + boost::cnv::cstream cnv; + + //[getting_started_example6 + + int i1 = convert<int>(s1, cnv(std::hex)).value_or(-1); // Read as hex + int i2 = convert<int>(s2, cnv(std::dec)).value_or(-1); // Read as decimal + + if (i1 == -1) log("bad i1"), i1 = default_i1; // Log failure. Proceed with the default + if (i2 == -1) log("bad i2"), i2 = default_i2; // Log failure. Proceed with the default + + // ... proceed + //] + BOOST_TEST(i1 == 291); + BOOST_TEST(i2 == 456); +} + +static +void +getting_started_example7() +{ + std::string const s1 = "123"; + std::string const s2 = "456"; + int const default_i1 = 11; + int const default_i2 = 12; + boost::cnv::cstream cnv; + + //[getting_started_example7 + + int i1 = convert<int>(s1, cnv(std::hex)).value_or(default_i1); // If failed, proceed with the default + int i2 = convert<int>(s2, cnv(std::dec)).value_or(default_i2); // If failed, proceed with the default + // ... proceed + //] + BOOST_TEST(i1 == 291); + BOOST_TEST(i2 == 456); +} + +static +//[getting_started_example9_func +int +fallback_fun(char const* msg, int fallback_value) +{ + // The principal advantage of a fallback_func over a fallback_value + // is that the former is only called when the conversion request fails. + // Consequently, the returned fallback_value is only calculated (which + // potentially might be expensive) when it is absolutely necessary. + log(msg); return fallback_value; +} +//] +static +void +getting_started_example9() +{ + std::string const s1 = "123"; + std::string const s2 = "456"; + int const default_i1 = 11; + int const default_i2 = 12; + + //[getting_started_example9 + int i1 = convert<int>(s1).value_or_eval(boost::bind(fallback_fun, "bad i1", default_i1)); + int i2 = convert<int>(s2).value_or_eval(boost::bind(fallback_fun, "bad i2", default_i2)); + // ... proceed + //] + BOOST_TEST(i1 == 123); + BOOST_TEST(i2 == 456); +} + +static +void +getting_started_example8() +{ + std::string const str = "123"; + int const default_i1 = 12; + //[getting_started_example8 + int i1 = default_i1; + + try + { + i1 = lexical_cast<int>(str); + } + catch (...) + { + log("bad i1"); + } + //] + BOOST_TEST(i1 == 123); +} + +int +main(int, char const* []) +{ + getting_started_example1(); + getting_started_example2(); + getting_started_example3(); + getting_started_example4(); + getting_started_example5(); + getting_started_example6(); + getting_started_example7(); + getting_started_example8(); + getting_started_example9(); + + return boost::report_errors(); +} |