diff options
Diffstat (limited to '')
-rw-r--r-- | src/boost/libs/serialization/test/test_strong_typedef.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/boost/libs/serialization/test/test_strong_typedef.cpp b/src/boost/libs/serialization/test/test_strong_typedef.cpp new file mode 100644 index 000000000..0dc59c9a4 --- /dev/null +++ b/src/boost/libs/serialization/test/test_strong_typedef.cpp @@ -0,0 +1,71 @@ +/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 +// test_strong_typedef.cpp + +// (C) Copyright 2016 Ashish Sadanandan +// Use, modification and distribution is subject to 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) + +// should pass compilation +#include <stdlib.h> // EXIT_SUCCESS + +#include <boost/config.hpp> +#include <boost/serialization/strong_typedef.hpp> +#include <boost/static_assert.hpp> + +#include <boost/type_traits/has_nothrow_assign.hpp> +#include <boost/type_traits/has_nothrow_constructor.hpp> +#include <boost/type_traits/has_nothrow_copy.hpp> + +/////////////////////////////////////////////////////////////////////// +// Define a strong typedef for int. +// The new type should be nothrow constructible and assignable. + +BOOST_STRONG_TYPEDEF(int, strong_int) + +#ifndef BOOST_HAS_NOTHROW_CONSTRUCTOR +BOOST_STATIC_ASSERT(boost::has_nothrow_default_constructor<strong_int>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy_constructor<strong_int>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<strong_int>::value); +#endif + +/////////////////////////////////////////////////////////////////////// +// strong_int can now be placed in another type, which can also be +// nothrow constructible and assignable. + +struct type1 +{ + long some_long; + strong_int sint; +}; + +#ifndef BOOST_HAS_NOTHROW_CONSTRUCTOR +BOOST_STATIC_ASSERT(boost::has_nothrow_default_constructor<type1>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy_constructor<type1>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<type1>::value); +#endif + +/////////////////////////////////////////////////////////////////////// +// Now define a type that throws, and a strong_typedef for it +// The strong_typedef should also not have nothrow construction/assign. + +struct not_noexcept +{ + not_noexcept() {} + not_noexcept(not_noexcept const&) {} + not_noexcept& operator=(not_noexcept const&) {return *this;} + bool operator==(not_noexcept const&) const {return false;} + bool operator<(not_noexcept const&) const {return false;} +}; +BOOST_STRONG_TYPEDEF(not_noexcept, strong_not_noexcept) + +#ifndef BOOST_HAS_NOTHROW_CONSTRUCTOR +BOOST_STATIC_ASSERT(! boost::has_nothrow_default_constructor<strong_not_noexcept>::value); +BOOST_STATIC_ASSERT(! boost::has_nothrow_copy_constructor<strong_not_noexcept>::value); +BOOST_STATIC_ASSERT(! boost::has_nothrow_assign<strong_not_noexcept>::value); +#endif + +int main() +{ + return EXIT_SUCCESS; +} |