PlayaExceptions.hpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                 Playa: Programmable Linear Algebra
00005 //                 Copyright 2012 Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu)
00038 // 
00039 
00040 /* @HEADER@ */
00041 
00042 #ifndef PLAYA_EXCEPTIONS_H
00043 #define PLAYA_EXCEPTIONS_H
00044 
00045 #include "PlayaDefs.hpp"
00046 #include "PlayaDebug.hpp"
00047 #include "Teuchos_ConfigDefs.hpp"
00048 #include "Teuchos_Assert.hpp"
00049 #include <stdexcept>
00050 
00051 
00052 //bvbw for backard compatibility reasons
00053 //     I could not get this to work with ifdefs hence the hack
00054 
00055 #define PLAYA_ERROR7(msg) \
00056 { \
00057   Teuchos::TestForException_break(); \
00058   std::ostringstream omsg; \
00059   omsg << __FILE__ << ":" << __LINE__ << ": " \
00060        << ": " << msg; \
00061   throw Playa::RuntimeError(TEUCHOS_OSTRINGSTREAM_GET_C_STR(omsg)); \
00062 }
00063 
00064 #define PLAYA_ERROR(msg) \
00065 { \
00066   std::ostringstream omsg; \
00067   omsg << __FILE__ << ":" << __LINE__ << ": " \
00068        << ": " << msg; \
00069   const std::string &omsgstr = omsg.str(); \
00070   Teuchos::TestForException_break(omsgstr); \
00071   throw Playa::RuntimeError(TEUCHOS_OSTRINGSTREAM_GET_C_STR(omsg)); \
00072 }
00073 
00074 
00075 #define PLAYA_TRACE(e) \
00076 { \
00077   std::ostringstream omsg; \
00078   omsg << e.what() << std::endl \
00079   << "caught in " << __FILE__ << ":" << __LINE__ << std::endl ; \
00080   throw Playa::RuntimeError(TEUCHOS_OSTRINGSTREAM_GET_C_STR(omsg)); \
00081 }
00082 
00083 #define PLAYA_TRACE_MSG(e, msg)                      \
00084 { \
00085   std::ostringstream omsg; \
00086   omsg << e.what() << std::endl \
00087   << "caught in " << __FILE__ << ":" << __LINE__ << std::endl ; \
00088   omsg << msg << std::endl; \
00089   throw Playa::RuntimeError(TEUCHOS_OSTRINGSTREAM_GET_C_STR(omsg)); \
00090 }
00091 
00092 #define PLAYA_BOUNDSCHECK(i, low, high, location) \
00093 { \
00094   TEUCHOS_TEST_FOR_EXCEPTION( i < low || i > high, Playa::RuntimeError, \
00095     "Bounds violation in " << location << ": " \
00096     << #i << "is out of range [" \
00097     << #low << ", " << #high << "]") \
00098 }
00099 
00100 #define PLAYA_CHECK_ARRAY_SIZE_MATCH(a1, a2) \
00101   {\
00102     TEUCHOS_TEST_FOR_EXCEPTION(a1.size() != a2.size(), Playa::RuntimeError, \
00103 y      "Mismatched array sizes: size(" << #a1 << ")=" << a1.size() \
00104       << " size(" << #a2 << ")=" << a2.size() << ". Expected equal sizes");\
00105   }
00106 
00107 
00108 
00109 namespace Playa
00110 {
00111   /**
00112    * InternalError is thrown when an "impossible" case is detected
00113    * in Playa's internals. Occurance of an InternalError indicates
00114    * either a bug in Playa or runtime memory corruption that is
00115    * scrambling an object's virtual tables.
00116    */
00117   class InternalError : public std::logic_error
00118     {
00119     public:
00120       /** */
00121       InternalError(const std::string& msg);
00122     };
00123 
00124   /**
00125    * RuntimeError is an exception that occurs as a result of invalid
00126    * user-level code.
00127    */
00128   class RuntimeError : public std::runtime_error
00129     {
00130     public:
00131       /** */
00132       RuntimeError(const std::string& msg);
00133     };
00134   
00135 }
00136 
00137                   
00138 
00139 #endif

Site Contact