UdonLibrary
1.0.0
機械システム研究部 C++ ライブラリ
Toggle main menu visibility
読み取り中…
検索中…
一致する文字列を見つけられません
StringToNumberParser.hpp
[詳解]
1
//
2
// 文字列を数値に変換する
3
//
4
// Copyright (c) 2022 udonrobo
5
//
6
7
#pragma once
8
9
#include <
Udon/Traits/AlwaysFalse.hpp
>
10
#include <
Udon/Types/Optional.hpp
>
11
12
#include <string>
13
#include <stdlib.h>
14
15
namespace
Udon
16
{
17
18
namespace
StringToNumberParser
19
{
20
27
template
<
typename
T>
28
inline
Udon::Optional<T>
Parse
(
const
char
*
const
begin,
const
char
*
const
end,
const
int
radix)
29
{
30
static_assert
(
Traits::AlwaysFalse<T>::value
,
"T is not parsable."
);
31
}
32
33
template
<>
34
inline
Udon::Optional<long>
Parse<long>
(
const
char
*
const
begin,
const
char
*
const
end,
const
int
radix)
35
{
36
char
* endPtr =
nullptr
;
37
38
const
auto
result = strtol(begin, &endPtr, radix);
39
40
// Arduino nano では errno が定義されていないため、errno によるエラー判定は行わない
41
42
if
(endPtr == end)
43
{
44
return
result;
45
}
46
else
47
{
48
return
Udon::nullopt
;
49
}
50
}
51
52
template
<>
53
inline
Udon::Optional<int>
Parse<int>
(
const
char
*
const
begin,
const
char
*
const
end,
const
int
radix)
54
{
55
return
Parse<long>
(begin, end, radix);
56
}
57
58
template
<>
59
inline
Udon::Optional<double>
Parse<double>
(
const
char
*
const
begin,
const
char
*
const
end,
const
int
/*radix*/
)
60
{
61
char
* endPtr =
nullptr
;
62
63
const
auto
result = strtod(begin, &endPtr);
64
65
if
(endPtr == end)
66
{
67
return
result;
68
}
69
else
70
{
71
return
Udon::nullopt
;
72
}
73
}
74
75
template
<>
76
inline
Udon::Optional<float>
Parse<float>
(
const
char
*
const
begin,
const
char
*
const
end,
const
int
/*radix*/
)
77
{
78
char
* endPtr =
nullptr
;
79
80
#if defined(ARDUINO_AVR_NANO) || defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560)
81
82
// nano 系統にstrtofが定義されていなかった
83
const
float
result =
static_cast<
float
>
(strtod(begin, &endPtr));
84
85
#else
86
87
const
float
result = strtof(begin, &endPtr);
88
89
#endif
90
91
if
(endPtr == end)
92
{
93
return
result;
94
}
95
else
96
{
97
return
Udon::nullopt
;
98
}
99
}
100
101
}
// namespace StringToNumberParser
102
103
}
// namespace Udon
AlwaysFalse.hpp
Optional.hpp
Udon::Optional
オプショナル型
Definition
Optional.hpp:62
Udon::StringToNumberParser
Definition
StringToNumberParser.hpp:19
Udon::StringToNumberParser::Parse
Udon::Optional< T > Parse(const char *const begin, const char *const end, const int radix)
文字列を数値に変換する
Definition
StringToNumberParser.hpp:28
Udon::StringToNumberParser::Parse< int >
Udon::Optional< int > Parse< int >(const char *const begin, const char *const end, const int radix)
Definition
StringToNumberParser.hpp:53
Udon::StringToNumberParser::Parse< float >
Udon::Optional< float > Parse< float >(const char *const begin, const char *const end, const int)
Definition
StringToNumberParser.hpp:76
Udon::StringToNumberParser::Parse< long >
Udon::Optional< long > Parse< long >(const char *const begin, const char *const end, const int radix)
Definition
StringToNumberParser.hpp:34
Udon::StringToNumberParser::Parse< double >
Udon::Optional< double > Parse< double >(const char *const begin, const char *const end, const int)
Definition
StringToNumberParser.hpp:59
Udon
Definition
Bit.hpp:12
Udon::nullopt
constexpr NulloptT nullopt
無効値
Definition
Optional.hpp:52
Udon::Traits::AlwaysFalse
static_assert 失敗遅延用の型
Definition
AlwaysFalse.hpp:39