errormacro.hh
Go to the documentation of this file.
1 /* -*- mia-c++ -*-
2  *
3  * This file is part of MIA - a toolbox for medical image analysis
4  * Copyright (c) Leipzig, Madrid 1999-2013 Gert Wollny
5  *
6  * MIA is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with MIA; if not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 #ifndef mia_core_errormacro_hh
22 #define mia_core_errormacro_hh
23 
24 
25 #include <iostream>
26 #include <sstream>
27 #include <cassert>
28 #include <stdexcept>
29 #include <mia/core/defines.hh>
30 
31 
33 
34 template <typename V>
35 void __append_message(std::ostream& os, const V& v)
36 {
37  os << v;
38 }
39 
40 inline void __append_message(std::ostream& MIA_PARAM_UNUSED(os))
41 {
42 }
43 
44 template <typename V, typename... T>
45 void __append_message(std::ostream& os, const V& v, T ...t)
46 {
47  os << v;
48  ::mia::__append_message(os, t...);
49 }
50 
51 template <typename... T>
52 const std::string __create_message(T ...t)
53 {
54  std::stringstream msg;
55  ::mia::__append_message(msg, t...);
56  return msg.str();
57 }
58 
72 template <typename E, typename... T>
73 E create_exception( T ...t )
74 {
75  return E(::mia::__create_message(t...));
76 }
77 
78 #ifdef NDEBUG
79 
87 #define DEBUG_ASSERT_RELEASE_THROW(cond, msg... ) \
88  if (!(cond)) { \
89  throw ::mia::create_exception<std::logic_error>(msg); \
90  }
91 #else
92 #define DEBUG_ASSERT_RELEASE_THROW(cond, msg... ) \
93  if (!(cond)) { \
94  std::cerr << "Assertion failed: \'" #cond << "\' " << \
95  __FILE__ << ":" << __LINE__ << " " \
96  << ::mia::__create_message(msg) << "\n"; \
97  abort(); \
98  }
99 #endif
100 
102 
103 #endif