| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | 
                        - // faults.hpp
 - //
 - // Copyright (C) MicroNeil Research Corporation 2009
 - // This file is part of the CodeDweller library.
 - // See www.codedweller.com for details.
 - //
 - // Faults and Checks are classes we can use in place of assert() to handle
 - // unreasonable or necessary conditions in our code. They are constructed with
 - // friendly descriptions (and optionally error codes) and then used just
 - // like assert() would be used-- except they are designed to remain in the
 - // production code. After all, assert() is a C (not C++) concept.
 - //
 - // A ...Check(test_expression) activates when the test_expression is not true.
 - // A ...Fault(text_expression) activates when the test_expression is true.
 - //
 - // An Abort...() sends it's description to cerr then aborts (no cleanup).
 - // An Exit...() sends it's description to cerr then exits with a result code.
 - // A Runtime...() throws a runtime_error (self) with it's description in what().
 - // A Logic...() throws a logic_error (self) with it's description in what().
 - 
 - #ifndef MNR_faults
 - #define MNR_faults
 - 
 - #include <stdexcept>
 - #include <cstdlib>
 - #include <iostream>
 - #include <string>
 - 
 - namespace CodeDweller {
 - 
 - const int DefaultExitCode = EXIT_FAILURE;                                       // Use this when no code is provided.
 - 
 - class AbortCheck {                                                              // If this check is false we will abort.
 - 
 -   private:
 - 
 -     const std::string myDescription;                                            // This is what I have to say.
 - 
 -   public:
 - 
 -     AbortCheck(const std::string& Text) : myDescription(Text) {}                // I am constructed with a description
 - 
 -     void operator()(bool X) const {                                             // Apply me like assert(exp)
 -         if(false == X) {                                                        // If the expression is false then we
 -             std::cerr << myDescription << std::endl;                            // failed the check so we display our
 -             abort();                                                            // description and abort.
 -         }
 -     }
 - 
 -     const std::string Description() { return myDescription; }                   // You can ask for my Description.
 - };
 - 
 - class AbortFault {                                                              // If this fault occurs we will abort.
 - 
 -   private:
 - 
 -     const std::string myDescription;                                            // This is what I have to say.
 - 
 -   public:
 - 
 -     AbortFault(const std::string& Text) :  myDescription(Text) {}               // I am constructed with a description
 - 
 -     void operator()(bool X) const {                                             // Apply me like assert(! exp)
 -         if(true == X) {                                                         // If the expression is true then we
 -             std::cerr << myDescription << std::endl;                            // have a fault so we display our fault
 -             abort();                                                            // description and abort.
 -         }
 -     }
 - 
 -     const std::string Description() const { return myDescription; }             // You can ask for my Description.
 - };
 - 
 - class ExitCheck {                                                               // If this check is false we will exit.
 - 
 -   private:
 - 
 -     const std::string myDescription;                                            // This is what I have to say.
 -     const int myExitCode;                                                       // This is what I send to exit().
 - 
 -   public:
 - 
 -     ExitCheck(const std::string& Text, int Code=DefaultExitCode) :              // I am constructed with a description
 -       myDescription(Text), myExitCode(Code) {}                                  // and (optionlly) an exit code.
 - 
 -     void operator()(bool X) const {                                             // Apply me like assert(exp)
 -         if(false == X) {                                                        // If the expression is false then we
 -             std::cerr << myDescription << std::endl;                            // failed the check so we display our
 -             exit(myExitCode);                                                   // description and exit with our code.
 -         }
 -     }
 - 
 -     const std::string Description() { return myDescription; }                   // You can ask for my Description.
 -     const int ExitCode() { return myExitCode; }                                 // You can ask for my ExitCode.
 - };
 - 
 - class ExitFault {                                                               // If this fault occurs we will exit.
 - 
 -   private:
 - 
 -     const std::string myDescription;                                            // This is what I have to say.
 -     const int myExitCode;                                                       // This is what I send to exit().
 - 
 -   public:
 - 
 -     ExitFault(const std::string& Text, int Code=DefaultExitCode) :              // I am constructed with a description
 -       myDescription(Text), myExitCode(Code) {}                                  // and (optionlly) an exit code.
 - 
 -     void operator()(bool X) const {                                             // Apply me like assert(! exp)
 -         if(true == X) {                                                         // If the expression is true then we
 -             std::cerr << myDescription << std::endl;                            // have a fault so we display our fault
 -             exit(myExitCode);                                                   // description and exit with our code.
 -         }
 -     }
 - 
 -     const std::string Description() const { return myDescription; }             // You can ask for my Description.
 -     const int ExitCode() const { return myExitCode; }                           // You can ask for my ExitCode.
 - };
 - 
 - class RuntimeCheck : public std::runtime_error {                                // Throw if this check fails.
 - 
 -   public:
 - 
 -     RuntimeCheck(const std::string& Text) : std::runtime_error(Text) {}         // Construct me with a description.
 - 
 -     void operator()(bool X) const {                                             // Apply me like assert(exp)
 -         if(false == X) {                                                        // If the expression is false then we
 -             throw *this;                                                        // failed the check so we throw.
 -         }
 -     }
 - };
 - 
 - class RuntimeFault : public std::runtime_error {                                // Throw if we find this fault.
 - 
 -   public:
 - 
 -     RuntimeFault(const std::string& Text) : std::runtime_error(Text) {}         // Construct me with a description.
 - 
 -     void operator()(bool X) const {                                             // Apply me like assert(exp)
 -         if(true == X) {                                                         // If the expression is true then we
 -             throw *this;                                                        // found the fault so we throw.
 -         }
 -     }
 - };
 - 
 - class LogicCheck : public std::logic_error {                                    // Throw if this check fails.
 - 
 -   public:
 - 
 -     LogicCheck(const std::string& Text) : std::logic_error(Text) {}             // Construct me with a description.
 - 
 -     void operator()(bool X) const {                                             // Apply me like assert(exp)
 -         if(false == X) {                                                        // If the expression is false then we
 -             throw *this;                                                        // failed the check so we throw.
 -         }
 -     }
 - };
 - 
 - class LogicFault : public std::logic_error {                                    // Throw if we find this fault.
 - 
 -   public:
 - 
 -     LogicFault(const std::string& Text) : std::logic_error(Text) {}             // Construct me with a description.
 - 
 -     void operator()(bool X) const {                                             // Apply me like assert(exp)
 -         if(true == X) {                                                         // If the expression is true then we
 -             throw *this;                                                        // found the fault so we throw.
 -         }
 -     }
 - };
 - 
 - } // namespace CodeDweller.
 - 
 - #endif
 - 
 - // End Of Include MNR_faults Once Only =========================================
 
 
  |