Skip to content

Commit df3fa2e

Browse files
authored
Merge pull request #1717 from evoskuil/master
Add ascii alpha utils and tests.
2 parents 98cacd6 + 5e6589f commit df3fa2e

File tree

7 files changed

+188
-61
lines changed

7 files changed

+188
-61
lines changed

Makefile.am

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,10 @@ include_bitcoin_system_impl_stream_streamers_HEADERS = \
742742
include/bitcoin/system/impl/stream/streamers/sha256t_writer.ipp \
743743
include/bitcoin/system/impl/stream/streamers/sha256x2_writer.ipp
744744

745+
include_bitcoin_system_impl_unicodedir = ${includedir}/bitcoin/system/impl/unicode
746+
include_bitcoin_system_impl_unicode_HEADERS = \
747+
include/bitcoin/system/impl/unicode/ascii.ipp
748+
745749
include_bitcoin_system_impl_wallet_addressesdir = ${includedir}/bitcoin/system/impl/wallet/addresses
746750
include_bitcoin_system_impl_wallet_addresses_HEADERS = \
747751
include/bitcoin/system/impl/wallet/addresses/checked.ipp

builds/msvc/vs2022/libbitcoin-system/libbitcoin-system.vcxproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,7 @@
675675
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\sha256_writer.ipp" />
676676
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\sha256t_writer.ipp" />
677677
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\sha256x2_writer.ipp" />
678+
<None Include="..\..\..\..\include\bitcoin\system\impl\unicode\ascii.ipp" />
678679
<None Include="..\..\..\..\include\bitcoin\system\impl\wallet\addresses\checked.ipp" />
679680
<None Include="..\..\..\..\include\bitcoin\system\impl\words\dictionaries.ipp" />
680681
<None Include="..\..\..\..\include\bitcoin\system\impl\words\dictionary.ipp" />
@@ -709,4 +710,4 @@
709710
<ItemGroup>
710711
<Natvis Include="..\..\debug.natvis" />
711712
</ItemGroup>
712-
</Project>
713+
</Project>

