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