Skip to content

Commit 42e68a9

Browse files
authored
Merge pull request #46 from zrax/lifetimebound
Annotate functions with `[[lifetimebound]]` attribute where applicable.
2 parents 545a6d5 + 03e5e4b commit 42e68a9

10 files changed

+193
-134
lines changed

include/st_charbuffer.h

+35-27
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,13 @@ namespace ST
158158
}
159159

160160
ST_DEPRECATED_IN_3_4("Use clear() instead")
161-
buffer<char_T> &operator=(const null_t &) noexcept
161+
buffer<char_T> &operator=(const null_t &) noexcept ST_LIFETIME_BOUND
162162
{
163163
clear();
164164
return *this;
165165
}
166166

167-
buffer<char_T> &operator=(const buffer<char_T> &copy)
167+
buffer<char_T> &operator=(const buffer<char_T> &copy) ST_LIFETIME_BOUND
168168
{
169169
if (this == &copy)
170170
return *this;
@@ -186,7 +186,7 @@ namespace ST
186186
return *this;
187187
}
188188

189-
buffer<char_T> &operator=(buffer<char_T> &&move) noexcept
189+
buffer<char_T> &operator=(buffer<char_T> &&move) noexcept ST_LIFETIME_BOUND
190190
{
191191
std::swap(m_chars, move.m_chars);
192192
std::swap(m_size, move.m_size);
@@ -275,16 +275,17 @@ namespace ST
275275
}
276276

277277
ST_NODISCARD
278-
char_T *data() noexcept { return m_chars; }
278+
char_T *data() noexcept ST_LIFETIME_BOUND { return m_chars; }
279279

280280
ST_NODISCARD
281-
const char_T *data() const noexcept { return m_chars; }
281+
const char_T *data() const noexcept ST_LIFETIME_BOUND { return m_chars; }
282282

283283
ST_NODISCARD
284-
const char_T *c_str() const noexcept { return m_chars; }
284+
const char_T *c_str() const noexcept ST_LIFETIME_BOUND { return m_chars; }
285285

286286
ST_NODISCARD
287-
const char_T *c_str(const char_T *substitute) const noexcept
287+
const char_T *c_str(const char_T *substitute ST_LIFETIME_BOUND)
288+
const noexcept ST_LIFETIME_BOUND
288289
{
289290
return empty() ? substitute : m_chars;
290291
}
@@ -296,107 +297,113 @@ namespace ST
296297
bool empty() const noexcept { return m_size == 0; }
297298

298299
ST_NODISCARD
299-
char_T &at(size_t index)
300+
char_T &at(size_t index) ST_LIFETIME_BOUND
300301
{
301302
if (index >= size())
302303
throw std::out_of_range("Character index out of range");
303304
return m_chars[index];
304305
}
305306

306307
ST_NODISCARD
307-
const char_T &at(size_t index) const
308+
const char_T &at(size_t index) const ST_LIFETIME_BOUND
308309
{
309310
if (index >= size())
310311
throw std::out_of_range("Character index out of range");
311312
return m_chars[index];
312313
}
313314

314315
ST_NODISCARD
315-
char_T &operator[](size_t index) noexcept
316+
char_T &operator[](size_t index) noexcept ST_LIFETIME_BOUND
316317
{
317318
return m_chars[index];
318319
}
319320

320321
ST_NODISCARD
321-
const char_T &operator[](size_t index) const noexcept
322+
const char_T &operator[](size_t index) const noexcept ST_LIFETIME_BOUND
322323
{
323324
return m_chars[index];
324325
}
325326

326327
ST_NODISCARD
327-
char_T &front() noexcept
328+
char_T &front() noexcept ST_LIFETIME_BOUND
328329
{
329330
return m_chars[0];
330331
}
331332

332333
ST_NODISCARD
333-
const char_T &front() const noexcept
334+
const char_T &front() const noexcept ST_LIFETIME_BOUND
334335
{
335336
return m_chars[0];
336337
}
337338

338339
ST_NODISCARD
339-
char_T &back() noexcept
340+
char_T &back() noexcept ST_LIFETIME_BOUND
340341
{
341342
return empty() ? m_chars[0] : m_chars[m_size - 1];
342343
}
343344

344345
ST_NODISCARD
345-
const char_T &back() const noexcept
346+
const char_T &back() const noexcept ST_LIFETIME_BOUND
346347
{
347348
return empty() ? m_chars[0] : m_chars[m_size - 1];
348349
}
349350