builds/msvc/vs2022/libbitcoin-system/libbitcoin-system.vcxproj.filters

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@
6868
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000007}</UniqueIdentifier>
6969
</Filter>
7070
<Filter Include="include\bitcoin\system\impl\hash\rmd">
71-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000C3}</UniqueIdentifier>
71+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000D3}</UniqueIdentifier>
7272
</Filter>
7373
<Filter Include="include\bitcoin\system\impl\hash\sha">
74-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000D3}</UniqueIdentifier>
74+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000E3}</UniqueIdentifier>
7575
</Filter>
7676
<Filter Include="include\bitcoin\system\impl\machine">
7777
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000008}</UniqueIdentifier>
@@ -89,34 +89,37 @@
8989
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000012}</UniqueIdentifier>
9090
</Filter>
9191
<Filter Include="include\bitcoin\system\impl\stream\iostream">
92-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000E3}</UniqueIdentifier>
92+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000F3}</UniqueIdentifier>
9393
</Filter>
9494
<Filter Include="include\bitcoin\system\impl\stream\streamers">
95-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000F3}</UniqueIdentifier>
95+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000004}</UniqueIdentifier>
9696
</Filter>
97-
<Filter Include="include\bitcoin\system\impl\wallet">
97+
<Filter Include="include\bitcoin\system\impl\unicode">
9898
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000A3}</UniqueIdentifier>
9999
</Filter>
100+
<Filter Include="include\bitcoin\system\impl\wallet">
101+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000B3}</UniqueIdentifier>
102+
</Filter>
100103
<Filter Include="include\bitcoin\system\impl\wallet\addresses">
101-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000004}</UniqueIdentifier>
104+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000005}</UniqueIdentifier>
102105
</Filter>
103106
<Filter Include="include\bitcoin\system\impl\words">
104-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000B3}</UniqueIdentifier>
107+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000C3}</UniqueIdentifier>
105108
</Filter>
106109
<Filter Include="include\bitcoin\system\intrinsics">
107110
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000006}</UniqueIdentifier>
108111
</Filter>
109112
<Filter Include="include\bitcoin\system\intrinsics\intel">
110-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000005}</UniqueIdentifier>
113+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000006}</UniqueIdentifier>
111114
</Filter>
112115
<Filter Include="include\bitcoin\system\intrinsics\neon">
113-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000006}</UniqueIdentifier>
116+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000007}</UniqueIdentifier>
114117
</Filter>
115118
<Filter Include="include\bitcoin\system\intrinsics\none">
116-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000007}</UniqueIdentifier>
119+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000008}</UniqueIdentifier>
117120
</Filter>
118121
<Filter Include="include\bitcoin\system\intrinsics\sve">
119-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000008}</UniqueIdentifier>
122+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000009}</UniqueIdentifier>
120123
</Filter>
121124
<Filter Include="include\bitcoin\system\machine">
122125
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000007}</UniqueIdentifier>
@@ -134,43 +137,43 @@
134137
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000011}</UniqueIdentifier>
135138
</Filter>
136139
<Filter Include="include\bitcoin\system\stream\devices">
137-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000009}</UniqueIdentifier>
140+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000010}</UniqueIdentifier>
138141
</Filter>
139142
<Filter Include="include\bitcoin\system\stream\iostream">
140-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000010}</UniqueIdentifier>
143+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000011}</UniqueIdentifier>
141144
</Filter>
142145
<Filter Include="include\bitcoin\system\stream\streamers">
143-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000011}</UniqueIdentifier>
146+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000012}</UniqueIdentifier>
144147
</Filter>
145148
<Filter Include="include\bitcoin\system\stream\streamers\interfaces">
146-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000012}</UniqueIdentifier>
149+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000013}</UniqueIdentifier>
147150
</Filter>
148151
<Filter Include="include\bitcoin\system\unicode">
149152
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000A2}</UniqueIdentifier>
150153
</Filter>
151154
<Filter Include="include\bitcoin\system\unicode\utf8_everywhere">
152-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000013}</UniqueIdentifier>
155+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000A4}</UniqueIdentifier>
153156
</Filter>
154157
<Filter Include="include\bitcoin\system\wallet">
155158
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000B2}</UniqueIdentifier>
156159
</Filter>
157160
<Filter Include="include\bitcoin\system\wallet\addresses">
158-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000A4}</UniqueIdentifier>
161+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000B4}</UniqueIdentifier>
159162
</Filter>
160163
<Filter Include="include\bitcoin\system\wallet\keys">
161-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000B4}</UniqueIdentifier>
164+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000C4}</UniqueIdentifier>
162165
</Filter>
163166
<Filter Include="include\bitcoin\system\wallet\mnemonics">
164-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000C4}</UniqueIdentifier>
167+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000D4}</UniqueIdentifier>
165168
</Filter>
166169
<Filter Include="include\bitcoin\system\words">
167170
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000C2}</UniqueIdentifier>
168171
</Filter>
169172
<Filter Include="include\bitcoin\system\words\catalogs">
170-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000D4}</UniqueIdentifier>
173+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000E4}</UniqueIdentifier>
171174
</Filter>
172175
<Filter Include="resource">
173-
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000E4}</UniqueIdentifier>
176+
<UniqueIdentifier>{39F60708-FF48-4C22-0000-0000000000F4}</UniqueIdentifier>
174177
</Filter>
175178
<Filter Include="src">
176179
<UniqueIdentifier>{39F60708-FF48-4C22-0000-000000000000}</UniqueIdentifier>
@@ -462,9 +465,6 @@
462465
<ClCompile Include="..\..\..\..\src\stream\binary.cpp">
463466
<Filter>src\stream</Filter>
464467
</ClCompile>
465-
<ClCompile Include="..\..\..\..\src\unicode\ascii.cpp">
466-
<Filter>src\unicode</Filter>
467-
</ClCompile>
468468
<ClCompile Include="..\..\..\..\src\unicode\code_points.cpp">
469469
<Filter>src\unicode</Filter>
470470
</ClCompile>
@@ -636,6 +636,9 @@
636636
<ClCompile Include="..\..\..\..\src\words\languages.cpp">
637637
<Filter>src\words</Filter>
638638
</ClCompile>
639+
<ClCompile Include="..\..\..\..\src\unicode\ascii.cpp">
640+
<Filter>src\unicode</Filter>
641+
</ClCompile>
639642
</ItemGroup>
640643
<ItemGroup>
641644
<ClInclude Include="..\..\..\..\include\bitcoin\system.hpp">
@@ -1768,6 +1771,9 @@
17681771
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\sha256x2_writer.ipp">
17691772
<Filter>include\bitcoin\system\impl\stream\streamers</Filter>
17701773
</None>
1774+
<None Include="..\..\..\..\include\bitcoin\system\impl\unicode\ascii.ipp">
1775+
<Filter>include\bitcoin\system\impl\unicode</Filter>
1776+
</None>
17711777
<None Include="..\..\..\..\include\bitcoin\system\impl\wallet\addresses\checked.ipp">
17721778
<Filter>include\bitcoin\system\impl\wallet\addresses</Filter>
17731779
</None>
@@ -1793,4 +1799,4 @@
17931799
<Filter>resource</Filter>
17941800
</ResourceCompile>
17951801
</ItemGroup>
1796-
</Project>
1802+
</Project>
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/**
2+
* Copyright (c) 2011-2025 libbitcoin developers (see AUTHORS)
3+
*
4+
* This file is part of libbitcoin.
5+
*
6+
* This program is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU Affero General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU Affero General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Affero General Public License
17+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
18+
*/
19+
#ifndef LIBBITCOIN_SYSTEM_UNICODE_ASCII_IPP
20+
#define LIBBITCOIN_SYSTEM_UNICODE_ASCII_IPP
21+
22+
#include <algorithm>
23+
#include <iterator>
24+
#include <bitcoin/system/define.hpp>
25+
#include <bitcoin/system/math/math.hpp>
26+
27+
namespace libbitcoin {
28+
namespace system {
29+
30+
// char32_t functions.
31+
32+
constexpr bool is_ascii_character(char32_t character) NOEXCEPT
33+
{
34+
return is_zero(character & 0xffffff80);
35+
}
36+
37+
constexpr bool is_ascii_number(char32_t point) NOEXCEPT
38+
{
39+
return '0' <= point && point <= '9';
40+
}
41+
42+
constexpr bool is_ascii_lower(char32_t point) NOEXCEPT
43+
{
44+
return 'a' <= point && point <= 'z';
45+
}
46+
47+
constexpr bool is_ascii_upper(char32_t point) NOEXCEPT
48+
{
49+
return 'A' <= point && point <= 'Z';
50+
}
51+
52+
constexpr bool is_ascii_alpha(char32_t point) NOEXCEPT
53+
{
54+
return is_ascii_lower(point) || is_ascii_upper(point);
55+
}
56+
57+
// see char32_separators[]
58+
constexpr bool is_ascii_separator(char32_t point) NOEXCEPT
59+
{
60+
// space or no-break space.
61+
return point == 0x20 || point == 0xa0;
62+
}
63+
64+
// see char_whitespace[]
65+
constexpr bool is_ascii_whitespace(char32_t point) NOEXCEPT
66+
{
67+
// space or \t, \n, \v, \f, \r
68+
return point == 0x20 || point == '\t' || ('\n' <= point && point <= '\r');
69+
}
70+
71+
} // namespace system
72+
} // namespace libbitcoin
73+
74+
#endif

