Home | History | Annotate | Download | only in Iex
      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