]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/test/tools/detail/indirections.hpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / boost / test / tools / detail / indirections.hpp
index 836218d98d8932496429f7604ecc7ee3c188b1e7..2622f2a6538da3804d043d8ee171a928be1ae569 100644 (file)
 #include <boost/test/tools/detail/fwd.hpp>
 
 #include <boost/test/tools/assertion_result.hpp>
+#include <boost/test/utils/lazy_ostream.hpp>
+
+#include <boost/shared_ptr.hpp>
+#include <list>
 
 #include <boost/test/detail/suppress_warnings.hpp>
 
@@ -28,16 +32,41 @@ namespace boost {
 namespace test_tools {
 namespace tt_detail {
 
+struct assertion_evaluation_context 
+{
+    assertion_evaluation_context(bool has_report = false)
+    : m_has_report(has_report)
+    {}
+
+    bool m_has_report;
+};
+
 // ************************************************************************** //
 // **************        assertion_evaluate indirection        ************** //
 // ************************************************************************** //
 
 template<typename E>
 struct assertion_evaluate_t {
-    assertion_evaluate_t( E const& e ) : m_e( e ) {}
-    operator assertion_result() { return m_e.evaluate( true ); }
+
+    typedef shared_ptr<assertion_evaluation_context> context_holder;
+
+    assertion_evaluate_t( E const& e ) : m_e( e ), m_evaluate( true ) 
+    {}
+    
+    operator assertion_result() { return m_e.evaluate( m_evaluate ); }
+
+    assertion_evaluate_t<E> 
+    stack_context(context_holder context) const {
+        assertion_evaluate_t<E> added_context(*this);
+    
+        added_context.m_context_holder.push_back(context);
+        added_context.m_evaluate = !context->m_has_report;
+        return added_context;
+    }
 
     E const& m_e;
+    std::list< context_holder > m_context_holder;
+    bool m_evaluate;
 };
 
 //____________________________________________________________________________//
@@ -58,14 +87,12 @@ operator<<( assertion_evaluate_t<E> const& ae, T const& ) { return ae; }
 // **************          assertion_text indirection          ************** //
 // ************************************************************************** //
 
-template<typename T>
-inline unit_test::lazy_ostream const&
-assertion_text( unit_test::lazy_ostream const& /*et*/, T const& m ) { return m; }
-
-//____________________________________________________________________________//
-
 inline unit_test::lazy_ostream const&
-assertion_text( unit_test::lazy_ostream const& et, int ) { return et; }
+assertion_text( unit_test::lazy_ostream const& et, unit_test::lazy_ostream const& s) { 
+    if(!s.empty())
+        return s;
+    return et; 
+}
 
 //____________________________________________________________________________//
 
@@ -74,7 +101,11 @@ assertion_text( unit_test::lazy_ostream const& et, int ) { return et; }
 // ************************************************************************** //
 
 struct assertion_type {
-    operator check_type() { return CHECK_MSG; }
+    assertion_type(check_type ct = CHECK_MSG) : m_check_type(ct)
+    {}
+
+    operator check_type() { return m_check_type; }
+    check_type m_check_type;
 };
 
 //____________________________________________________________________________//