From 8351163e09a992209f7cd70f1c5f7c1da21eedbb Mon Sep 17 00:00:00 2001 From: johanengelen Date: Sat, 17 Nov 2007 23:06:41 +0000 Subject: [PATCH] 2geom: splice exceptions code from utils.h into exception.h --- src/2geom/Makefile_insert | 1 + src/2geom/basic-intersection.cpp | 1 + src/2geom/exception.h | 119 +++++++++++++++++++++++++++++++ src/2geom/path.cpp | 10 +-- src/2geom/path.h | 9 +-- src/2geom/sbasis.h | 2 +- src/2geom/svg-path-parser.h | 7 +- src/2geom/utils.h | 67 ----------------- 8 files changed, 130 insertions(+), 86 deletions(-) create mode 100644 src/2geom/exception.h diff --git a/src/2geom/Makefile_insert b/src/2geom/Makefile_insert index d10b18764..fd2de092c 100644 --- a/src/2geom/Makefile_insert +++ b/src/2geom/Makefile_insert @@ -26,6 +26,7 @@ 2geom/d2-sbasis.cpp \ 2geom/d2-sbasis.h \ 2geom/d2.h \ + 2geom/exception.h \ 2geom/geom.cpp \ 2geom/geom.h \ 2geom/interval.h \ diff --git a/src/2geom/basic-intersection.cpp b/src/2geom/basic-intersection.cpp index ee1244a73..28b3c6f20 100644 --- a/src/2geom/basic-intersection.cpp +++ b/src/2geom/basic-intersection.cpp @@ -1,4 +1,5 @@ #include "basic-intersection.h" +#include "exception.h" unsigned intersect_steps = 0; diff --git a/src/2geom/exception.h b/src/2geom/exception.h new file mode 100644 index 000000000..bd950726f --- /dev/null +++ b/src/2geom/exception.h @@ -0,0 +1,119 @@ +#ifndef LIB2GEOM_EXCEPTION_HEADER +#define LIB2GEOM_EXCEPTION_HEADER + +/** Defines the different types of exceptions that 2geom can throw. + * + * Copyright 2007 Johan Engelen + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#include +#include + +namespace Geom { + +// Base exception class, all 2geom exceptions should be derrived from this one. +class Exception : public std::exception { +public: + Exception(const char * message, const char *file, const int line) + : msgstr("Exception thrown: ") + { + msgstr += message; + msgstr += " ("; + msgstr += file; + msgstr += ":"; + msgstr += line; + msgstr += ")"; + } + + virtual ~Exception() throw() {} // necessary to destroy the string object!!! + + virtual const char * what() const throw (){ + return msgstr.c_str(); + } +protected: + std::string msgstr; +}; + +//----------------------------------------------------------------------- +// Two main exception classes: LogicalError and RangeError. +// Logical errors are 2geom faults/bugs, RangeErrors are 'user' faults. +// This way, the 'user' can distinguish between groups of exceptions +// ('user' is the coder that uses lib2geom) +class LogicalError : public Exception { +public: + LogicalError(const char * message, const char *file, const int line) + : Exception(message, file, line) {} +}; +#define throwLogicalError(message) throw(LogicalError(message, __FILE__, __LINE__)) + +class RangeError : public Exception { +public: + RangeError(const char * message, const char *file, const int line) + : Exception(message, file, line) {} +}; +#define throwRangeError(message) throw(RangeError(message, __FILE__, __LINE__)) + +//----------------------------------------------------------------------- +// Special case exceptions. Best used with the defines :) + +class NotImplemented : public LogicalError { +public: + NotImplemented(const char *file, const int line) + : LogicalError("Method not implemented", file, line) {} +}; +#define throwNotImplemented(i) throw(NotImplemented(__FILE__, __LINE__)) + +class InvariantsViolation : public LogicalError { +public: + InvariantsViolation(const char *file, const int line) + : LogicalError("Invariants violation", file, line) {} +}; +#define throwInvariantsViolation(i) throw(InvariantsViolation(__FILE__, __LINE__)) +#define assert_invariants(e) ((e) ? (void)0 : throwInvariantsViolation()) + +class NotInvertible : public RangeError { +public: + NotInvertible(const char *file, const int line) + : RangeError("Function does not have a unique inverse", file, line) {} +}; +#define throwNotInvertible(i) throw(NotInvertible(__FILE__, __LINE__)) + +class ContinuityError : public RangeError { +public: + ContinuityError(const char *file, const int line) + : RangeError("Non-contiguous path", file, line) {} +}; +#define throwContinuityError(i) throw(ContinuityError(__FILE__, __LINE__)) + +struct SVGPathParseError : public std::exception { + char const *what() const throw() { return "parse error"; } +}; + + +} // namespace Geom + +#endif diff --git a/src/2geom/path.cpp b/src/2geom/path.cpp index ba6643ae4..3d8d5ead3 100644 --- a/src/2geom/path.cpp +++ b/src/2geom/path.cpp @@ -145,7 +145,7 @@ const double eps = .1; void Path::append(Curve const &curve) { if ( curves_.front() != final_ && !are_near(curve.initialPoint(), (*final_)[0], eps) ) { - throw ContinuityError(); + throwContinuityError(); } do_append(curve.duplicate()); } @@ -154,7 +154,7 @@ void Path::append(D2 const &curve) { if ( curves_.front() != final_ ) { for ( int i = 0 ; i < 2 ; ++i ) { if ( !are_near(curve[i][0][0], (*final_)[0][i], eps) ) { - throw ContinuityError(); + throwContinuityError(); } } } @@ -206,17 +206,17 @@ void Path::check_continuity(Sequence::iterator first_replaced, if ( first != last ) { if ( first_replaced != curves_.begin() ) { if ( !are_near( (*first_replaced)->initialPoint(), (*first)->initialPoint(), eps ) ) { - throw ContinuityError(); + throwContinuityError(); } } if ( last_replaced != (curves_.end()-1) ) { if ( !are_near( (*(last_replaced-1))->finalPoint(), (*(last-1))->finalPoint(), eps ) ) { - throw ContinuityError(); + throwContinuityError(); } } } else if ( first_replaced != last_replaced && first_replaced != curves_.begin() && last_replaced != curves_.end()-1) { if ( !are_near((*first_replaced)->initialPoint(), (*(last_replaced-1))->finalPoint(), eps ) ) { - throw ContinuityError(); + throwContinuityError(); } } } diff --git a/src/2geom/path.h b/src/2geom/path.h index 053bc06c9..988babe3e 100644 --- a/src/2geom/path.h +++ b/src/2geom/path.h @@ -33,8 +33,7 @@ #include "point.h" #include #include -#include -#include +#include "exception.h" #include "d2.h" #include "matrix.h" #include "bezier.h" @@ -411,12 +410,6 @@ private: Iterator impl_; }; -class ContinuityError : public std::runtime_error { -public: - ContinuityError() : runtime_error("non-contiguous path") {} - ContinuityError(std::string const &message) : runtime_error(message) {} -}; - class Path { private: typedef std::vector Sequence; diff --git a/src/2geom/sbasis.h b/src/2geom/sbasis.h index df41dca58..acaa190a6 100644 --- a/src/2geom/sbasis.h +++ b/src/2geom/sbasis.h @@ -40,6 +40,7 @@ #include "linear.h" #include "interval.h" #include "utils.h" +#include "exception.h" namespace Geom { @@ -107,7 +108,6 @@ public: std::vector valueAndDerivatives(double /*t*/, unsigned /*n*/) const { //TODO throwNotImplemented(); - //throw(NotImplemented(__FILE__, __LINE__)); } SBasis toSBasis() const { return SBasis(*this); } diff --git a/src/2geom/svg-path-parser.h b/src/2geom/svg-path-parser.h index 4017df458..98a885361 100644 --- a/src/2geom/svg-path-parser.h +++ b/src/2geom/svg-path-parser.h @@ -34,16 +34,13 @@ #include #include -#include +#include +#include "exception.h" #include "point.h" #include "svg-path.h" namespace Geom { -struct SVGPathParseError : public std::exception { - char const *what() const throw() { return "parse error"; } -}; - void parse_svg_path(char const *str, SVGPathSink &sink) throw(SVGPathParseError); inline std::vector parse_svg_path(char const *str) throw(SVGPathParseError) { diff --git a/src/2geom/utils.h b/src/2geom/utils.h index cd2a9c26c..c5c579338 100644 --- a/src/2geom/utils.h +++ b/src/2geom/utils.h @@ -32,76 +32,9 @@ */ #include -#include namespace Geom { - -//####################################################################### -// Base exception class, all 2geom exceptions should be derrived from this one. -class Exception : public std::exception { -public: - Exception(const char * message, const char *file, const int line) { - msgstr = "Exception thrown: "; - msgstr += message; - msgstr += " ("; - msgstr += file; - msgstr += ":"; - msgstr += line; - msgstr += ")"; - }; - virtual ~Exception() throw() {}; // necessary to destroy the string object!!! - virtual const char * what() const throw () { return msgstr.c_str(); } -protected: - std::string msgstr; -}; - -//----------------------------------------------------------------------- -// Two main exception classes: LogicalError and RangeError. -// Logical errors are 2geom faults/bugs, RangeErrors are 'user' faults. -// This way, the 'user' can distinguish between groups of exceptions -// ('user' is the coder that uses lib2geom) -class LogicalError : public Exception { -public: - LogicalError(const char * message, const char *file, const int line) - : Exception(message, file, line) {}; -}; -#define throwLogicalError(message) throw(LogicalError(message, __FILE__, __LINE__)) - -class RangeError : public Exception { -public: - RangeError(const char * message, const char *file, const int line) - : Exception(message, file, line) {}; -}; -#define throwRangeError(message) throw(RangeError(message, __FILE__, __LINE__)) - -//----------------------------------------------------------------------- -// Special case exceptions. Best used with the defines :) - -class NotImplemented : public LogicalError { -public: - NotImplemented(const char *file, const int line) - : LogicalError("Method not implemented", file, line) {}; -}; -#define throwNotImplemented(i) throw(NotImplemented(__FILE__, __LINE__)) - -class InvariantsViolation : public LogicalError { -public: - InvariantsViolation(const char *file, const int line) - : LogicalError("Invariants violation", file, line) {}; -}; -#define throwInvariantsViolation(i) throw(InvariantsViolation(__FILE__, __LINE__)) -#define assert_invariants(e) ((e) ? (void)0 : throwInvariantsViolation()) - -class NotInvertible : public RangeError { -public: - NotInvertible(const char *file, const int line) - : RangeError("Function does not have a unique inverse", file, line) {}; -}; -#define throwNotInvertible(i) throw(NotInvertible(__FILE__, __LINE__)) - -//####################################################################### - // proper logical xor inline bool logical_xor (bool a, bool b) { return (a || b) && !(a && b); } -- 2.30.2