]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/contract/test/call_if/no_equal_call_if.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / contract / test / call_if / no_equal_call_if.cpp
CommitLineData
11fdf7f2
TL
1
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
6
7// Test assertions skipped when operations to check them missing (e.g., `==`).
8
92f5a8d4
TL
9// C++17 warning from Boost.Bind.
10#define _SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING
11
11fdf7f2
TL
12#include <boost/contract/function.hpp>
13#include <boost/contract/check.hpp>
14#include <boost/contract/assert.hpp>
15#include <boost/contract/call_if.hpp>
16#include <boost/bind.hpp>
17#include <boost/type_traits/has_equal_to.hpp>
18#include <boost/detail/lightweight_test.hpp>
19#include <functional>
20#include <vector>
21
22unsigned equal_skips;
23
24template<typename T>
25void push_back(std::vector<T>& vect, T const& value) {
26 boost::contract::check c = boost::contract::function()
27 .postcondition([&] {
28 BOOST_CONTRACT_ASSERT(
29 boost::contract::call_if<boost::has_equal_to<T> >(
30 boost::bind(std::equal_to<T>(), boost::cref(vect.back()),
31 boost::cref(value))
32 // Explicit bool return and [&] needed for MSVC10 lambdas.
33 ).else_([&] () -> bool { ++equal_skips; return true; })
34 );
35 })
36 ;
37 vect.push_back(value);
38}
39
40struct j { // Type without operator==.
92f5a8d4 41 explicit j(int /* i */) {}
11fdf7f2
TL
42};
43
44int main() {
45 std::vector<int> vi;
46 equal_skips = 0;
47 push_back(vi, 123);
48 BOOST_TEST_EQ(equal_skips, 0);
49
50 unsigned const cnt =
51 #ifndef BOOST_CONTRACT_NO_POSTCONDITIONS
52 1
53 #else
54 0
55 #endif
56 ;
57
58 j jj(456);
59 std::vector<j> vj;
60 equal_skips = 0;
61 push_back(vj, jj);
62 BOOST_TEST_EQ(equal_skips, cnt);
63
64 return boost::report_errors();
65}
66