/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2017 Danny Robson */ #include "parse.hpp" #include "cast.hpp" #include #include using cruft::parse; /////////////////////////////////////////////////////////////////////////////// template struct c_traits; template <> struct c_traits { static constexpr auto func = strtol; }; template <> struct c_traits { static constexpr auto func = strtoll; }; template <> struct c_traits { static constexpr auto func = strtoul; }; template <> struct c_traits { static constexpr auto func = strtoull; }; template <> struct c_traits { static constexpr auto func = strtof; }; template <> struct c_traits { static constexpr auto func = strtod; }; template <> struct c_traits { static constexpr auto func = strtold; }; //----------------------------------------------------------------------------- template T c_iparse (const char *first, const char *last) { auto tail = const_cast (last); auto val = c_traits::func (first, &tail, 0); if (tail != last) throw std::invalid_argument ("unable to parse"); return val; } //----------------------------------------------------------------------------- template T c_fparse (const char *first, const char *last) { auto tail = const_cast (last); auto val = c_traits::func (first, &tail); if (tail != last) throw std::invalid_argument ("unable to parse"); return val; } /////////////////////////////////////////////////////////////////////////////// #define C_PARSE(T, KLASS) \ template <> \ T \ cruft::parse (cruft::view str) \ { \ return c_ ## KLASS ## parse (std::cbegin (str), std::cend (str)); \ } //----------------------------------------------------------------------------- C_PARSE(long, i) C_PARSE(long long, i) C_PARSE(unsigned long, i) C_PARSE(unsigned long long, i) C_PARSE(float, f) C_PARSE(double, f) C_PARSE(long double, f) template <> int cruft::parse (cruft::view str) { auto intermediate = cruft::parse (str); return cruft::cast::lossless (intermediate); } template <> unsigned cruft::parse (cruft::view str) { return cruft::cast::narrow (parse (str)); } template <> unsigned short cruft::parse (cruft::view str) { return cruft::cast::narrow (parse (str)); }