diff options
Diffstat (limited to 'include/qpdf/QIntC.hh')
-rw-r--r-- | include/qpdf/QIntC.hh | 140 |
1 files changed, 71 insertions, 69 deletions
diff --git a/include/qpdf/QIntC.hh b/include/qpdf/QIntC.hh index 484bae1a..ce2f47e9 100644 --- a/include/qpdf/QIntC.hh +++ b/include/qpdf/QIntC.hh @@ -24,12 +24,12 @@ #include <qpdf/DLL.h> #include <qpdf/Types.h> -#include <stdexcept> +#include <cassert> #include <iostream> #include <limits> -#include <sstream> -#include <cassert> #include <locale> +#include <sstream> +#include <stdexcept> #include <type_traits> // This namespace provides safe integer conversion that detects @@ -51,9 +51,11 @@ namespace QIntC // QIntC = qpdf Integer Conversion // throws a range_error otherwise. This class is specialized for // each permutation of signed/unsigned for the From and To // classes. - template <typename From, typename To, - bool From_signed = std::numeric_limits<From>::is_signed, - bool To_signed = std::numeric_limits<To>::is_signed> + template < + typename From, + typename To, + bool From_signed = std::numeric_limits<From>::is_signed, + bool To_signed = std::numeric_limits<To>::is_signed> class IntConverter { }; @@ -62,17 +64,16 @@ namespace QIntC // QIntC = qpdf Integer Conversion class IntConverter<From, To, false, false> { public: - static To convert(From const& i) + static To + convert(From const& i) { // From and To are both unsigned. - if (i > std::numeric_limits<To>::max()) - { + if (i > std::numeric_limits<To>::max()) { std::ostringstream msg; msg.imbue(std::locale::classic()); - msg << "integer out of range converting " << i - << " from a " - << sizeof(From) << "-byte unsigned type to a " - << sizeof(To) << "-byte unsigned type"; + msg << "integer out of range converting " << i << " from a " + << sizeof(From) << "-byte unsigned type to a " << sizeof(To) + << "-byte unsigned type"; throw std::range_error(msg.str()); } return static_cast<To>(i); @@ -83,18 +84,17 @@ namespace QIntC // QIntC = qpdf Integer Conversion class IntConverter<From, To, true, true> { public: - static To convert(From const& i) + static To + convert(From const& i) { // From and To are both signed. if ((i < std::numeric_limits<To>::min()) || - (i > std::numeric_limits<To>::max())) - { + (i > std::numeric_limits<To>::max())) { std::ostringstream msg; msg.imbue(std::locale::classic()); - msg << "integer out of range converting " << i - << " from a " - << sizeof(From) << "-byte signed type to a " - << sizeof(To) << "-byte signed type"; + msg << "integer out of range converting " << i << " from a " + << sizeof(From) << "-byte signed type to a " << sizeof(To) + << "-byte signed type"; throw std::range_error(msg.str()); } return static_cast<To>(i); @@ -105,20 +105,19 @@ namespace QIntC // QIntC = qpdf Integer Conversion class IntConverter<From, To, true, false> { public: - static To convert(From const& i) + static To + convert(From const& i) { // From is signed, and To is unsigned. If i > 0, it's safe to // convert it to the corresponding unsigned type and to // compare with To's max. auto ii = static_cast<typename to_u<From>::type>(i); - if ((i < 0) || (ii > std::numeric_limits<To>::max())) - { + if ((i < 0) || (ii > std::numeric_limits<To>::max())) { std::ostringstream msg; msg.imbue(std::locale::classic()); - msg << "integer out of range converting " << i - << " from a " - << sizeof(From) << "-byte signed type to a " - << sizeof(To) << "-byte unsigned type"; + msg << "integer out of range converting " << i << " from a " + << sizeof(From) << "-byte signed type to a " << sizeof(To) + << "-byte unsigned type"; throw std::range_error(msg.str()); } return static_cast<To>(i); @@ -129,20 +128,19 @@ namespace QIntC // QIntC = qpdf Integer Conversion class IntConverter<From, To, false, true> { public: - static To convert(From const& i) + static To + convert(From const& i) { // From is unsigned, and to is signed. Convert To's max to the // unsigned version of To and compare i against that. auto maxval = static_cast<typename to_u<To>::type>( std::numeric_limits<To>::max()); - if (i > maxval) - { + if (i > maxval) { std::ostringstream msg; msg.imbue(std::locale::classic()); - msg << "integer out of range converting " << i - << " from a " - << sizeof(From) << "-byte unsigned type to a " - << sizeof(To) << "-byte signed type"; + msg << "integer out of range converting " << i << " from a " + << sizeof(From) << "-byte unsigned type to a " << sizeof(To) + << "-byte signed type"; throw std::range_error(msg.str()); } return static_cast<To>(i); @@ -152,97 +150,105 @@ namespace QIntC // QIntC = qpdf Integer Conversion // Specific converters. The return type of each function must match // the second template parameter to IntConverter. template <typename T> - char to_char(T const& i) + char + to_char(T const& i) { return IntConverter<T, char>::convert(i); } template <typename T> - unsigned char to_uchar(T const& i) + unsigned char + to_uchar(T const& i) { return IntConverter<T, unsigned char>::convert(i); } template <typename T> - short to_short(T const& i) + short + to_short(T const& i) { return IntConverter<T, short>::convert(i); } template <typename T> - unsigned short to_ushort(T const& i) + unsigned short + to_ushort(T const& i) { return IntConverter<T, unsigned short>::convert(i); } template <typename T> - int to_int(T const& i) + int + to_int(T const& i) { return IntConverter<T, int>::convert(i); } template <typename T> - unsigned int to_uint(T const& i) + unsigned int + to_uint(T const& i) { return IntConverter<T, unsigned int>::convert(i); } template <typename T> - size_t to_size(T const& i) + size_t + to_size(T const& i) { return IntConverter<T, size_t>::convert(i); } template <typename T> - qpdf_offset_t to_offset(T const& i) + qpdf_offset_t + to_offset(T const& i) { return IntConverter<T, qpdf_offset_t>::convert(i); } template <typename T> - long to_long(T const& i) + long + to_long(T const& i) { - return IntConverter<T, long >::convert(i); + return IntConverter<T, long>::convert(i); } template <typename T> - unsigned long to_ulong(T const& i) + unsigned long + to_ulong(T const& i) { - return IntConverter<T, unsigned long >::convert(i); + return IntConverter<T, unsigned long>::convert(i); } template <typename T> - long long to_longlong(T const& i) + long long + to_longlong(T const& i) { return IntConverter<T, long long>::convert(i); } template <typename T> - unsigned long long to_ulonglong(T const& i) + unsigned long long + to_ulonglong(T const& i) { return IntConverter<T, unsigned long long>::convert(i); } template <typename T> - void range_check(T const& cur, T const& delta) + void + range_check(T const& cur, T const& delta) { - if ((delta > 0) != (cur > 0)) - { + if ((delta > 0) != (cur > 0)) { return; } - if ((delta > 0) && - ((std::numeric_limits<T>::max() - cur) < delta)) - { + if ((delta > 0) && ((std::numeric_limits<T>::max() - cur) < delta)) { std::ostringstream msg; msg.imbue(std::locale::classic()); msg << "adding " << delta << " to " << cur << " would cause an integer overflow"; throw std::range_error(msg.str()); - } - else if ((delta < 0) && - ((std::numeric_limits<T>::min() - cur) > delta)) - { + } else if ( + (delta < 0) && ((std::numeric_limits<T>::min() - cur) > delta)) { std::ostringstream msg; msg.imbue(std::locale::classic()); msg << "adding " << delta << " to " << cur @@ -252,25 +258,21 @@ namespace QIntC // QIntC = qpdf Integer Conversion } template <typename T> - void range_check_substract(T const& cur, T const& delta) + void + range_check_substract(T const& cur, T const& delta) { - if ((delta >= 0) == (cur >= 0)) - { + if ((delta >= 0) == (cur >= 0)) { return; } - if ((delta > 0) && - ((std::numeric_limits<T>::min() + delta) > cur)) - { + if ((delta > 0) && ((std::numeric_limits<T>::min() + delta) > cur)) { std::ostringstream msg; msg.imbue(std::locale::classic()); msg << "subtracting " << delta << " from " << cur << " would cause an integer underflow"; throw std::range_error(msg.str()); - } - else if ((delta < 0) && - ((std::numeric_limits<T>::max() + delta) < cur)) - { + } else if ( + (delta < 0) && ((std::numeric_limits<T>::max() + delta) < cur)) { std::ostringstream msg; msg.imbue(std::locale::classic()); msg << "subtracting " << delta << " from " << cur @@ -278,6 +280,6 @@ namespace QIntC // QIntC = qpdf Integer Conversion throw std::range_error(msg.str()); } } -}; +}; // namespace QIntC #endif // QINTC_HH |