Skip to content

Commit c0888ac

Browse files
committed
feat:1.12.16, 添加ParseAs()系列函数
1 parent 4cf9355 commit c0888ac

File tree

6 files changed

+268
-1
lines changed

6 files changed

+268
-1
lines changed

modules/util/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ set(TBOX_UTIL_HEADERS
4848
fd.h
4949
scalable_integer.h
5050
variables.h
51+
parse_as.h
5152
)
5253

5354
set(TBOX_UTIL_SOURCES
@@ -69,6 +70,7 @@ set(TBOX_UTIL_SOURCES
6970
fd.cpp
7071
scalable_integer.cpp
7172
variables.cpp
73+
parse_as.cpp
7274
)
7375

7476
set(TBOX_UTIL_TEST_SOURCES
@@ -88,6 +90,7 @@ set(TBOX_UTIL_TEST_SOURCES
8890
fd_test.cpp
8991
scalable_integer_test.cpp
9092
variables_test.cpp
93+
parse_as_test.cpp
9194
)
9295

9396
add_library(${TBOX_LIBRARY_NAME} ${TBOX_BUILD_LIB_TYPE} ${TBOX_UTIL_SOURCES})

modules/util/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ HEAD_FILES = \
4343
fd.h \
4444
scalable_integer.h \
4545
variables.h \
46+
parse_as.h \
4647

4748
CPP_SRC_FILES = \
4849
pid_file.cpp \
@@ -63,6 +64,7 @@ CPP_SRC_FILES = \
6364
fd.cpp \
6465
scalable_integer.cpp \
6566
variables.cpp \
67+
parse_as.cpp \
6668

6769
CXXFLAGS := -DMODULE_ID='"tbox.util"' $(CXXFLAGS)
6870

@@ -85,6 +87,7 @@ TEST_CPP_SRC_FILES = \
8587
fd_test.cpp \
8688
scalable_integer_test.cpp \
8789
variables_test.cpp \
90+
parse_as_test.cpp \
8891

8992
TEST_LDFLAGS := $(LDFLAGS) -ltbox_base -ldl
9093

modules/util/parse_as.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/*
2+
* .============.
3+
* // M A K E / \
4+
* // C++ DEV / \
5+
* // E A S Y / \/ \
6+
* ++ ----------. \/\ .
7+
* \\ \ \ /\ /
8+
* \\ \ \ /
9+
* \\ \ \ /
10+
* -============'
11+
*
12+
* Copyright (c) 2025 Hevake and contributors, all rights reserved.
13+
*
14+
* This file is part of cpp-tbox (https://github.com/cpp-main/cpp-tbox)
15+
* Use of this source code is governed by MIT license that can be found
16+
* in the LICENSE file in the root of the source tree. All contributing
17+
* project authors may be found in the CONTRIBUTORS.md file in the root
18+
* of the source tree.
19+
*/
20+
21+
#include "parse_as.h"
22+
23+
#include <tbox/base/defines.h>
24+
#include "string.h"
25+
26+
namespace tbox {
27+
namespace util {
28+
29+
bool ParseAs(const std::string &text, bool &value)
30+
{
31+
const char *text_tbl[] = {
32+
"YES", "NO",
33+
"YEP", "NOPE",
34+
"Y", "N",
35+
"TRUE", "FALSE",
36+
"T", "F",
37+
"ON", "OFF",
38+
};
39+
40+
auto upper_text = string::ToUpper(text);
41+
for (size_t i = 0; i < NUMBER_OF_ARRAY(text_tbl); ++i) {
42+
if (upper_text == text_tbl[i]) {
43+
value = ((i & 1) == 0);
44+
return true;
45+
}
46+
}
47+
48+
return false;
49+
}
50+
51+
#define TO_NUMBER(func) \
52+
try { \
53+
value = func(text); \
54+
return true; \
55+
} catch (...) { \
56+
return false; \
57+
}\
58+
59+
#define TO_NUMBER_WITH_BASE(func) \
60+
try { \
61+
value = func(text, nullptr, base); \
62+
return true; \
63+
} catch (...) { \
64+
return false; \
65+
}\
66+
67+
bool ParseAs(const std::string &text, int &value, int base)
68+
{
69+
TO_NUMBER_WITH_BASE(std::stoi)
70+
}
71+
72+
bool ParseAs(const std::string &text, long &value, int base)
73+
{
74+
TO_NUMBER_WITH_BASE(std::stol)
75+
}
76+
77+
bool ParseAs(const std::string &text, long long &value, int base)
78+
{
79+
TO_NUMBER_WITH_BASE(std::stoll)
80+
}
81+
82+
bool ParseAs(const std::string &text, unsigned int &value, int base)
83+
{
84+
TO_NUMBER_WITH_BASE(std::stoul)
85+
}
86+
87+
bool ParseAs(const std::string &text, unsigned long &value, int base)
88+
{
89+
TO_NUMBER_WITH_BASE(std::stoul)
90+
}
91+
92+
bool ParseAs(const std::string &text, unsigned long long &value, int base)
93+
{
94+
TO_NUMBER_WITH_BASE(std::stoull)
95+
}
96+
97+
bool ParseAs(const std::string &text, float &value)
98+
{
99+
TO_NUMBER(std::stof)
100+
}
101+
102+
bool ParseAs(const std::string &text, double &value)
103+
{
104+
TO_NUMBER(std::stod)
105+
}
106+
107+
}
108+
}

modules/util/parse_as.h

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* .============.
3+
* // M A K E / \
4+
* // C++ DEV / \
5+
* // E A S Y / \/ \
6+
* ++ ----------. \/\ .
7+
* \\ \ \ /\ /
8+
* \\ \ \ /
9+
* \\ \ \ /
10+
* -============'
11+
*
12+
* Copyright (c) 2025 Hevake and contributors, all rights reserved.
13+
*
14+
* This file is part of cpp-tbox (https://github.com/cpp-main/cpp-tbox)
15+
* Use of this source code is governed by MIT license that can be found
16+
* in the LICENSE file in the root of the source tree. All contributing
17+
* project authors may be found in the CONTRIBUTORS.md file in the root
18+
* of the source tree.
19+
*/
20+
21+
/**
22+
* ParseAs() 系列函数用于将字串解析成对应类型的值,如bool, int, double 等
23+
* 返回true,表示解析成功,值将存在第二个引用参数里
24+
* 返回false,表示解析失败,第二个引用参数将不受影响
25+
*/
26+
#ifndef TBOX_UTIL_PARSE_AS_H_20250626
27+
#define TBOX_UTIL_PARSE_AS_H_20250626
28+
29+
#include <string>
30+
31+
namespace tbox {
32+
namespace util {
33+
34+
bool ParseAs(const std::string &text, bool &value); //! 解析bool值
35+
36+
bool ParseAs(const std::string &text, int &value, int base = 10); //! 解析int值
37+
bool ParseAs(const std::string &text, long &value, int base = 10); //! 解析long值
38+
bool ParseAs(const std::string &text, long long &value, int base = 10); //! 解析long long值
39+
bool ParseAs(const std::string &text, unsigned int &value, int base = 10); //! 解析unsigned int值
40+
bool ParseAs(const std::string &text, unsigned long &value, int base = 10); //! 解析unsigned long值
41+
bool ParseAs(const std::string &text, unsigned long long &value, int base = 10); //! 解析unsigned long long值
42+
43+
bool ParseAs(const std::string &text, float &value); //! 解析double值
44+
bool ParseAs(const std::string &text, double &value); //! 解析double值
45+
46+
}
47+
}
48+
49+
#endif //TBOX_UTIL_PARSE_AS_H_20250626

modules/util/parse_as_test.cpp

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
* .============.
3+
* // M A K E / \
4+
* // C++ DEV / \
5+
* // E A S Y / \/ \
6+
* ++ ----------. \/\ .
7+
* \\ \ \ /\ /
8+
* \\ \ \ /
9+
* \\ \ \ /
10+
* -============'
11+
*
12+
* Copyright (c) 2025 Hevake and contributors, all rights reserved.
13+
*
14+
* This file is part of cpp-tbox (https://github.com/cpp-main/cpp-tbox)
15+
* Use of this source code is governed by MIT license that can be found
16+
* in the LICENSE file in the root of the source tree. All contributing
17+
* project authors may be found in the CONTRIBUTORS.md file in the root
18+
* of the source tree.
19+
*/
20+
#include <gtest/gtest.h>
21+
#include "parse_as.h"
22+
23+
namespace tbox {
24+
namespace util {
25+
26+
TEST(ParseAs, Bool)
27+
{
28+
bool value = false;
29+
EXPECT_TRUE(ParseAs("yes", value));
30+
EXPECT_TRUE(value);
31+
32+
value = false;
33+
EXPECT_TRUE(ParseAs("y", value));
34+
EXPECT_TRUE(value);
35+
36+
value = false;
37+
EXPECT_TRUE(ParseAs("True", value));
38+
EXPECT_TRUE(value);
39+
40+
value = false;
41+
EXPECT_TRUE(ParseAs("On", value));
42+
EXPECT_TRUE(value);
43+
44+
value = true;
45+
EXPECT_TRUE(ParseAs("no", value));
46+
EXPECT_FALSE(value);
47+
48+
value = true;
49+
EXPECT_TRUE(ParseAs("N", value));
50+
EXPECT_FALSE(value);
51+
52+
value = true;
53+
EXPECT_TRUE(ParseAs("False", value));
54+
EXPECT_FALSE(value);
55+
56+
EXPECT_FALSE(ParseAs("", value));
57+
EXPECT_FALSE(ParseAs("A", value));
58+
EXPECT_FALSE(ParseAs("343", value));
59+
}
60+
61+
TEST(ParseAs, Int)
62+
{
63+
int value = -1;
64+
EXPECT_TRUE(ParseAs("-10", value));
65+
EXPECT_EQ(value, -10);
66+
67+
EXPECT_FALSE(ParseAs("", value));
68+
EXPECT_FALSE(ParseAs("A", value));
69+
EXPECT_FALSE(ParseAs("true", value));
70+
}
71+
72+
TEST(ParseAs, UnsignedInt)
73+
{
74+
unsigned int value = -1;
75+
EXPECT_TRUE(ParseAs("10", value));
76+
EXPECT_EQ(value, 10);
77+
78+
EXPECT_TRUE(ParseAs("-12", value));
79+
EXPECT_EQ(value, -12);
80+
81+
EXPECT_FALSE(ParseAs("", value));
82+
}
83+
84+
TEST(ParseAs, long)
85+
{
86+
long value = -1;
87+
EXPECT_TRUE(ParseAs("112233445566778899", value));
88+
EXPECT_EQ(value, 112233445566778899);
89+
90+
EXPECT_FALSE(ParseAs("", value));
91+
}
92+
93+
TEST(ParseAs, Double)
94+
{
95+
double value = -1;
96+
EXPECT_TRUE(ParseAs("10.123", value));
97+
EXPECT_DOUBLE_EQ(value, 10.123);
98+
99+
EXPECT_FALSE(ParseAs("", value));
100+
EXPECT_FALSE(ParseAs("A", value));
101+
}
102+
103+
}
104+
}

version.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@
2121
# TBOX版本号
2222
TBOX_VERSION_MAJOR := 1
2323
TBOX_VERSION_MINOR := 12
24-
TBOX_VERSION_REVISION := 15
24+
TBOX_VERSION_REVISION := 16

0 commit comments

Comments
 (0)