350351
ST_NODISCARD
351-
iterator begin() noexcept { return m_chars; }
352+
iterator begin() noexcept ST_LIFETIME_BOUND { return m_chars; }
352353

353354
ST_NODISCARD
354-
const_iterator begin() const noexcept { return m_chars; }
355+
const_iterator begin() const noexcept ST_LIFETIME_BOUND { return m_chars; }
355356

356357
ST_NODISCARD
357-
const_iterator cbegin() const noexcept { return m_chars; }
358+
const_iterator cbegin() const noexcept ST_LIFETIME_BOUND { return m_chars; }
358359

359360
ST_NODISCARD
360-
iterator end() noexcept { return m_chars + m_size; }
361+
iterator end() noexcept ST_LIFETIME_BOUND { return m_chars + m_size; }
361362

362363
ST_NODISCARD
363-
const_iterator end() const noexcept { return m_chars + m_size; }
364+
const_iterator end() const noexcept ST_LIFETIME_BOUND
365+
{
366+
return m_chars + m_size;
367+
}
364368

365369
ST_NODISCARD
366-
const_iterator cend() const noexcept { return m_chars + m_size; }
370+
const_iterator cend() const noexcept ST_LIFETIME_BOUND
371+
{
372+
return m_chars + m_size;
373+
}
367374

368375
ST_NODISCARD
369-
reverse_iterator rbegin() noexcept
376+
reverse_iterator rbegin() noexcept ST_LIFETIME_BOUND
370377
{
371378
return reverse_iterator(end());
372379
}
373380

374381
ST_NODISCARD
375-
const_reverse_iterator rbegin() const noexcept
382+
const_reverse_iterator rbegin() const noexcept ST_LIFETIME_BOUND
376383
{
377384
return const_reverse_iterator(end());
378385
}
379386

380387
ST_NODISCARD
381-
const_reverse_iterator crbegin() const noexcept
388+
const_reverse_iterator crbegin() const noexcept ST_LIFETIME_BOUND
382389
{
383390
return const_reverse_iterator(cend());
384391
}
385392

386393
ST_NODISCARD
387-
reverse_iterator rend() noexcept
394+
reverse_iterator rend() noexcept ST_LIFETIME_BOUND
388395
{
389396
return reverse_iterator(begin());
390397
}
391398

392399
ST_NODISCARD
393-
const_reverse_iterator rend() const noexcept
400+
const_reverse_iterator rend() const noexcept ST_LIFETIME_BOUND
394401
{
395402
return const_reverse_iterator(begin());
396403
}
397404

398405
ST_NODISCARD
399-
const_reverse_iterator crend() const noexcept
406+
const_reverse_iterator crend() const noexcept ST_LIFETIME_BOUND
400407
{
401408
return const_reverse_iterator(cbegin());
402409
}
@@ -437,6 +444,7 @@ namespace ST
437444
ST_NODISCARD
438445
std::basic_string_view<char_T> view(size_t start = 0,
439446
size_t length = ST_AUTO_SIZE) const &
447+
ST_LIFETIME_BOUND
440448
{
441449
if (length == ST_AUTO_SIZE)
442450
length = size() - start;

include/st_config.h.in

+12
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,18 @@
104104
# define ST_NODISCARD
105105
#endif
106106

107+
#ifndef __has_cpp_attribute
108+
# define ST_LIFETIME_BOUND
109+
#elif __has_cpp_attribute(msvc::lifetimebound)
110+
# define ST_LIFETIME_BOUND [[msvc::lifetimebound]]
111+
#elif __has_cpp_attribute(clang::lifetimebound)
112+
# define ST_LIFETIME_BOUND [[clang::lifetimebound]]
113+
#elif __has_cpp_attribute(lifetimebound)
114+
# define ST_LIFETIME_BOUND [[lifetimebound]]
115+
#else
116+
# define ST_LIFETIME_BOUND
117+
#endif
118+
107119
#define ST_MAX_SSO_LENGTH (16)
108120
#define ST_MAX_SSO_SIZE (48)
109121
#define ST_STACK_STRING_SIZE (256)

include/st_format.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@ namespace _ST_PRIVATE
3232
explicit string_format_writer(const char *format_str)
3333
: ST::format_writer(format_str) { }
3434

35-
string_format_writer &append(const char *data, size_t size) override
35+
string_format_writer &append(const char *data, size_t size)
36+
ST_LIFETIME_BOUND override
3637
{
3738
m_output.append(data, size);
3839
return *this;
3940
}
4041

41-
string_format_writer &append_char(char ch, size_t count = 1) override
42+
string_format_writer &append_char(char ch, size_t count = 1)
43+
ST_LIFETIME_BOUND override
4244
{
4345
m_output.append_char(ch, count);
4446
return *this;

include/st_format_numeric.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ namespace ST
7474
}
7575

7676
ST_NODISCARD
77-
const char *text() const noexcept { return m_start; }
77+
const char *text() const noexcept ST_LIFETIME_BOUND { return m_start; }
7878

7979
ST_NODISCARD
8080
size_t size() const noexcept
@@ -106,7 +106,7 @@ namespace ST
106106
}
107107

