1 /////////////////////////////////////////////////////////////////////////// 2 // 3 // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas 4 // Digital Ltd. LLC 5 // 6 // All rights reserved. 7 // 8 // Redistribution and use in source and binary forms, with or without 9 // modification, are permitted provided that the following conditions are 10 // met: 11 // * Redistributions of source code must retain the above copyright 12 // notice, this list of conditions and the following disclaimer. 13 // * Redistributions in binary form must reproduce the above 14 // copyright notice, this list of conditions and the following disclaimer 15 // in the documentation and/or other materials provided with the 16 // distribution. 17 // * Neither the name of Industrial Light & Magic nor the names of 18 // its contributors may be used to endorse or promote products derived 19 // from this software without specific prior written permission. 20 // 21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 // 33 /////////////////////////////////////////////////////////////////////////// 34 35 36 37 #ifndef INCLUDED_IEXMACROS_H 38 #define INCLUDED_IEXMACROS_H 39 40 //-------------------------------------------------------------------- 41 // 42 // Macros which make throwing exceptions more convenient 43 // 44 //-------------------------------------------------------------------- 45 46 #include <sstream> 47 48 49 //---------------------------------------------------------------------------- 50 // A macro to throw exceptions whose text is assembled using stringstreams. 51 // 52 // Example: 53 // 54 // THROW (InputExc, "Syntax error in line " << line ", " << file << "."); 55 // 56 //---------------------------------------------------------------------------- 57 58 #define THROW(type, text) \ 59 do \ 60 { \ 61 std::stringstream s; \ 62 s << text; \ 63 throw type (s); \ 64 } \ 65 while (0) 66 67 68 //---------------------------------------------------------------------------- 69 // Macros to add to or to replace the text of an exception. 70 // The new text is assembled using stringstreams. 71 // 72 // Examples: 73 // 74 // Append to end of an exception's text: 75 // 76 // catch (BaseExc &e) 77 // { 78 // APPEND_EXC (e, " Directory " << name << " does not exist."); 79 // throw; 80 // } 81 // 82 // Replace an exception's text: 83 // 84 // catch (BaseExc &e) 85 // { 86 // REPLACE_EXC (e, "Directory " << name << " does not exist. " << e); 87 // throw; 88 // } 89 //---------------------------------------------------------------------------- 90 91 #define APPEND_EXC(exc, text) \ 92 do \ 93 { \ 94 std::stringstream s; \ 95 s << text; \ 96 exc.append (s); \ 97 } \ 98 while (0) 99 100 #define REPLACE_EXC(exc, text) \ 101 do \ 102 { \ 103 std::stringstream s; \ 104 s << text; \ 105 exc.assign (s); \ 106 } \ 107 while (0) 108 109 110 //------------------------------------------------------------- 111 // A macro to throw ErrnoExc exceptions whose text is assembled 112 // using stringstreams: 113 // 114 // Example: 115 // 116 // THROW_ERRNO ("Cannot open file " << name << " (%T)."); 117 // 118 //------------------------------------------------------------- 119 120 #define THROW_ERRNO(text) \ 121 do \ 122 { \ 123 std::stringstream s; \ 124 s << text; \ 125 ::Iex::throwErrnoExc (s.str()); \ 126 } \ 127 while (0) 128 129 130 //------------------------------------------------------------- 131 // A macro to throw exceptions if an assertion is false. 132 // 133 // Example: 134 // 135 // ASSERT (ptr != NULL, NullExc, "Null pointer" ); 136 // 137 //------------------------------------------------------------- 138 139 #define ASSERT(assertion, type, text) \ 140 do \ 141 { \ 142 if ((assertion) == false) \ 143 THROW (type, text); \ 144 } \ 145 while (0) 146 147 148 #endif 149