/usr/include/cppdb/numeric_util.h is in libcppdb-dev 0.3.1+dfsg-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | ///////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2010-2011 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com>
//
// Distributed under:
//
// the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// or (at your opinion) under:
//
// The MIT License
// (See accompanying file MIT.txt or a copy at
// http://www.opensource.org/licenses/mit-license.php)
//
///////////////////////////////////////////////////////////////////////////////
#ifndef CPPDB_NUMERIC_UTIL_H
#define CPPDB_NUMERIC_UTIL_H
#include <cppdb/errors.h>
#include <string>
#include <sstream>
#include <limits>
#include <iomanip>
namespace cppdb {
///
/// Small utility functions for backends, accepts - source string and stringstream with imbued std::locale
/// it tries to case the value to T in best possible way.
///
/// For floating point string it casts it to the nearest ineger
///
template<typename T>
T parse_number(std::string const &s,std::istringstream &ss)
{
ss.clear();
ss.str(s);
if(s.find_first_of(".eEdD")!=std::string::npos) {
long double v;
ss >> v;
if(ss.fail() || !std::ws(ss).eof())
throw bad_value_cast();
#ifdef __BORLANDC__
#pragma warn -8008 // condition always true/false
#pragma warn -8066 // unreachable code
#endif
if(std::numeric_limits<T>::is_integer) {
if(v > std::numeric_limits<T>::max() || v < std::numeric_limits<T>::min())
throw bad_value_cast();
}
#ifdef __BORLANDC__
#pragma warn .8008
#pragma warn .8066
#endif
return static_cast<T>(v);
}
T v;
ss >> v;
if(ss.fail() || !std::ws(ss).eof())
throw bad_value_cast();
if( std::numeric_limits<T>::is_integer
&& !std::numeric_limits<T>::is_signed
&& s.find('-') != std::string::npos
&& v!=0)
{
throw bad_value_cast();
}
return v;
}
}
#endif
|