108108
ST_NODISCARD
109-
const char *text() const noexcept { return m_buffer; }
109+
const char *text() const noexcept ST_LIFETIME_BOUND { return m_buffer; }
110110

111111
ST_NODISCARD
112112
size_t size() const noexcept { return m_size; }

include/st_formatter.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,15 @@ namespace ST
107107
format_writer& operator=(const format_writer&) = delete;
108108

109109
format_writer(format_writer&&) = default;
110-
format_writer& operator=(format_writer&&) = default;
110+
format_writer& operator=(format_writer&&) ST_LIFETIME_BOUND = default;
111111

112112
virtual ~format_writer() noexcept { }
113113

114-
virtual format_writer &append(const char *data, size_t size) = 0;
115-
virtual format_writer &append_char(char ch, size_t count = 1) = 0;
114+
virtual format_writer &append(const char *data, size_t size) ST_LIFETIME_BOUND = 0;
115+
virtual format_writer &append_char(char ch, size_t count = 1) ST_LIFETIME_BOUND = 0;
116116

117117
template <size_t size>
118-
format_writer &append(const char (&literal)[size])
118+
format_writer &append(const char (&literal)[size]) ST_LIFETIME_BOUND
119119
{
120120
return append(literal, size - 1);
121121
}

include/st_iostream.h

+8-4
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,15 @@ namespace _ST_PRIVATE
6868
m_stream.write(utf32.data(), utf32.size());
6969
}
7070

71-
ostream_format_writer &append(const char *data, size_t size) override
71+
ostream_format_writer &append(const char *data, size_t size)
72+
ST_LIFETIME_BOUND override
7273
{
7374
write_data<char_T>(data, size);
7475
return *this;
7576
}
7677

77-
ostream_format_writer &append_char(char ch, size_t count = 1) override
78+
ostream_format_writer &append_char(char ch, size_t count = 1)
79+
ST_LIFETIME_BOUND override
7880
{
7981
while (count) {
8082
m_stream.put(char_T(ch));
@@ -101,7 +103,8 @@ namespace ST
101103

102104
template <class char_T, class traits_T>
103105
std::basic_ostream<char_T, traits_T> &operator<<(
104-
std::basic_ostream<char_T, traits_T> &stream, const ST::string &str)
106+
std::basic_ostream<char_T, traits_T> &stream ST_LIFETIME_BOUND,
107+
const ST::string &str)
105108
{
106109
ST::buffer<char_T> buffer;
107110
str.to_buffer(buffer);
@@ -110,7 +113,8 @@ std::basic_ostream<char_T, traits_T> &operator<<(
110113

111114
template <class char_T, class traits_T>
112115
std::basic_istream<char_T, traits_T> &operator>>(
113-
std::basic_istream<char_T, traits_T> &stream, ST::string &str)
116+
std::basic_istream<char_T, traits_T> &stream ST_LIFETIME_BOUND,
117+
ST::string &str)
114118
{
115119
std::basic_string<char_T, traits_T> stl_string;
116120
stream >> stl_string;

include/st_stdio.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ namespace _ST_PRIVATE
3131
stdio_format_writer(const char *format_str, FILE *stream)
3232
: ST::format_writer(format_str), m_stream(stream) { }
3333

34-
stdio_format_writer &append(const char *data, size_t size) override
34+
stdio_format_writer &append(const char *data, size_t size)
35+
ST_LIFETIME_BOUND override
3536
{
3637
(void)fwrite(data, sizeof(char), size, m_stream);
3738
return *this;
3839
}
3940

40-
stdio_format_writer &append_char(char ch, size_t count = 1) override
41+
stdio_format_writer &append_char(char ch, size_t count = 1)
42+
ST_LIFETIME_BOUND override
4143
{
4244
while (count) {
4345
fputc(ch, m_stream);

0 commit comments

Comments
 (0)