]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/contract/example/features/named_override.cpp
2 // Copyright (C) 2008-2018 Lorenzo Caminiti
3 // Distributed under the Boost Software License, Version 1.0 (see accompanying
4 // file LICENSE_1_0.txt or a copy at http://www.boost.org/LICENSE_1_0.txt).
5 // See: http://www.boost.org/doc/libs/release/libs/contract/doc/html/index.html
7 #include <boost/contract.hpp>
8 #include <boost/optional.hpp>
11 //[named_override_pure_virtual_assert_false
13 class generic_unary_pack
{
15 virtual void _1(T
const& value
, boost::contract::virtual_
* v
= 0) = 0;
16 virtual T
_1(boost::contract::virtual_
* v
= 0) const = 0;
20 void generic_unary_pack
<T
>::_1(T
const& value
, boost::contract::virtual_
* v
) {
21 boost::contract::check c
= boost::contract::public_function(v
, this)
23 BOOST_CONTRACT_ASSERT(false); // Defer preconditions to overrides.
33 T generic_unary_pack
<T
>::_1(boost::contract::virtual_
* v
) const {
34 boost::optional
<T
> result
; // Do not assume T has default constructor.
35 boost::contract::check c
= boost::contract::public_function(v
, result
, this)
36 .postcondition([&] (boost::optional
<T
const&> const& result
) {
37 BOOST_CONTRACT_ASSERT(*result
== _1());
47 class positive_unary_pack
48 #define BASES public generic_unary_pack<T>
52 typedef BOOST_CONTRACT_BASE_TYPES(BASES
) base_types
;
55 // BOOST_CONTRACT_OVERRIDE(_1) would generate reserved name `override__1`.
56 BOOST_CONTRACT_NAMED_OVERRIDE(override1
, _1
) // Generate `override1`.
58 virtual void _1(T
const& value
, boost::contract::virtual_
* v
= 0)
60 // Use `override1` generated by BOOST_CONTRACT_NAMED_OVERRIDE above.
61 boost::contract::check c
= boost::contract::public_function
<override1
>(
63 static_cast<void (positive_unary_pack::*)(T
const&,
64 boost::contract::virtual_
*)>(&positive_unary_pack::_1
),
69 BOOST_CONTRACT_ASSERT(value
> 0);
78 virtual T
_1(boost::contract::virtual_
* v
= 0) const /* override */ {
79 T result
; // Class default constructor already used T's default ctor.
80 boost::contract::check c
= boost::contract::public_function
<override1
>(
83 static_cast<T (positive_unary_pack::*)(boost::contract::virtual_
*)
84 const>(&positive_unary_pack::_1
),
87 .postcondition([&] (T
const& result
) {
88 BOOST_CONTRACT_ASSERT(result
> 0);
91 return result
= value1_
;
99 positive_unary_pack
<int> u
;
101 assert(u
._1() == 123);