Blame lib/marisa/exception.h

Packit de3218
#ifndef MARISA_EXCEPTION_H_
Packit de3218
#define MARISA_EXCEPTION_H_
Packit de3218
Packit de3218
#include <exception>
Packit de3218
Packit de3218
#include "base.h"
Packit de3218
Packit de3218
namespace marisa {
Packit de3218
Packit de3218
// An exception object keeps a filename, a line number, an error code and an
Packit de3218
// error message. The message format is as follows:
Packit de3218
//  "__FILE__:__LINE__: error_code: error_message"
Packit de3218
class Exception : public std::exception {
Packit de3218
 public:
Packit de3218
  Exception(const char *filename, int line,
Packit de3218
      ErrorCode error_code, const char *error_message)
Packit de3218
      : std::exception(), filename_(filename), line_(line),
Packit de3218
        error_code_(error_code), error_message_(error_message) {}
Packit de3218
  Exception(const Exception &ex)
Packit de3218
      : std::exception(), filename_(ex.filename_), line_(ex.line_),
Packit de3218
        error_code_(ex.error_code_), error_message_(ex.error_message_) {}
Packit de3218
  virtual ~Exception() throw() {}
Packit de3218
Packit de3218
  Exception &operator=(const Exception &rhs) {
Packit de3218
    filename_ = rhs.filename_;
Packit de3218
    line_ = rhs.line_;
Packit de3218
    error_code_ = rhs.error_code_;
Packit de3218
    error_message_ = rhs.error_message_;
Packit de3218
    return *this;
Packit de3218
  }
Packit de3218
Packit de3218
  const char *filename() const {
Packit de3218
    return filename_;
Packit de3218
  }
Packit de3218
  int line() const {
Packit de3218
    return line_;
Packit de3218
  }
Packit de3218
  ErrorCode error_code() const {
Packit de3218
    return error_code_;
Packit de3218
  }
Packit de3218
  const char *error_message() const {
Packit de3218
    return error_message_;
Packit de3218
  }
Packit de3218
Packit de3218
  virtual const char *what() const throw() {
Packit de3218
    return error_message_;
Packit de3218
  }
Packit de3218
Packit de3218
 private:
Packit de3218
  const char *filename_;
Packit de3218
  int line_;
Packit de3218
  ErrorCode error_code_;
Packit de3218
  const char *error_message_;
Packit de3218
};
Packit de3218
Packit de3218
// These macros are used to convert a line number to a string constant.
Packit de3218
#define MARISA_INT_TO_STR(value) #value
Packit de3218
#define MARISA_LINE_TO_STR(line) MARISA_INT_TO_STR(line)
Packit de3218
#define MARISA_LINE_STR MARISA_LINE_TO_STR(__LINE__)
Packit de3218
Packit de3218
// MARISA_THROW throws an exception with a filename, a line number, an error
Packit de3218
// code and an error message. The message format is as follows:
Packit de3218
//  "__FILE__:__LINE__: error_code: error_message"
Packit de3218
#define MARISA_THROW(error_code, error_message) \
Packit de3218
  (throw marisa::Exception(__FILE__, __LINE__, error_code, \
Packit de3218
       __FILE__ ":" MARISA_LINE_STR ": " #error_code ": " error_message))
Packit de3218
Packit de3218
// MARISA_THROW_IF throws an exception if `condition' is true.
Packit de3218
#define MARISA_THROW_IF(condition, error_code) \
Packit de3218
  (void)((!(condition)) || (MARISA_THROW(error_code, #condition), 0))
Packit de3218
Packit de3218
// MARISA_DEBUG_IF is ignored if _DEBUG is undefined. So, it is useful for
Packit de3218
// debugging time-critical codes.
Packit de3218
#ifdef _DEBUG
Packit de3218
 #define MARISA_DEBUG_IF(cond, error_code) MARISA_THROW_IF(cond, error_code)
Packit de3218
#else
Packit de3218
 #define MARISA_DEBUG_IF(cond, error_code)
Packit de3218
#endif
Packit de3218
Packit de3218
}  // namespace marisa
Packit de3218
Packit de3218
#endif  // MARISA_EXCEPTION_H_