mirror of
https://github.com/boostorg/leaf.git
synced 2026-01-19 04:22:08 +00:00
316 lines
7.0 KiB
C++
316 lines
7.0 KiB
C++
//Copyright (c) 2018 Emil Dotchevski
|
|
//Copyright (c) 2018 Second Spectrum, Inc.
|
|
|
|
//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/leaf/detail/optional.hpp>
|
|
#include <boost/detail/lightweight_test.hpp>
|
|
|
|
namespace leaf = boost::leaf;
|
|
|
|
struct error { };
|
|
int object_count=0;
|
|
int value_count=0;
|
|
|
|
class
|
|
my_info
|
|
{
|
|
my_info & operator=( my_info const & ) = delete;
|
|
public:
|
|
int value;
|
|
explicit
|
|
my_info( int value ):
|
|
value(value)
|
|
{
|
|
BOOST_TEST(++object_count>0);
|
|
BOOST_TEST(++value_count>0);
|
|
}
|
|
my_info( my_info const & x ):
|
|
value(x.value)
|
|
{
|
|
BOOST_TEST(++object_count>0);
|
|
BOOST_TEST(++value_count>0);
|
|
}
|
|
my_info( my_info && x ):
|
|
value(x.value)
|
|
{
|
|
x.value=-1;
|
|
BOOST_TEST(++object_count>0);
|
|
}
|
|
~my_info()
|
|
{
|
|
BOOST_TEST(--object_count>=0);
|
|
if( value!=-1 )
|
|
BOOST_TEST(--value_count>=0);
|
|
}
|
|
};
|
|
|
|
class
|
|
throws_on_copy
|
|
{
|
|
throws_on_copy & operator=( throws_on_copy const & )=delete;
|
|
public:
|
|
int value;
|
|
throws_on_copy()
|
|
{
|
|
BOOST_TEST(++object_count>0);
|
|
}
|
|
throws_on_copy( throws_on_copy const & )
|
|
{
|
|
throw error();
|
|
}
|
|
throws_on_copy( throws_on_copy && )
|
|
{
|
|
BOOST_TEST(++object_count>0);
|
|
}
|
|
~throws_on_copy()
|
|
{
|
|
BOOST_TEST(--object_count>=0);
|
|
}
|
|
};
|
|
|
|
void
|
|
run_tests()
|
|
{
|
|
using leaf::leaf_detail::optional;
|
|
{
|
|
optional<my_info> x;
|
|
BOOST_TEST(!x.has_value());
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
my_info a(42);
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
optional<my_info> x(a);
|
|
BOOST_TEST(object_count==2);
|
|
BOOST_TEST(value_count==2);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
throws_on_copy a;
|
|
BOOST_TEST(object_count==1);
|
|
try
|
|
{
|
|
optional<throws_on_copy> x(a);
|
|
BOOST_TEST(false);
|
|
}
|
|
catch( error & )
|
|
{
|
|
}
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
my_info a(42);
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
optional<my_info> x(std::move(a));
|
|
BOOST_TEST(object_count==2);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
optional<my_info> y(x);
|
|
BOOST_TEST(object_count==2);
|
|
BOOST_TEST(value_count==2);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
BOOST_TEST(y.has_value());
|
|
BOOST_TEST(y.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
optional<my_info> y(std::move(x));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(!x.has_value());
|
|
BOOST_TEST(y.has_value());
|
|
BOOST_TEST(y.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
optional<my_info> y;
|
|
BOOST_TEST(&(y=x)==&y);
|
|
BOOST_TEST(object_count==2);
|
|
BOOST_TEST(value_count==2);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
BOOST_TEST(y.has_value());
|
|
BOOST_TEST(y.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
optional<my_info> y(my_info(43));
|
|
BOOST_TEST(object_count==2);
|
|
BOOST_TEST(value_count==2);
|
|
BOOST_TEST(&(y=x)==&y);
|
|
BOOST_TEST(object_count==2);
|
|
BOOST_TEST(value_count==2);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
BOOST_TEST(y.has_value());
|
|
BOOST_TEST(y.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<throws_on_copy> x((throws_on_copy()));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
optional<throws_on_copy> y;
|
|
try
|
|
{
|
|
(void) (y=x);
|
|
}
|
|
catch( error & )
|
|
{
|
|
}
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(!y.has_value());
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
optional<my_info> y;
|
|
BOOST_TEST(&(y=std::move(x))==&y);
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(!x.has_value());
|
|
BOOST_TEST(y.has_value());
|
|
BOOST_TEST(y.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
optional<my_info> y(my_info(43));
|
|
BOOST_TEST(object_count==2);
|
|
BOOST_TEST(value_count==2);
|
|
BOOST_TEST(&(y=std::move(x))==&y);
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(!x.has_value());
|
|
BOOST_TEST(y.has_value());
|
|
BOOST_TEST(y.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x;
|
|
my_info a(42);
|
|
x.put(a);
|
|
BOOST_TEST(object_count==2);
|
|
BOOST_TEST(value_count==2);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(43));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
my_info a(42);
|
|
x.put(a);
|
|
BOOST_TEST(object_count==2);
|
|
BOOST_TEST(value_count==2);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x;
|
|
x.put(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(43));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
x.put(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
BOOST_TEST(x.value().value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
my_info a = x.extract_value();
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(!x.has_value());
|
|
BOOST_TEST(a.value==42);
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
{
|
|
optional<my_info> x(my_info(42));
|
|
BOOST_TEST(object_count==1);
|
|
BOOST_TEST(value_count==1);
|
|
BOOST_TEST(x.has_value());
|
|
x.reset();
|
|
BOOST_TEST(!x.has_value());
|
|
}
|
|
BOOST_TEST(!object_count);
|
|
BOOST_TEST(!value_count);
|
|
}
|
|
|
|
int
|
|
main()
|
|
{
|
|
run_tests();
|
|
return boost::report_errors();
|
|
}
|