Skip to content

Commit e285c76

Browse files
committed
added simplecpp::View to be able to write portable code [skip ci]
1 parent d764cb2 commit e285c76

File tree

2 files changed

+65
-6
lines changed

2 files changed

+65
-6
lines changed

simplecpp.h

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
#ifndef SIMPLECPP_TOKENLIST_ALLOW_PTR
5858
// still provide the legacy API in case we lack the performant wrappers
5959
# if !defined(__cpp_lib_string_view) && !defined(__cpp_lib_span)
60-
# define SIMPLECPP_TOKENLIST_ALLOW_PTR
60+
//# define SIMPLECPP_TOKENLIST_ALLOW_PTR
6161
# endif
6262
#endif
6363

@@ -69,6 +69,40 @@ namespace simplecpp {
6969
enum cppstd_t : std::int8_t { CPPUnknown=-1, CPP03, CPP11, CPP14, CPP17, CPP20, CPP23, CPP26 };
7070

7171
using TokenString = std::string;
72+
73+
#if defined(__cpp_lib_string_view)
74+
using View = std::string_view;
75+
#else
76+
struct View
77+
{
78+
View(const char* data)
79+
: data_(data)
80+
, size_(strlen(data))
81+
{}
82+
83+
View(const char* data, std::size_t size)
84+
: data_(data)
85+
, size_(size)
86+
{}
87+
88+
View(const std::string& str)
89+
: data_(str.data())
90+
, size_(str.size())
91+
{}
92+
93+
const char* data() const {
94+
return data_;
95+
}
96+
97+
std::size_t size() const {
98+
return size_;
99+
}
100+
101+
const char* data_;
102+
std::size_t size_;
103+
};
104+
#endif
105+
72106
class Macro;
73107

74108
/**
@@ -238,9 +272,9 @@ namespace simplecpp {
238272
: TokenList(reinterpret_cast<const unsigned char*>(data), size, filenames, filename, outputList, 0)
239273
{}
240274
#endif
241-
#if defined(__cpp_lib_string_view) && !defined(__cpp_lib_span)
275+
#if !defined(__cpp_lib_span)
242276
/** generates a token list from the given buffer */
243-
TokenList(std::string_view data, std::vector<std::string> &filenames, const std::string &filename=std::string(), OutputList *outputList = nullptr)
277+
TokenList(View data, std::vector<std::string> &filenames, const std::string &filename=std::string(), OutputList *outputList = nullptr)
244278
: TokenList(reinterpret_cast<const unsigned char*>(data.data()), data.size(), filenames, filename, outputList, 0)
245279
{}
246280
#endif

test.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3299,11 +3299,36 @@ static void preprocess_files()
32993299
}
33003300
}
33013301

3302-
static void safe_api()
3302+
static void tokenlist_api()
33033303
{
3304+
std::vector<std::string> filenames;
3305+
{
3306+
char input[] = "code";
3307+
simplecpp::TokenList({input,sizeof(input)},filenames,"");
3308+
}
3309+
{
3310+
const char input[] = "code";
3311+
simplecpp::TokenList({input,sizeof(input)},filenames,"");
3312+
}
3313+
{
3314+
char input[] = "code";
3315+
simplecpp::TokenList(input,filenames,"");
3316+
}
3317+
{
3318+
const char input[] = "code";
3319+
simplecpp::TokenList(input,filenames,"");
3320+
}
3321+
{
3322+
std::string input = "code"; // NOLINT(misc-const-correctness)
3323+
simplecpp::TokenList(input,filenames,"");
3324+
}
3325+
{
3326+
const std::string input = "code";
3327+
simplecpp::TokenList(input,filenames,"");
3328+
}
3329+
33043330
// this test is to make sure the safe APIs are compiling
33053331
#if defined(__cpp_lib_string_view) || defined(__cpp_lib_span)
3306-
std::vector<std::string> filenames;
33073332
# if defined(__cpp_lib_string_view)
33083333
{
33093334
const char input[] = "code";
@@ -3660,7 +3685,7 @@ int main(int argc, char **argv)
36603685

36613686
TEST_CASE(preprocess_files);
36623687

3663-
TEST_CASE(safe_api);
3688+
TEST_CASE(tokenlist_api);
36643689

36653690
TEST_CASE(isAbsolutePath);
36663691

0 commit comments

Comments
 (0)