boost/libs/json/test/doc_using_numbers.cpp
2021-10-05 21:37:46 +02:00

194 lines
3.9 KiB
C++

//
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
//
// 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)
//
// Official repository: https://github.com/boostorg/json
//
#include <boost/json/parse.hpp>
#include <boost/json/value.hpp>
#include <boost/json/value_to.hpp>
#include "test_suite.hpp"
#ifdef _MSC_VER
# pragma warning(push)
# pragma warning(disable: 4101)
# pragma warning(disable: 4189) // local variable is initialized but not referenced
#elif defined(__clang__)
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wunused"
# pragma clang diagnostic ignored "-Wunused-variable"
#elif defined(__GNUC__)
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wunused"
# pragma GCC diagnostic ignored "-Wunused-variable"
#endif
BOOST_JSON_NS_BEGIN
//----------------------------------------------------------
static void set1() {
//----------------------------------------------------------
{
//[doc_using_numbers_1
// construction from int
value jv1 = 1;
assert( jv1.is_int64() );
// construction from unsigned int
value jv2 = 2u;
assert( jv2.is_uint64() );
// construction from double
value jv3 = 3.0;
assert( jv3.is_double() );
//]
}
//----------------------------------------------------------
{
//[doc_using_numbers_2
value jv = 1;
assert( jv.is_int64() );
// jv.kind() != kind::uint64; throws
std::uint64_t r1 = jv.as_uint64();
// jv.kind() != kind::uint64; the behavior is undefined
std::uint64_t r2 = jv.get_uint64();
// if_double will always return nullptr, branch is not taken
if(double* d = jv.if_double())
assert( false );
//]
};
//----------------------------------------------------------
{
//[doc_using_numbers_3
struct convert_int64
{
value jv;
operator int() const
{
return value_to< int >( this->jv );
}
};
//]
}
//----------------------------------------------------------
try
{
//[doc_using_numbers_4
value jv1 = 404;
assert( jv1.is_int64() );
// ok, identity conversion
std::int64_t r1 = value_to< std::int64_t >( jv1 );
// loss of data, throws system_error
char r2 = value_to< char >( jv1 );
// ok, no loss of data
double r3 = value_to< double >( jv1 );
value jv2 = 1.23;
assert( jv1.is_double() );
// ok, same as static_cast<float>( jv2.get_double() )
float r4 = value_to< float >( jv2 );
// not exact, throws system_error
int r5 = value_to< int >( jv2 );
value jv3 = {1, 2, 3};
assert( ! jv3.is_number() );
// not a number, throws system_error
int r6 = value_to< int >( jv3 );
//]
}
catch(...)
{
}
//----------------------------------------------------------
{
//[doc_using_numbers_5
value jv = 10.5;
error_code ec;
// ok, conversion is exact
float r1 = jv.to_number< float >( ec );
assert( ! ec );
// error, conversion is non-exact
int r2 = jv.to_number< int >( ec );
assert( ec == error::not_exact );
//]
}
//----------------------------------------------------------
{
//[doc_using_numbers_6
value jv = parse("[-42, 100, 10.25, -299999999999999999998, 2e32]");
array ja = jv.as_array();
// represented by std::int64_t
assert( ja[0].is_int64() );
// represented by std::int64_t
assert( ja[1].is_int64() );
// contains decimal point, represented as double
assert( ja[2].is_double() );
// less than INT64_MIN, represented as double
assert( ja[3].is_double() );
// contains exponent, represented as double
assert( ja[4].is_double() );
//]
}
//----------------------------------------------------------
{
//[doc_using_numbers_7
//]
}
//----------------------------------------------------------
} // set1
//----------------------------------------------------------
class doc_using_numbers_test
{
public:
void
run()
{
(void)&set1;
}
};
TEST_SUITE(doc_using_numbers_test, "boost.json.doc_using_numbers");
BOOST_JSON_NS_END