nmealib 0.0.4
NMEA 0183/NMEA 2000 parsing library
Loading...
Searching...
No Matches
parse.h
Go to the documentation of this file.
1#pragma once
2
3#include <charconv>
4#include <cerrno>
5#include <cmath>
6#include <cstdlib>
7#include <limits>
8#include <string>
9#include <type_traits>
10
11namespace nmealib {
12namespace detail {
13
14template<typename T>
15bool parseUnsigned(const std::string& text, T& value, int base = 10) noexcept {
16 static_assert(std::is_integral_v<T> && std::is_unsigned_v<T>);
17
18 if (text.empty()) {
19 return false;
20 }
21
22 T parsed{};
23 const char* begin = text.data();
24 const char* end = text.data() + text.size();
25 const auto result = std::from_chars(begin, end, parsed, base);
26 if (result.ec != std::errc() || result.ptr != end) {
27 return false;
28 }
29
30 value = parsed;
31 return true;
32}
33
34template<typename T>
35bool parseSigned(const std::string& text, T& value, int base = 10) noexcept {
36 static_assert(std::is_integral_v<T> && std::is_signed_v<T>);
37
38 if (text.empty()) {
39 return false;
40 }
41
42 T parsed{};
43 const char* begin = text.data();
44 const char* end = text.data() + text.size();
45 const auto result = std::from_chars(begin, end, parsed, base);
46 if (result.ec != std::errc() || result.ptr != end) {
47 return false;
48 }
49
50 value = parsed;
51 return true;
52}
53
54inline bool parseDouble(const std::string& text, double& value) noexcept {
55 if (text.empty()) {
56 return false;
57 }
58
59 char* end = nullptr;
60 errno = 0;
61 const double parsed = std::strtod(text.c_str(), &end);
62 if (errno == ERANGE || end != text.c_str() + text.size()) {
63 return false;
64 }
65
66 value = parsed;
67 return true;
68}
69
70inline bool parseLongDouble(const std::string& text, long double& value) noexcept {
71 if (text.empty()) {
72 return false;
73 }
74
75 char* end = nullptr;
76 errno = 0;
77 const long double parsed = std::strtold(text.c_str(), &end);
78 if (errno == ERANGE || end != text.c_str() + text.size()) {
79 return false;
80 }
81
82 value = parsed;
83 return true;
84}
85
86inline bool parseOptionalDouble(const std::string& text, double& value) noexcept {
87 if (text.empty()) {
88 value = 0.0;
89 return true;
90 }
91 return parseDouble(text, value);
92}
93
94inline bool parseOptionalLongDouble(const std::string& text, long double& value) noexcept {
95 if (text.empty()) {
96 value = 0.0L;
97 return true;
98 }
99 return parseLongDouble(text, value);
100}
101
102inline bool parseOptionalUnsigned(const std::string& text, unsigned int& value) noexcept {
103 if (text.empty()) {
104 value = 0U;
105 return true;
106 }
107 return parseUnsigned(text, value);
108}
109
110inline bool parseOptionalInt(const std::string& text, int& value) noexcept {
111 if (text.empty()) {
112 value = 0;
113 return true;
114 }
115 return parseSigned(text, value);
116}
117
118inline bool parseNmeaCoordinate(const std::string& text, double& value) noexcept {
119 if (text.empty()) {
120 value = 0.0;
121 return true;
122 }
123
124 long double raw = 0.0L;
125 if (!parseLongDouble(text, raw)) {
126 return false;
127 }
128
129 const long double degrees = std::floor(raw / 100.0L);
130 const long double minutes = raw - (degrees * 100.0L);
131 value = static_cast<double>(degrees + (minutes / 60.0L));
132 return true;
133}
134
135} // namespace detail
136} // namespace nmealib
bool parseLongDouble(const std::string &text, long double &value) noexcept
Definition parse.h:70
bool parseNmeaCoordinate(const std::string &text, double &value) noexcept
Definition parse.h:118
bool parseDouble(const std::string &text, double &value) noexcept
Definition parse.h:54
bool parseOptionalInt(const std::string &text, int &value) noexcept
Definition parse.h:110
bool parseUnsigned(const std::string &text, T &value, int base=10) noexcept
Definition parse.h:15
bool parseOptionalUnsigned(const std::string &text, unsigned int &value) noexcept
Definition parse.h:102
bool parseOptionalLongDouble(const std::string &text, long double &value) noexcept
Definition parse.h:94
bool parseOptionalDouble(const std::string &text, double &value) noexcept
Definition parse.h:86
bool parseSigned(const std::string &text, T &value, int base=10) noexcept
Definition parse.h:35