include/bitcoin/system/unicode/ascii.hpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@ namespace libbitcoin {
2525
namespace system {
2626

2727
/// Character tests.
28-
BC_API bool is_ascii_character(char32_t point) NOEXCEPT;
29-
BC_API bool is_ascii_number(char32_t point) NOEXCEPT;
30-
BC_API bool is_ascii_separator(char32_t point) NOEXCEPT;
31-
BC_API bool is_ascii_whitespace(char32_t point) NOEXCEPT;
28+
constexpr bool is_ascii_character(char32_t point) NOEXCEPT;
29+
constexpr bool is_ascii_number(char32_t point) NOEXCEPT;
30+
constexpr bool is_ascii_lower(char32_t point) NOEXCEPT;
31+
constexpr bool is_ascii_upper(char32_t point) NOEXCEPT;
32+
constexpr bool is_ascii_alpha(char32_t point) NOEXCEPT;
33+
constexpr bool is_ascii_separator(char32_t point) NOEXCEPT;
34+
constexpr bool is_ascii_whitespace(char32_t point) NOEXCEPT;
3235

3336
/// Convert each ASCII letter in text to lower case.
3437
BC_API std::string ascii_to_lower(const std::string& text) NOEXCEPT;
@@ -52,4 +55,6 @@ BC_API bool is_ascii_numeric(const std::string& text) NOEXCEPT;
5255
} // namespace system
5356
} // namespace libbitcoin
5457

