1 #ifndef DUNE_FEM_GRIDPART_TEST_FAILURE_HH
2 #define DUNE_FEM_GRIDPART_TEST_FAILURE_HH
3 
4 #include <cassert>
5 
6 //- dune-common includes
7 #include <dune/common/stdstreams.hh>
8 
9 //- include this as very last
10 #include <dune/common/bartonnackmanifcheck.hh>
11 
12 
13 namespace Dune
14 {
15 
16   // Failure
17   // -------
18 
19   struct Failure
20   {
21     /** \brief default constructor  */
FailureDune::Failure22     Failure () { }
23 
24   protected:
25     friend std::ostream& operator<< ( std::ostream &, const Failure & );
26 
27     /** \brief print output to ostream */
28     virtual void writeTo ( std::ostream &out ) const = 0;
29   };
30 
operator <<(std::ostream & s,const Failure & failure)31   std::ostream &operator<< ( std::ostream &s, const Failure &failure )
32   {
33     failure.writeTo( s );
34     return s;
35   }
36 
37 
38   // FailureHandler
39   // --------------
40 
41   template< class FailureHandlerImp >
42   struct FailureHandler
43   {
44     /** \brief default constructor  */
FailureHandlerDune::FailureHandler45     FailureHandler () { }
46 
47     /** \brief act on failure */
48     template< class Failure >
operator ()Dune::FailureHandler49     void operator() ( Failure &failure ) const
50     {
51       CHECK_INTERFACE_IMPLEMENTATION( ( asImp().operator()( failure ) ) );
52       return asImp().operator()( failure );
53     }
54 
55   private:
56     // hide copy constructor
57     FailureHandler ( const FailureHandler & );
58     // hide assignment operator
59     FailureHandler &operator= ( const FailureHandler & );
60 
61     //  Barton-Nackman trick
asImpDune::FailureHandler62     FailureHandlerImp &asImp ()
63     {
64       return static_cast< FailureHandlerImp & >( *this );
65     }
66 
67     //  Barton-Nackman trick
asImpDune::FailureHandler68     const FailureHandlerImp &asImp () const
69     {
70       return static_cast< const FailureHandlerImp & >( *this );
71     }
72   };
73 
74 
75 
76   // DefaultFailureHandler
77   // ---------------------
78 
79   struct DefaultFailureHandler
80   : public FailureHandler< DefaultFailureHandler >
81   {
82     /** \brief act on failure */
83     template< class Failure >
operator ()Dune::DefaultFailureHandler84     void operator() ( Failure &failure ) const
85     {
86       std::cerr<< failure << std::endl;
87       assert( false );
88     }
89   };
90 
91 } // end namespace Dune
92 
93 #endif // #ifndef DUNE_FEM_GRIDPART_TEST_FAILURE_HH
94