Vaucanson 1.4
|
00001 // contract.hh: this file is part of the Vaucanson project. 00002 // 00003 // Vaucanson, a generic library for finite state machines. 00004 // 00005 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 The Vaucanson Group. 00006 // 00007 // This program is free software; you can redistribute it and/or 00008 // modify it under the terms of the GNU General Public License 00009 // as published by the Free Software Foundation; either version 2 00010 // of the License, or (at your option) any later version. 00011 // 00012 // The complete GNU General Public Licence Notice can be found as the 00013 // `COPYING' file in the root directory. 00014 // 00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file. 00016 // 00017 #ifndef VCSN_MISC_CONTRACT_HH 00018 # define VCSN_MISC_CONTRACT_HH 00019 00025 # ifndef VCSN_NDEBUG 00026 # include <vaucanson/config/system.hh> 00027 # include <vaucanson/misc/static.hh> 00028 00029 # include <iostream> 00030 # include <string> 00031 00032 namespace vcsn { 00033 namespace misc { 00034 namespace contract { 00035 00112 00113 void trap (const char *file, int line, 00114 const char *location, 00115 const std::string& message); 00116 00117 template<typename T> 00118 struct fail; 00119 } 00120 } 00121 } 00122 00123 # define vcsn_trap_(Message, Cond) \ 00124 vcsn::misc::contract::trap (__FILE__, __LINE__, PRETTY_FUNCTION (), \ 00125 std::string (Message) + ": " #Cond) 00126 # define vcsn_trap__(Message, Cond, Explanation) \ 00127 vcsn::misc::contract::trap (__FILE__, __LINE__, PRETTY_FUNCTION (), \ 00128 std::string (Message) + ": " #Cond " // " + Explanation) 00129 # define vcsn_trap_2(Message1, Message2) \ 00130 vcsn::misc::contract::trap (__FILE__, __LINE__, PRETTY_FUNCTION (), \ 00131 std::string (Message1) + ": " + Message2) 00132 00133 # define assertion(Cond) static_cast<void> ((Cond) ? static_cast<void> (0) : vcsn_trap_ ("Assertion failed", Cond)) 00134 # define precondition(Cond) static_cast<void> ((Cond) ? static_cast<void> (0) : vcsn_trap_ ("Precondition failed", Cond)) 00135 # define postcondition(Cond) static_cast<void> ((Cond) ? static_cast<void> (0) : vcsn_trap_ ("Postcondition failed", Cond)) 00136 00137 # define unreachable(Explanation) vcsn_trap_2 ("Unreachable code reached", Explanation) 00138 00139 # define assertion_(Cond, Explanation_if_false) static_cast<void> ((Cond) ? static_cast<void> (0) : vcsn_trap__ ("Assertion failed", Cond, Explanation_if_false)) 00140 # define precondition_(Cond, Explanation_if_false) static_cast<void> ((Cond) ? static_cast<void> (0) : vcsn_trap__ ("Precondition failed", Cond, Explanation_if_false)) 00141 # define postcondition_(Cond, Explanation_if_false) static_cast<void> ((Cond) ? static_cast<void> (0) : vcsn_trap__ ("Postcondition failed", Cond, Explanation_if_false)) 00142 00143 # define result_not_computable_if(Cond) static_cast<void> ((Cond) ? vcsn_trap_ ("Result is not computable", Cond) : static_cast<void> (0)) 00144 # define result_not_computable(Message) vcsn_trap_2 ("Result is not computable", Message) 00145 00146 # define pure_service_call(Service) vcsn_trap_ ("Pure abstract service called", Service) 00147 00148 # define static_assertion(Cond, Message) \ 00149 { vcsn::misc::static_if<Cond, int, vcsn::misc::contract::fail<void> >::t Message; Message = 0; } 00150 # define static_assertion_(Cond, Message) \ 00151 { typename vcsn::misc::static_if<Cond, int, vcsn::misc::contract::fail<void> >::t Message; Message = 0; } 00152 00153 # define static_error(Message) \ 00154 { \ 00155 struct Message; \ 00156 vcsn::misc::contract::fail<Message> Message; \ 00157 } 00158 00159 # ifndef INTERNAL_CHECKS 00160 00161 # define recommendation(Cond) static_cast<void> (0) 00162 # define deprecation(Feature) static_cast<void> (0) 00163 # define weakness(Feature) static_cast<void> (0) 00164 # define incompletion(Feature) static_cast<void> (0) 00165 00166 # define WARNING(Message) static_cast<void> (0) 00167 00168 # else // ! INTERNAL_CHECKS 00169 00170 # ifdef STRICT 00171 # define __inconsistency(Message1, Message2) vcsn_trap_2 (Message1, Message2) 00172 # else // ! STRICT 00173 # define __inconsistency(Message1, Message2) \ 00174 static_cast<void> (std::cerr << __FILE__ << ':' << __LINE__ << ": " \ 00175 << Message1 << ": " << Message2 << std::endl) 00176 # endif // STRICT 00177 00178 # define recommendation(Cond) \ 00179 static_cast<void> ((Cond) ? \ 00180 static_cast<void> (0) : \ 00181 __inconsistency ("Recommendation", #Cond " Failed.")) 00182 # define deprecation(Feature) __inconsistency ("Deprecated feature", Feature) 00183 # define weakness(Feature) __inconsistency ("Weak feature", Feature) 00184 # define incompletion(Feature) __inconsistency ("Incomplete implementation", Feature) 00185 # define WARNING(Message) __inconsistency ("Warning", Message) 00186 00187 # endif // INTERNAL_CHECKS 00188 00189 # else // VCSN_NDEBUG 00190 00191 # define static_assertion(Cond, Message) typedef void Message 00192 # define static_assertion_(Cond, Message) typedef void Message 00193 # define static_error(Message) typedef void Message 00194 00195 # define assertion(Cond) static_cast<void> (0) 00196 # define precondition(Cond) static_cast<void> (0) 00197 # define postcondition(Cond) static_cast<void> (0) 00198 # define assertion_(Cond, Explanation_if_false) static_cast<void> (0) 00199 # define precondition_(Cond, Explanation_if_false) static_cast<void> (0) 00200 # define postcondition_(Cond, Explanation_if_false) static_cast<void> (0) 00201 00202 # define unreachable(Explanation) static_cast<void> (0) 00203 00204 # define result_not_computable_if(Cond) static_cast<void> (0) 00205 # define result_not_computable(Message) static_cast<void> (0) 00206 00207 # define pure_service_call(Service) static_cast<void> (0) 00208 00209 # define recommendation(Cond) static_cast<void> (0) 00210 # define deprecation(Feature) static_cast<void> (0) 00211 # define weakness(Feature) static_cast<void> (0) 00212 # define incompletion(Feature) static_cast<void> (0) 00213 00214 # define WARNING(Message) static_cast<void> (0) 00215 00216 # endif // ! VCSN_NDEBUG 00217 00218 #endif // ! VCSN_MISC_CONTRACT_HH