1 /////////////////////////////////////////////////////////////////////////////// 2 /// \file regex_error.hpp 3 /// Contains the definition of the regex_error exception class. 4 // 5 // Copyright 2008 Eric Niebler. Distributed under the Boost 6 // Software License, Version 1.0. (See accompanying file 7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 8 9 #ifndef BOOST_XPRESSIVE_REGEX_ERROR_HPP_EAN_10_04_2005 10 #define BOOST_XPRESSIVE_REGEX_ERROR_HPP_EAN_10_04_2005 11 12 // MS compatible compilers support #pragma once 13 #if defined(_MSC_VER) 14 # pragma once 15 #endif 16 17 #include <string> 18 #include <stdexcept> 19 #include <boost/throw_exception.hpp> 20 #include <boost/current_function.hpp> 21 #include <boost/exception/exception.hpp> 22 #include <boost/exception/info.hpp> 23 #include <boost/xpressive/regex_constants.hpp> 24 25 //{{AFX_DOC_COMMENT 26 /////////////////////////////////////////////////////////////////////////////// 27 // This is a hack to get Doxygen to show the inheritance relation between 28 // regex_error and std::runtime_error. 29 #ifdef BOOST_XPRESSIVE_DOXYGEN_INVOKED 30 /// INTERNAL ONLY 31 namespace std 32 { 33 /// INTERNAL ONLY 34 struct runtime_error {}; 35 } 36 #endif 37 //}}AFX_DOC_COMMENT 38 39 namespace boost { namespace xpressive 40 { 41 42 //////////////////////////////////////////////////////////////////////////////// 43 // regex_error 44 // 45 /// \brief The class regex_error defines the type of objects thrown as 46 /// exceptions to report errors during the conversion from a string representing 47 /// a regular expression to a finite state machine. 48 struct regex_error 49 : std::runtime_error 50 , boost::exception 51 { 52 /// Constructs an object of class regex_error. 53 /// \param code The error_type this regex_error represents. 54 /// \param str The message string of this regex_error. 55 /// \post code() == code regex_errorboost::xpressive::regex_error56 explicit regex_error(regex_constants::error_type code, char const *str = "") 57 : std::runtime_error(str) 58 , boost::exception() 59 , code_(code) 60 { 61 } 62 63 /// Accessor for the error_type value 64 /// \return the error_type code passed to the constructor 65 /// \throw nothrow codeboost::xpressive::regex_error66 regex_constants::error_type code() const 67 { 68 return this->code_; 69 } 70 71 /// Destructor for class regex_error 72 /// \throw nothrow ~regex_errorboost::xpressive::regex_error73 virtual ~regex_error() throw() 74 {} 75 76 private: 77 78 regex_constants::error_type code_; 79 }; 80 81 namespace detail 82 { ensure_(bool cond,regex_constants::error_type code,char const * msg,char const * fun,char const * file,unsigned long line)83 inline bool ensure_( 84 bool cond 85 , regex_constants::error_type code 86 , char const *msg 87 , char const *fun 88 , char const *file 89 , unsigned long line 90 ) 91 { 92 if(!cond) 93 { 94 #ifndef BOOST_EXCEPTION_DISABLE 95 boost::throw_exception( 96 boost::xpressive::regex_error(code, msg) 97 << boost::throw_function(fun) 98 << boost::throw_file(file) 99 << boost::throw_line((int)line) 100 ); 101 #else 102 boost::throw_exception(boost::xpressive::regex_error(code, msg)); 103 #endif 104 } 105 return true; 106 } 107 } 108 109 #define BOOST_XPR_ENSURE_(pred, code, msg) \ 110 boost::xpressive::detail::ensure_(!!(pred), code, msg, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__) \ 111 /**/ 112 113 }} // namespace boost::xpressive 114 115 #endif 116