58+
#include <bitcoin/system/impl/unicode/ascii.ipp>
59+
5560
#endif

src/unicode/ascii.cpp

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -20,36 +20,12 @@
2020

2121
#include <algorithm>
2222
#include <iterator>
23+
#include <bitcoin/system/define.hpp>
2324
#include <bitcoin/system/math/math.hpp>
24-
#include <bitcoin/system/unicode/normalization.hpp>
2525

2626
namespace libbitcoin {
2727
namespace system {
2828

29-
// TODO: move to .ipp and make constexpr/inline.
30-
31-
// char32_t functions.
32-
33-
bool is_ascii_character(char32_t character) NOEXCEPT
34-
{
35-
return is_zero(character & 0xffffff80);
36-
}
37-
38-
bool is_ascii_number(char32_t point) NOEXCEPT
39-
{
40-
return '0' <= point && point <= '9';
41-
}
42-
43-
bool is_ascii_separator(char32_t point) NOEXCEPT
44-
{
45-
return is_ascii_character(point) && is_separator(point);
46-
}
47-
48-
bool is_ascii_whitespace(char32_t point) NOEXCEPT
49-
{
50-
return is_ascii_character(point) && is_whitespace(point);
51-
}
52-
5329
// string functions.
5430

5531
bool is_ascii(const std::string& text) NOEXCEPT
@@ -69,9 +45,7 @@ bool is_ascii_numeric(const std::string& text) NOEXCEPT
6945

7046
std::string ascii_to_lower(const std::string& text) NOEXCEPT
7147
{
72-
std::string copy{ text};
73-
74-
// C++17: parallel policy for std::transform.
48+
std::string copy{ text };
7549
std::transform(text.begin(), text.end(), copy.begin(),
7650
[](char value) NOEXCEPT
7751
{
@@ -84,8 +58,6 @@ std::string ascii_to_lower(const std::string& text) NOEXCEPT
8458
std::string ascii_to_upper(const std::string& text) NOEXCEPT
8559
{
8660
std::string copy{ text };
87-
88-
// C++17: parallel policy for std::transform.
8961
std::transform(text.begin(), text.end(), copy.begin(),
9062
[](char value) NOEXCEPT
9163
{
@@ -98,7 +70,6 @@ std::string ascii_to_upper(const std::string& text) NOEXCEPT
9870

9971
bool has_ascii_whitespace(const std::string& text) NOEXCEPT
10072
{
101-
// C++17: parallel policy for std::any_of.
10273
return std::any_of(text.begin(), text.end(),
10374
[](char character) NOEXCEPT
10475
{

0 commit comments

Comments
 (0)